Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.
El objetivo de esta lab es que el alumno se familiarice con los conceptos diferentes aspectos del machine learning, no directamente relacionados con los algoritmos, utilización del módulo Sklearn.
Uno de los modelos de aprendizaje estadístico más simples, aunque no por ello menos potente, es el modelo de Regresión Lineal.
Como se ha visto en clase de teoría, cuando utilizamos modelos de regresión lineal se asume que el valor de la señal que queremos estimas (predecir), que se conoce como variable respuestas u objetivo, es una combinación lineal de las variables de entrada, también conocidas como variables explicativas. En este caso, el objetivo planteado como un problema de estimación es obtener el valor de los coeficientes que multiplican a las variables explicativas, $w_i$. En notación matemática:
$$\hat{y}= w_0 + w_1 x_1 + ... + w_p x_p = \mathbf{w^{T}x}$$Nomenclatura: los coeficientes $w_i$ se conocen también como pesos; es común que al coeficiencte $w_0$ se le llame bias.
En regresión lineal se eligen los coeficientes $\mathbf{w}$ de forma que se minimice el error cuadrático, es decir que el error entre el valor real de $y$ y el proporcionado por nuestro modelo $\hat{y} = \mathbf{w^{T}x}$ sea el menor posible, para todos los valores. Es decir buscamos resolver el siguiente problema de minimización:
$$\underset{w}{min\,} {\left|\left| X w - y\right|\right|_2^2}$$A este problema de minimización se le puede imponer la siguiente restricción.
$$\underset{w}{min\,} {\left|\left| X w - y\right|\right|_2^2} + \lambda \|w\|_1$$Esta restricción, dependiendo del valor de $\lambda$ hace que muchos coeficientes del vector $ w$ se hagan cero.
En esta práctica vamos a utilizar la base de datos de los precios de casas en Bostón. Podéis encontrar toda la información en el repositorio de Bases de Datos para Machine Learning UCI-Boston
En la siguiente lista se proporciona la información de las características que se tiene por cada casa.
Attribute Information:
In [9]:
#read data using pandas
import pandas as pd
import numpy as np
boston_df = pd.read_csv('boston.csv')
#verify whether ther exisits NaN
print np.sum(boston_df.isnull())
boston_df
Out[9]:
In [3]:
boston_df.describe()
Out[3]:
In [10]:
#get names
x_var_names = list(boston_df)[:-1]
print x_var_names
y_var_names = list(boston_df)[-1]
print y_var_names
#get matrix X and vector y
X = boston_df[x_var_names]
y = boston_df[y_var_names]
#some easy checks
print X.shape
print y.shape
#split
import numpy as np
import sklearn
print sklearn.__version__
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print sum(y)
print len(y)
print X_train.shape
print X_test.shape
In [11]:
from sklearn import linear_model
#build the model
rl_model = linear_model.LinearRegression()
#fit the model
rl_model.fit(X_train,y_train)
#Before we test, let's explore the model
coefs = [rl_model.intercept_]
coefs.extend(list(rl_model.coef_))
labels = ['bias']
labels.extend(x_var_names)
"----"
for n,c in zip(labels,coefs):
print
print n,str(round(c,3))
print "---------------"
Ahora sí. Selección de características, usar L1 y SelectFromModel
In [16]:
from sklearn.linear_model import LassoCV
from sklearn.feature_selection import SelectFromModel
#Hay que elegir un hiperparametro que será lambda
print X_train.shape
lscv = LassoCV() #Hará cross validation por dentro
lscv.fit(X_train, y_train) #Por defecto hay 100 lambdas, ejeY = MSE, ejeX = lambda. Se elige una lambda que me de el minimo
# punto de la curva.
models = SelectFromModel(lscv, prefit = True) #Extrae las caracteristicas mejores para el modelo que le pase
#En este caso es LassoCV
X_new = models.transform(X_train)
print X_new.shape
print lscv.coef_
coefs = lscv.coef_
labels = ['bias']
labels.extend(x_var_names)
"----"
for n,c in zip(labels,coefs):
print
print n,str(round(c,3))
print "---------------"
In [ ]:
In [ ]:
In [ ]:
In [ ]: