Home | José Ramón López | AutoSys | Webs de interés | perl | kubernetes | azure | machine learning
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
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']
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]]
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]]
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]
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]
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]]