Ejemplo de regresión con árbol de decisión y random forest

Autor: | Última modificación: 16 de abril de 2024 | Tiempo de Lectura: 4 minutos
Temas en este post: ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo veremos un ejemplo de regresión con árbol de decisión y random forest, dos estructuras que, si bien son parecidas y una deriva de la otra, tienen funciones un poco distintas y su procedimiento es bastante diferente entre sí.

Ejemplo de regresión con árbol de decisión y random forest

Ejemplo en regresión

#Ejemplo de regresión con árbol de decisión y random forest
#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 [feet Features] = house data [feetFeatures].apply (lambda x: x * 0.3048 * 0.3048)

#renombramos
house_data.columns = I'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
house datal ['years'] = 2017 - house_data ['yr_built']
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 ())
house_data ['lat_plus_long'] = house_data ['lat'] * house_data ['long']

house_data.head ()
Ejemplo de regresión con árbol de decisión y random forest
#Ejemplo de regresión con árbol de decisión y random forest
#convertimos el Dataframe al formato necesario para scikit-Learn

data = house data.values

y = data [ : , 0 : 1] #nos quedamos con la 14 columna, price
X = data [ : , 1 :]   #nos quedamos con el resto

feature_names = house_data.columns [1:]

#Dividimos los datos en entrenamiento y test (80 training, 20 test)
X_train, X_test, y train, y test = train_test_split (x, y, test_size = .25, random state = 2)

print ('Datos entrenamiento: ', X_train.shape)
print ('Datos test: ', X_test.shape)

Datos entrenamiento: (16209, 23)

Datos test: (5404, 23)

Árbol de decisión

#Ejemplo de regresión con árbol de decisión y random forest
from sklearn.tree import DecisionTreeRegressor

maxDepth = range (1, 15)
param_grid = ['max_depth': maxDepth }
grid = GridSearchCV (DecisionTreeRegressor (random_state = 0), param_grid = param_grid, cv = 16)
grid.fit (x_train, y_train)
print ("best mean cross-validation score: { : . 3f}".format (grid.best_score_))
print ("best parameters: {}".format (grid.best_params_))

scores = np.array (grid.cv_results ['mean_test_score'])
plt.plot (maxDepth, scores, '-o')
plt.xlabel ('max_depth', fontsize = 16)
plt.ylabel ('10 - Fold MSE')
#plt.ylim ((-1, 0))
plt.show ()
Ejemplo de regresión con árbol de decisión y random forest
#Ejemplo de regresión con árbol de decisión y random forest
maxDepthOptimo = 5
treeModel = DecisionTreeRegressor (max_depth = maxDepthOptimo).fit (x_train, y_train)

print ("Train: ", treeModel.score (X_train, y_train))
print ("Test: ", treeModel.score (X_test, y_test))

Train: 0.7532671240242249

Test: 0.6952960512762449

#Ejemplo de regresión con árbol de decisión y random forest
tree_dot = exportgraphviz (treeModel, out_file = None, feature_names = feature_names, filled = True, rounded = True, special_characters = True)

graph = graphviz.Source (tree_dot)

graph
Ejemplo de regresión con árbol de decisión y random forest

Random Forest

#Ejemplo de regresión con árbol de decisión y random forest
from sklearn.ensemble import RandomForestRegressor

maxDepth = range (1, 15)
param grid = { 'max_depth': maxDepth)
grid= GridSearchCV (RandomForestRegressor (n_estimators = 500, random_state = 0), param_grid = param_grid, cv = 10)
grid.fit (x_train, y_train)
print ("best mean cross - validation score: { : .3f}".format (grid.best_score_))
print ("best parameters: {}".format (grid.best_params_))

scores = np.array (grid.cv_results ['mean_test_score])
plt.plot (maxDepth, scores, '-o')
plt.xlabel ("max_depth, fontsize = 16)
plt.ylabel ('10 - Fold MSE')
#plt.ylim ((-1, 0))
plt.show ()
Ejemplo de regresión con árbol de decisión y random forest
Ejemplo de regresión con árbol de decisión y random forest

¿Qué profundidad escogerías para este gráfico? Nosotros le daremos una profundidad de 7. Vamos a ver qué sucede:

#Ejemplo de regresión con árbol de decisión y random forest
maxDepthOptimo = 7

rf = RandonForestRegressor (max_depth = maxDepthOptimo).fit (X_train, y_train)

print ("Train: ", rf.score (X_train, y_train))
print ("Test: " rf.score (x_test, y_test))

Train: 0.8688620002013641

Test: 0.8257451425911968

En comparación con el test del árbol de decisión, el resultado del test del random forest es muchísimo mejor.

#Ejemplo de regresión con árbol de decisión y random forest
importances = rf.feature_importances_
importances = importances / np.max (importances)

indices = np.argsort (importances) [ : : -1]

plt.figure (figsize = (10, 10))
plt.barh (range (X_train.shape [1]), importances [indices]) plt.yticks (range (X_train.shape [1]), feature_names [indices]) plt.show ()
Ejemplo de regresión con árbol de decisión y random forest

Aquí vemos que la característica más importante de todas es el grado de la vivienda, es decir, la calidad de la misma. La siguen los metros cuadrados, el log y la latitud, que, por alguna razón, también se presenta como una característica de bastante importancia. Se especula que es por el tema de los barrios, es decir, el barrio en el que estaba ubicada la vivienda.

De una forma sorprendente, la variable bedrooms no tiene importancia alguna, aunque en otros ejercicios el número de habitaciones era sumamente relevante en el precio de una casa.

¿Qué sigue?

El mundo del Big Data es tan amplio como las temáticas que se pueden abordar del mismo.

Si estás interesado en aprender sobre esta disciplina y mejorar tus expectativas salariales y condiciones laborales, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Se trata de una formación intensiva en la que podrás adquirir todos los fundamentos teóricos y prácticos para profesionalizarte en este sector en pocos meses. ¡No esperes más para cambiar tu futuro y solicita información ahora!

Posts Relacionados

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado