En este artículo vamos a aplicar los métodos de filtrado en machine learning sobre la base de datos de viviendas House Sales in King County, USA.
Métodos de filtrado en machine learning: ejercicio
Para realizar nuestro ejercicio sobre problema realista de métodos de filtrado en machine learning, debemos recordar que para cada vivienda se tienen los siguientes atributos, características o features:
Atributo | Descripción |
id | identificador de la vivienda |
date | fecha |
price | precio |
bedrooms | número de habitaciones |
bathrooms | número de baños/aseos |
sqtf_living | superficie habitable (en pies al cuadrado) |
sqft_lot | superficie de la parcela (en pies al cuadrado) |
floors | número de plantas |
waterfront | indica si la vivienda tiene acceso a un lago |
view | tipo de vista (variable numérica) |
condition | condición de la vivienda (variable numérica) |
grade | medida de la calidad de la construcción (variable numérica) |
sqft_above | superficie por encima del suelo (en pies al cuadrado) |
sqft_basement | superficie del sótano (en pies al cuadrado) |
yr_built | año de construcción de la vivienda |
yr_renovated | año de renovación de la vivienda |
lat | latitud de la parcela |
long | longitud de la parcela |
sqft_living15 | superficie habitable promedio de los 15 vecinos más cercanos |
sqft_lot15 | superficie de la parcela promedio de los 15 vecinos más cercanos |
#Métodos de filtrado en machine learning
#cargamos datos
house_data = pd.read_csv ("./data/kc_house_data.csv") #cargamos fichero
#Eliminamos las columnas id y date
house_data = house data.drop (['id date'], axis = 1)
#convertir las variables en pies al cuadrado en metros al cuadrado
feetFeatures = ['sqft_living', 'sqft_lot', 'sqft_above', 'sqft_basement', 'sqft_living15', 'sqft_lot15']
house_data [feetFeatures] = house_data [feetFeatures].apply (lambda x: x * 0.3948 * 0.3048)
#renombramos
house_data.columns = ['price', 'bedrooms', 'bathrooms', 'sqm_living', 'sqm_lot', 'floors', 'waterfront_view', 'condition_grade', 'sqm_above', 'sqm_basement', 'yr_built', 'yr_renovated', 'zip code', 'lat', 'long', 'sqm_living15', 'sqm_lot15']
#añadimos las nuevas variables
#Métodos de filtrado en machine learning
#creación de la variable "years" con base en la variable "yr_built"
house_data ['years'] = 2017 - house_data ['yr_built']
#creación de "bedrooms_squared", que es una característica basada en "bedrooms"
house_data ['bedrooms_squared'] = house_data [bedrooms].apply (lambda x: x ** 2)
house_data ['bed_bath_rooms'] = house_data [bedrooms'] * house_data ['bathrooms']
house_data ['log_sqm_living'] = house_data [sqm_living'].apply (lambda x: np.log (x))
house_data ['lat_plus_long'] = house_data ['lat'] * house_data ['long']
A partir del comentario «añadimos las nuevas variables» estamos ejecutando lo que se conoce como ingeniería de características, que básicamente consiste en agregar características o funciones al algoritmo que, si bien no son indispensables, sí brindan un panorama más amplio del mismo y lo explican de manera más detallada.
Además, la ingeniería de características consiste en generar nuevas características a partir de las existentes.
#Métodos de filtrado en machine learning
house_data.head ().T
#Métodos de filtrado en machine learning
import seaborn as sns
#Compute the correlation matrix
corr = np.abs (house_data.drop (['price'], axis = 1).corr ())
#Generate a mask for the upper triangle
mask= np.zeros_like (corr, dtype = np.bool)
mask [np.triu_indices_from (mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots (figsize = (12, 10))
#Métodos de filtrado en machine learning
#Draw the heatmap with the mask and correct aspect ratio
sns.heatmap (corr, mask = mask, vmin = 0.0, vmax = 1.0, center = 0.5, linewidths = .1, cmap = "YLGnBu", cbar_kws = {"shrink": .8})
plt.show()
Aquí vemos cómo existe una correlación demasiado alta entre years y yr_built (cuadro muy sombreado, casi negro). Esto es porque con estas dos variables creamos una ingeniería de características.
Ahora, lo que haremos es el f_test y mutual_info_regression de las features o características.
🔴 ¿Quieres formarte en Inteligencia Artificial a un nivel avanzado? 🔴
Descubre nuestro Inteligencia Artificial Full Stack Bootcamp. La formación más completa del mercado y con empleabilidad garantizada
👉 Prueba gratis el Bootcamp en Inteligencia Artificial por una semana#Métodos de filtrado en machine learning
#convertimos el DataFrame al formato necesario para scikit- learn
data = house data.values
y = data [ : , 0:1] #nos quedamos con la 1 columna, price
X = data[ : , 1 : ] #nos quedamos con el resto
feature_names = house data.columns [1:]
#do calculations
f_test, = f_regression (x, y)
f_test /= np.max (f_test)
mi = mutual_info_regression (x, y)
mi =/ np.max (mi)
#do some plotting
plt.figure (figsize = (20, 5))
plt.subplot (1, 2, 1)
plt.bar (range (X.shape [1]), f_test, align = "center")
plt.xticks (range (X.shape [1]), feature_names, rotation = 90)
plt.xlabel ('features')
plt.ylabel ('Ranking')
plt.title ('$R ^ 2$ score')
plt.subplot (1, 2, 2)
plt.bar (range (x.shape [1]), mi, align = "center")
plt.xticks (range(X.shape[1]), feature names, rotation = 90)
plt.xlabel ('features')
plt.ylabel ('Ranking')
plt.title ('Mutual information score')
plt.show ()
¿Qué es lo que pasa aquí? Según la primera gráfica de los R2 score, los metros cuadrados son muy importantes (el grado, que se refiere a la calidad de los materiales).
Así, según la gráfica del mutual info score, por algún motivo, el código postal es la variable más importante de todas.
¿Qué sigue?
Si quieres seguir aprendiendo sobre una de las disciplinas más importantes del mercado actual, recuerda que tenemos el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que aprenderás toda la fundamentación teórica y práctica para incursionar en este mundillo. ¡Anímate a impulsar tu carrera y solicita más información ahora!