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