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