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 			# trabajo con arrays
import matplotlib.pyplot as plt 	# para hacer gráficos
import pandas as pd 			# importar los datasets, la matriz de características y el vector de variable dependiente

Importing the dataset

Si el dataset tiene esta forma

Authentication

dataset = pd.read_csv('Data.csv') # cargo el dataset X = dataset.iloc[:, :-1].values # pongo en la variable X todas todas las filas de todas las columnas menos la última porque en ella está la variable dependiente y = dataset.iloc[:, -1].values # todas las filas de la ultima columna 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

Si tenemos muchos datos podemos borrar las filas en las que faltan datos.
Podemos rellenar los huecos con valores como la media, mediana (el valor en posicion central), moda (valor mas frecuente), etc.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')		# np.nan solo trabajamos con celdas vacias
									# mean = media							
imputer.fit(X[:, 1:3])							# calcula la media de las columnas 1 y 2. O sea age y salary
X[:, 1:3] = imputer.transform(X[:, 1:3])				# pone los valores en las celdas vacias y luego sustituye todos los datos


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

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')	# OneHotEncoder es el tipo de codificacion
													# passthrough es que no toca las columnas no afectadas
													# [0] es la primera columna
X = np.array(ct.fit_transform(X))

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

from sklearn.preprocessing import LabelEncoder le = LabelEncoder() y = le.fit_transform(y) 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
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 1)	#0.2 dedico el 20% a test

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

No se aplica a todos los modelos. Lo que hace es convertir valores numericos a un rango similar

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
sc = StandardScaler()					# aplico la estandarizacion
X_train[:,3:] = sc.fit_transform(X_train[:,3:])		# de la tercera columna al final ya que 3 columna tiene valores de 38.7 y la cuarta de 52000
X_test[:,3:] = sc.transform(X_test[:,3:])

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]]