Machine Learning

Authors

Óscar Barquero Pérez (oscar.barquero@urjc.es), Carlos Figuera Pozuelo (carlos.figuera@urjc.es) y Rebeca Goya Esteban (rebeca.goyaesteban@urjc.es)

27 de marzo de 2016


Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.

1 Introducción a la práctica

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.

2 Selección de características usando L1

2.1 Regresión Lineal

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 la documentación de sklearn se muestra un ejemplo de cómo realizar la selección de características utilizando penalización L1.

Ejercicio 1

Realizar selección de características en el problema de estimar el precio de las casas en Bostón, mediante regresión lineal.

Base de datos de regresión

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:

  1. CRIM: per capita crime rate by town
  2. ZN: proportion of residential land zoned for lots over 25,000 sq.ft.
  3. INDUS: proportion of non-retail business acres per town
  4. CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
  5. NOX: nitric oxides concentration (parts per 10 million)
  6. RM: average number of rooms per dwelling
  7. AGE: proportion of owner-occupied units built prior to 1940
  8. DIS: weighted distances to five Boston employment centres
  9. RAD: index of accessibility to radial highways
  10. TAX: full-value property-tax rate per $10,000
  11. PTRATIO: pupil-teacher ratio by town
  12. B: 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
  13. LSTAT: % lower status of the population

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


CRIM       0
ZN         0
INDUS      0
CHAS       0
NOX        0
RM         0
AGE        0
DIS        0
RAD        0
TAX        0
PTRATIO    0
B          0
LSTAT      0
PRICE      0
dtype: int64
Out[9]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT PRICE
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 36.2
5 0.02985 0.0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21 28.7
6 0.08829 12.5 7.87 0 0.524 6.012 66.6 5.5605 5 311 15.2 395.60 12.43 22.9
7 0.14455 12.5 7.87 0 0.524 6.172 96.1 5.9505 5 311 15.2 396.90 19.15 27.1
8 0.21124 12.5 7.87 0 0.524 5.631 100.0 6.0821 5 311 15.2 386.63 29.93 16.5
9 0.17004 12.5 7.87 0 0.524 6.004 85.9 6.5921 5 311 15.2 386.71 17.10 18.9
10 0.22489 12.5 7.87 0 0.524 6.377 94.3 6.3467 5 311 15.2 392.52 20.45 15.0
11 0.11747 12.5 7.87 0 0.524 6.009 82.9 6.2267 5 311 15.2 396.90 13.27 18.9
12 0.09378 12.5 7.87 0 0.524 5.889 39.0 5.4509 5 311 15.2 390.50 15.71 21.7
13 0.62976 0.0 8.14 0 0.538 5.949 61.8 4.7075 4 307 21.0 396.90 8.26 20.4
14 0.63796 0.0 8.14 0 0.538 6.096 84.5 4.4619 4 307 21.0 380.02 10.26 18.2
15 0.62739 0.0 8.14 0 0.538 5.834 56.5 4.4986 4 307 21.0 395.62 8.47 19.9
16 1.05393 0.0 8.14 0 0.538 5.935 29.3 4.4986 4 307 21.0 386.85 6.58 23.1
17 0.78420 0.0 8.14 0 0.538 5.990 81.7 4.2579 4 307 21.0 386.75 14.67 17.5
18 0.80271 0.0 8.14 0 0.538 5.456 36.6 3.7965 4 307 21.0 288.99 11.69 20.2
19 0.72580 0.0 8.14 0 0.538 5.727 69.5 3.7965 4 307 21.0 390.95 11.28 18.2
20 1.25179 0.0 8.14 0 0.538 5.570 98.1 3.7979 4 307 21.0 376.57 21.02 13.6
21 0.85204 0.0 8.14 0 0.538 5.965 89.2 4.0123 4 307 21.0 392.53 13.83 19.6
22 1.23247 0.0 8.14 0 0.538 6.142 91.7 3.9769 4 307 21.0 396.90 18.72 15.2
23 0.98843 0.0 8.14 0 0.538 5.813 100.0 4.0952 4 307 21.0 394.54 19.88 14.5
24 0.75026 0.0 8.14 0 0.538 5.924 94.1 4.3996 4 307 21.0 394.33 16.30 15.6
25 0.84054 0.0 8.14 0 0.538 5.599 85.7 4.4546 4 307 21.0 303.42 16.51 13.9
26 0.67191 0.0 8.14 0 0.538 5.813 90.3 4.6820 4 307 21.0 376.88 14.81 16.6
27 0.95577 0.0 8.14 0 0.538 6.047 88.8 4.4534 4 307 21.0 306.38 17.28 14.8
28 0.77299 0.0 8.14 0 0.538 6.495 94.4 4.4547 4 307 21.0 387.94 12.80 18.4
29 1.00245 0.0 8.14 0 0.538 6.674 87.3 4.2390 4 307 21.0 380.23 11.98 21.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
476 4.87141 0.0 18.10 0 0.614 6.484 93.6 2.3053 24 666 20.2 396.21 18.68 16.7
477 15.02340 0.0 18.10 0 0.614 5.304 97.3 2.1007 24 666 20.2 349.48 24.91 12.0
478 10.23300 0.0 18.10 0 0.614 6.185 96.7 2.1705 24 666 20.2 379.70 18.03 14.6
479 14.33370 0.0 18.10 0 0.614 6.229 88.0 1.9512 24 666 20.2 383.32 13.11 21.4
480 5.82401 0.0 18.10 0 0.532 6.242 64.7 3.4242 24 666 20.2 396.90 10.74 23.0
481 5.70818 0.0 18.10 0 0.532 6.750 74.9 3.3317 24 666 20.2 393.07 7.74 23.7
482 5.73116 0.0 18.10 0 0.532 7.061 77.0 3.4106 24 666 20.2 395.28 7.01 25.0
483 2.81838 0.0 18.10 0 0.532 5.762 40.3 4.0983 24 666 20.2 392.92 10.42 21.8
484 2.37857 0.0 18.10 0 0.583 5.871 41.9 3.7240 24 666 20.2 370.73 13.34 20.6
485 3.67367 0.0 18.10 0 0.583 6.312 51.9 3.9917 24 666 20.2 388.62 10.58 21.2
486 5.69175 0.0 18.10 0 0.583 6.114 79.8 3.5459 24 666 20.2 392.68 14.98 19.1
487 4.83567 0.0 18.10 0 0.583 5.905 53.2 3.1523 24 666 20.2 388.22 11.45 20.6
488 0.15086 0.0 27.74 0 0.609 5.454 92.7 1.8209 4 711 20.1 395.09 18.06 15.2
489 0.18337 0.0 27.74 0 0.609 5.414 98.3 1.7554 4 711 20.1 344.05 23.97 7.0
490 0.20746 0.0 27.74 0 0.609 5.093 98.0 1.8226 4 711 20.1 318.43 29.68 8.1
491 0.10574 0.0 27.74 0 0.609 5.983 98.8 1.8681 4 711 20.1 390.11 18.07 13.6
492 0.11132 0.0 27.74 0 0.609 5.983 83.5 2.1099 4 711 20.1 396.90 13.35 20.1
493 0.17331 0.0 9.69 0 0.585 5.707 54.0 2.3817 6 391 19.2 396.90 12.01 21.8
494 0.27957 0.0 9.69 0 0.585 5.926 42.6 2.3817 6 391 19.2 396.90 13.59 24.5
495 0.17899 0.0 9.69 0 0.585 5.670 28.8 2.7986 6 391 19.2 393.29 17.60 23.1
496 0.28960 0.0 9.69 0 0.585 5.390 72.9 2.7986 6 391 19.2 396.90 21.14 19.7
497 0.26838 0.0 9.69 0 0.585 5.794 70.6 2.8927 6 391 19.2 396.90 14.10 18.3
498 0.23912 0.0 9.69 0 0.585 6.019 65.3 2.4091 6 391 19.2 396.90 12.92 21.2
499 0.17783 0.0 9.69 0 0.585 5.569 73.5 2.3999 6 391 19.2 395.77 15.10 17.5
500 0.22438 0.0 9.69 0 0.585 6.027 79.7 2.4982 6 391 19.2 396.90 14.33 16.8
501 0.06263 0.0 11.93 0 0.573 6.593 69.1 2.4786 1 273 21.0 391.99 9.67 22.4
502 0.04527 0.0 11.93 0 0.573 6.120 76.7 2.2875 1 273 21.0 396.90 9.08 20.6
503 0.06076 0.0 11.93 0 0.573 6.976 91.0 2.1675 1 273 21.0 396.90 5.64 23.9
504 0.10959 0.0 11.93 0 0.573 6.794 89.3 2.3889 1 273 21.0 393.45 6.48 22.0
505 0.04741 0.0 11.93 0 0.573 6.030 80.8 2.5050 1 273 21.0 396.90 7.88 11.9

506 rows × 14 columns


In [3]:
boston_df.describe()


Out[3]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT PRICE
count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000
mean 3.593761 11.363636 11.136779 0.069170 0.554695 6.284634 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 12.653063 22.532806
std 8.596783 23.322453 6.860353 0.253994 0.115878 0.702617 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 7.141062 9.197104
min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 1.730000 5.000000
25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 6.950000 17.025000
50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 11.360000 21.200000
75% 3.647422 12.500000 18.100000 0.000000 0.624000 6.623500 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 16.955000 25.000000
max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 37.970000 50.000000

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


['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
PRICE
(506, 13)
(506,)
0.18.1
11401.6
506
(354, 13)
(152, 13)

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 "---------------"


bias 37.993
---------------

CRIM -0.12
---------------

ZN 0.044
---------------

INDUS 0.012
---------------

CHAS 2.513
---------------

NOX -16.271
---------------

RM 3.849
---------------

AGE -0.01
---------------

DIS -1.5
---------------

RAD 0.242
---------------

TAX -0.011
---------------

PTRATIO -1.019
---------------

B 0.007
---------------

LSTAT -0.488
---------------

Ejercicio 1

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 "---------------"


(354, 13)
(354, 10)
[-0.07871024  0.04811545 -0.          0.         -0.          1.65265848
  0.002939   -0.8744929   0.20636471 -0.01408044 -0.8526097   0.00721354
 -0.6777975 ]

Ejercicio 2

Calcular el valor de r2_score para regresión lineal y para el modelo de LassoCV: ¿Cuál es mejor?


In [ ]:

Principal Component Analysis

En el siguiente ejercicio vamos a realizar un análisis en componente principales, con el objeto de realizar una reducción de la dimensionalidad del problema

Ejercicio 2

Realizar PCA sobre los datos de Boston


In [ ]:

Ejercicio 3 Utilizar PCA para modelo RF

En este ejercicio se pide utilizar las componentes de PCA para ajustar un modelo de Random Forest


In [ ]:


In [ ]: