Home | José Ramón López | AutoSys | Webs de interés | perl | kubernetes | azure | machine learning


Data preprocessing

Importing the libraries

import numpy as np              # importo la librería numpy bajo el alias np
import matplotlib.pyplot as plt # importo el módulo pyplot de la librería matplotlib bajo el alias plt
import pandas as pd             # para trabajar con datasets importo la librería panda bajo el alias pd

Importing the dataset

dataset = pd.read_csv('Data.csv') # cargo el dataset
print(dataset)
   Country   Age   Salary Purchased
0   France  44.0  72000.0        No
1    Spain  27.0  48000.0       Yes
2  Germany  30.0  54000.0        No
3    Spain  38.0  61000.0        No
4  Germany  40.0      NaN       Yes
5   France  35.0  58000.0       Yes
6    Spain   NaN  52000.0        No
7   France  48.0  79000.0       Yes
8  Germany  50.0  83000.0        No
9   France  37.0  67000.0       Yes



Divido mi dataset en variables idependientes (columnas 0:2) y dependientes (columna 3)

X = dataset.iloc[:, :-1].values # creo un panda dataframe, X a partir de dataset # iloc sirve para seleccionar las filasy columnas que quiero [filaInicial:filaFinal, columnaInicial,columnaFilan] # [:, :-1] todas las filas y todas las columnas menos la última # values convierte el panda datraframe a un array de tipo numpy y = dataset.iloc[:, -1].values # en y pongo la variable dependiente print(X) [['France' 44.0 72000.0] ['Spain' 27.0 48000.0] ['Germany' 30.0 54000.0] ['Spain' 38.0 61000.0] ['Germany' 40.0 nan] ['France' 35.0 58000.0] ['Spain' nan 52000.0] ['France' 48.0 79000.0] ['Germany' 50.0 83000.0] ['France' 37.0 67000.0]] print(Y) ['No' 'Yes' 'No' 'No' 'Yes' 'Yes' 'No' 'Yes' 'No' 'Yes']

Taken care of missing data

En el array X veo que faltan datos (nan). Voy a añadir los datos, en este caso con la media aritméti

from sklearn.impute import SimpleImputer                        # importo la clase SimpleImputer del módulo impute de la librería sklearn
imputer = SimpleImputer(missing_values=np.nan, strategy='mean') # Creo un objeto de la clase SimpleImputer para reemplazar los datos que pone nan con la media aritmética
imputer.fit(X[:, 1:3])                                          # fit es el proceso de aprender o en nuestro caso de hacer la media
                                                                  # [:,1:3] significa todas las filas desde la primera columna hasta la tercera, no incluida, o sea las columnas 1 y 2
X[:, 1:3] = imputer.transform(X[:, 1:3])                        # reemplazo los valores nan por su media

print(X)
[['France' 44.0 72000.0]
 ['Spain' 27.0 48000.0]
 ['Germany' 30.0 54000.0]
 ['Spain' 38.0 61000.0]
 ['Germany' 40.0 63777.77777777778]
 ['France' 35.0 58000.0]
 ['Spain' 38.77777777777778 52000.0]
 ['France' 48.0 79000.0]
 ['Germany' 50.0 83000.0]
 ['France' 37.0 67000.0]]

Encoding categorical data

En este paso convierte strings en numermos. Por ejemplo, tenemos paises y los convertimos en 3 columnas, una para cada pais (OneHotEncoder)

Encoding the Independent Variable

Convierto las columnas que tienen texto en números, en este caso con la clase OneHotEncoder que crea tantas columnas como valores distintos tengamos, en este caso 3 (France, Spain, Germany) y el valor es 0 o 1

from sklearn.compose import ColumnTransformer                                                     #  importo la clase ColumnTransformer del módulo compose de la librería sklearn
from sklearn.preprocessing import OneHotEncoder                                                   # importo la clase OneHotEncoder del módulo preprocessing de la librería sklearn
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough') # Creo un objeto de codificación para las columnas con OneHotEncoder
                                                                                                    # mas concretamente la columna 0
X = np.array(ct.fit_transform(X))
                                                                                                  # fit = hago laacción
                                                                                                  # transform = aplico la acción


print(X)
[[1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [0.0 1.0 0.0 30.0 54000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 35.0 58000.0]
 [0.0 0.0 1.0 38.77777777777778 52000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 37.0 67000.0]]

Encoding the Dependent Variable

Como mi variable dependiente era No o Yes, también la convierto a 1/0
Ente caso uso LaberEncoder y no ColumnTransformer LabelEncoder se suele usar en variables dependientes y convirte un string en un número. ColumnTransformer crea columnas nuevas con "switch" para cada valor.

from sklearn.preprocessing import LabelEncoder # importo la clase LabelEncoder del módulo preprocessing de la librería sklearn
le = LabelEncoder()                            # instancio la clase
y = le.fit_transform(y)                        # fit (proceso) y transform (aplico) la transformación

print(y)
[0 1 0 0 1 1 0 1 0 1]

Splitting the dataset into the Training set and Test set

Se suelen crear 4 datasets
- X_train 80% para entrenar el modelo
- Y_train las respuestas de X_train
- X_test 20% para comprobar el modelo
- Y_test las respuestas del modelo


from sklearn.model_selection import train_test_split                                           # importo la clase train_test_split del módulo model_selection de la librería sklearn
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 1)
                                                                                               # test_size: es el porcentaje de datos para el dataset de comprobación
                                                                                               # random_state es la semilla para inicializar el algoritmo que de forma aleatoria separa los datos
                                                                                                 ## cualquier valor separará los datasets siempre de la misma forma
                                                                                                 ## None cada vez que se ejecute separará los datos de una forma distinta

print(X_train)
[[0.0 0.0 1.0 38.77777777777778 52000.0]
 [0.0 1.0 0.0 40.0 63777.77777777778]
 [1.0 0.0 0.0 44.0 72000.0]
 [0.0 0.0 1.0 38.0 61000.0]
 [0.0 0.0 1.0 27.0 48000.0]
 [1.0 0.0 0.0 48.0 79000.0]
 [0.0 1.0 0.0 50.0 83000.0]
 [1.0 0.0 0.0 35.0 58000.0]]

print(X_test)
[[0.0 1.0 0.0 30.0 54000.0]
 [1.0 0.0 0.0 37.0 67000.0]]

print(y_train)
[0 1 0 0 1 1 0 1]

print(y_test)
[0 1]

Feature scaling

Si los datos se diferencian en ordenes de magnitus puede ser bueno escalarlos para que no haya tanta diferencia

Standarizacion. Vale para todos los modelos y el rango esta entre -3 y 3 aprox
Normalizacion. Vale para valores con la curva normal y el rango esta entre 0 y 1


from sklearn.preprocessing import StandardScaler # importo la clase StandardScaler del módulo preprocessing de la librería sklearn
sc = StandardScaler()                            # instancio la clase
X_train[:,3:] = sc.fit_transform(X_train[:,3:])  # entreno la clase para que aplique a todas las filas y a partir de la tercera columna
X_test[:,3:] = sc.transform(X_test[:,3:])        # aplico el entranamiento


print(X_train)
[[0.0 0.0 1.0 -0.19159184384578545 -1.0781259408412425]
 [0.0 1.0 0.0 -0.014117293757057777 -0.07013167641635372]
 [1.0 0.0 0.0 0.566708506533324 0.633562432710455]
 [0.0 0.0 1.0 -0.30453019390224867 -0.30786617274297867]
 [0.0 0.0 1.0 -1.9018011447007988 -1.420463615551582]
 [1.0 0.0 0.0 1.1475343068237058 1.232653363453549]
 [0.0 1.0 0.0 1.4379472069688968 1.5749910381638885]
 [1.0 0.0 0.0 -0.7401495441200351 -0.5646194287757332]]

print(X_test)
[[0.0 1.0 0.0 -1.4661817944830127 -0.9069571034860731]
 [1.0 0.0 0.0 -0.44973664397484425 0.20564033932253029]]