Home | José Ramón López | AutoSys | Webs de interés | perl | kubernetes | azure | machine learning
Multiple linear regression es una ecuacion de primer grado con varias variables. Linear regressions
y = b0 + b1 x x1 + b2 x x2 + ... + bn + xn
Este modelo funciona si 1.- hay una relaciÃn lineal entre las variables 2.- no tiene forma de cono la salida 3.- es una distribucion normal, no se aleja del modelo 4.- es independiente 5.- no tiene colinearidad 6.- se puden eliminar los outliers si se necesita
Las variables categoricas, de texto, se convierten a numero en general con el modelo OneHotEncoder que pone tantas variables como valores distintos tengamos. Hay que tener en cuenta que para evitar colinearidad hay que eliminar una columna. La clase que vamos a usar lo hace automaticamente pero sino lo hiciera habria que hacerlo a mano
P-value es el valor de la probabilidad La significancia (sobre el 5% en general) es limite apartir del que P-value es 5%
Podemos llegar a tener una gran cantidad de features por lo que hay que averiguar cuales son mas importantes y cuales no aportan nada Hay varios metodos 1.- all in 2.- backward elimination 3.- forward selection 4.- bidirectional elimination 5.- score compasion
Usamos todas las caracteristicas porque ya sabemos de experiencias previas que todas son importantes
Consiste en eliminar una a una las caracteristicas menos importantes 1.- elijo un SL, significance level para permanecer en el modelo 2.- calculo (fit) con las variables restantes 3.- busco la variable con mayor P-Value. Si esta por encima de SL, la elimino y repito el proceso (paso 2) si esta por debajo del SL continuo 4.- hecho
Consiste en empezar con una caracteristica e ir anadiendo caracteristica a caracteristica 1.- elijo un SL para permanecer en el modelo 2.- calculo el modelo para todas las variables pero con una sola variable cada vez y selecciono la feature con mejor performance 3.- calculo el modelo para la feature anterior y cada una de las features restantes y me quedo con la quede mejor performance 4.- repito el proceso hasta que esté por debajo del SL
Consiste en hacer a la vez el forward selection y el backward elimination 1.- elijo un SL para permanecer y otro para salir 2.- hago un paso del forward 3.- hago un paso del forward y tengo otra caracteristicas 4.- hago un paso del backward elimination 5.- continua hasta que no haya mas caracteristicas que poner o quitar
1.- elijo un criterio como akike 2.- hago todos los modelos posible 3.- elijo el mejor modelo
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
dataset = pd.read_csv('50_Startups.csv') X = dataset.iloc[:, :-1].values y = dataset.iloc[:, -1].values print(X) [[165349.2 136897.8 471784.1 'New York'] [162597.7 151377.59 443898.53 'California'] [153441.51 101145.55 407934.54 'Florida'] [144372.41 118671.85 383199.62 'New York'] [142107.34 91391.77 366168.42 'Florida'] [131876.9 99814.71 362861.36 'New York'] [134615.46 147198.87 127716.82 'California'] [130298.13 145530.06 323876.68 'Florida'] [120542.52 148718.95 311613.29 'New York'] [123334.88 108679.17 304981.62 'California'] [101913.08 110594.11 229160.95 'Florida'] [100671.96 91790.61 249744.55 'California'] [93863.75 127320.38 249839.44 'Florida'] [91992.39 135495.07 252664.93 'California'] [119943.24 156547.42 256512.92 'Florida'] [114523.61 122616.84 261776.23 'New York'] [78013.11 121597.55 264346.06 'California'] [94657.16 145077.58 282574.31 'New York'] [91749.16 114175.79 294919.57 'Florida'] [86419.7 153514.11 0.0 'New York'] [76253.86 113867.3 298664.47 'California'] [78389.47 153773.43 299737.29 'New York'] [73994.56 122782.75 303319.26 'Florida'] [67532.53 105751.03 304768.73 'Florida'] [77044.01 99281.34 140574.81 'New York'] [64664.71 139553.16 137962.62 'California'] [75328.87 144135.98 134050.07 'Florida'] [72107.6 127864.55 353183.81 'New York'] [66051.52 182645.56 118148.2 'Florida'] [65605.48 153032.06 107138.38 'New York'] [61994.48 115641.28 91131.24 'Florida'] [61136.38 152701.92 88218.23 'New York'] [63408.86 129219.61 46085.25 'California'] [55493.95 103057.49 214634.81 'Florida'] [46426.07 157693.92 210797.67 'California'] [46014.02 85047.44 205517.64 'New York'] [28663.76 127056.21 201126.82 'Florida'] [44069.95 51283.14 197029.42 'California'] [20229.59 65947.93 185265.1 'New York'] [38558.51 82982.09 174999.3 'California'] [28754.33 118546.05 172795.67 'California'] [27892.92 84710.77 164470.71 'Florida'] [23640.93 96189.63 148001.11 'California'] [15505.73 127382.3 35534.17 'New York'] [22177.74 154806.14 28334.72 'California'] [1000.23 124153.04 1903.93 'New York'] [1315.46 115816.21 297114.46 'Florida'] [0.0 135426.92 0.0 'California'] [542.05 51743.15 0.0 'New York'] [0.0 116983.8 45173.06 'California']] X = dataset.iloc[:, :-1].values # pongo en el panda dataset X todas las filas de todas las columnas menos la última porque en ella está la variable dependiente y = dataset.iloc[:, -1].values # pongo en el panda dataset y todas las filas de la ultima columna
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [3])], remainder='passthrough') # 3 es el indice de la columna X = np.array(ct.fit_transform(X)) print(X) # vemos que las nuevas columnas quedan al principio # en este caso no quito una columna dummy porque ya lo tiene en cuenta el modelo que voy a usar Encoding categorical data [[0.0 0.0 1.0 165349.2 136897.8 471784.1] [1.0 0.0 0.0 162597.7 151377.59 443898.53] [0.0 1.0 0.0 153441.51 101145.55 407934.54] [0.0 0.0 1.0 144372.41 118671.85 383199.62] [0.0 1.0 0.0 142107.34 91391.77 366168.42] [0.0 0.0 1.0 131876.9 99814.71 362861.36] [1.0 0.0 0.0 134615.46 147198.87 127716.82] [0.0 1.0 0.0 130298.13 145530.06 323876.68] [0.0 0.0 1.0 120542.52 148718.95 311613.29] [1.0 0.0 0.0 123334.88 108679.17 304981.62] [0.0 1.0 0.0 101913.08 110594.11 229160.95] [1.0 0.0 0.0 100671.96 91790.61 249744.55] [0.0 1.0 0.0 93863.75 127320.38 249839.44] [1.0 0.0 0.0 91992.39 135495.07 252664.93] [0.0 1.0 0.0 119943.24 156547.42 256512.92] [0.0 0.0 1.0 114523.61 122616.84 261776.23] [1.0 0.0 0.0 78013.11 121597.55 264346.06] [0.0 0.0 1.0 94657.16 145077.58 282574.31] [0.0 1.0 0.0 91749.16 114175.79 294919.57] [0.0 0.0 1.0 86419.7 153514.11 0.0] [1.0 0.0 0.0 76253.86 113867.3 298664.47] [0.0 0.0 1.0 78389.47 153773.43 299737.29] [0.0 1.0 0.0 73994.56 122782.75 303319.26] [0.0 1.0 0.0 67532.53 105751.03 304768.73] [0.0 0.0 1.0 77044.01 99281.34 140574.81] [1.0 0.0 0.0 64664.71 139553.16 137962.62] [0.0 1.0 0.0 75328.87 144135.98 134050.07] [0.0 0.0 1.0 72107.6 127864.55 353183.81] [0.0 1.0 0.0 66051.52 182645.56 118148.2] [0.0 0.0 1.0 65605.48 153032.06 107138.38] [0.0 1.0 0.0 61994.48 115641.28 91131.24] [0.0 0.0 1.0 61136.38 152701.92 88218.23] [1.0 0.0 0.0 63408.86 129219.61 46085.25] [0.0 1.0 0.0 55493.95 103057.49 214634.81] [1.0 0.0 0.0 46426.07 157693.92 210797.67] [0.0 0.0 1.0 46014.02 85047.44 205517.64] [0.0 1.0 0.0 28663.76 127056.21 201126.82] [1.0 0.0 0.0 44069.95 51283.14 197029.42] [0.0 0.0 1.0 20229.59 65947.93 185265.1] [1.0 0.0 0.0 38558.51 82982.09 174999.3] [1.0 0.0 0.0 28754.33 118546.05 172795.67] [0.0 1.0 0.0 27892.92 84710.77 164470.71] [1.0 0.0 0.0 23640.93 96189.63 148001.11] [0.0 0.0 1.0 15505.73 127382.3 35534.17] [1.0 0.0 0.0 22177.74 154806.14 28334.72] [0.0 0.0 1.0 1000.23 124153.04 1903.93] [0.0 1.0 0.0 1315.46 115816.21 297114.46] [1.0 0.0 0.0 0.0 135426.92 0.0] [0.0 0.0 1.0 542.05 51743.15 0.0] [1.0 0.0 0.0 0.0 116983.8 45173.06]]
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 = 0) #0.2 dedico el 20% a test
from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test) np.set_printoptions(precision=2) print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1)) # el ultimo 1 siginigica que la concatenación es vertical [[103015.2 103282.38] [132582.28 144259.4 ] [132447.74 146121.95] [ 71976.1 77798.83] [178537.48 191050.39] [116161.24 105008.31] [ 67851.69 81229.06] [ 98791.73 97483.56] [113969.44 110352.25] [167921.07 166187.94]]