# -*- coding: utf-8 -*-
"""[Link]
Automatically generated by Colaboratory.
Original file is located at
[Link]
#Predicción del precio de vivienda en Boston
Modelo: Regresión Lineal usando Arboles de Decisión
Darwin Patiño Pérez, febrero 2021
"""
# Tratamiento de datos
# ------------------------------------------------------------------------------
import numpy as np
import pandas as pd
# Gráficos
# ------------------------------------------------------------------------------
import [Link] as plt
# Preprocesado y modelado
# ------------------------------------------------------------------------------
from [Link] import load_boston
from sklearn.model_selection import train_test_split
from [Link] import DecisionTreeRegressor
from [Link] import plot_tree
from [Link] import export_graphviz
from [Link] import export_text
from sklearn.model_selection import GridSearchCV
from [Link] import mean_squared_error
# Configuración warnings
# ------------------------------------------------------------------------------
import warnings
[Link]('once')
# Cargando los datos desde sklearn (FORMA-1)
# Se unen todos los datos (predictores y variable respuesta en un único dataframe)
boston = load_boston(return_X_y=False)
datos = np.column_stack(([Link], [Link]))
datos = [Link](datos,columns = [Link](boston.feature_names, "MEDV"))
[Link](3)
[Link]()
# Cargando los datos desde el computador(FORMA-2)
datos = pd.read_csv("[Link]")
[Link](3)
dataset = [Link]
# split into input (X) and output (Y) variables
X = dataset[:,0:13]
y = dataset[:,13]
# División de los datos en train y test (DESDE LA FORMA-1)
# ------------------------------------------------------------------------------
X_train, X_test, y_train, y_test = train_test_split(
[Link](columns = "MEDV"),
datos['MEDV'],
random_state = 123
)
# Creación del modelo
# ------------------------------------------------------------------------------
modelo = DecisionTreeRegressor(
max_depth = 3,
random_state = 123
)
# Entrenamiento del modelo
# ------------------------------------------------------------------------------
[Link](X_train, y_train)
# Estructura del árbol creado
# ------------------------------------------------------------------------------
fig, ax = [Link](figsize=(12, 5))
print(f"Profundidad del árbol: {modelo.get_depth()}")
print(f"Número de nodos terminales: {modelo.get_n_leaves()}")
plot = plot_tree(
decision_tree = modelo,
feature_names = [Link](columns = "MEDV").columns,
class_names = 'MEDV',
filled = True,
impurity = False,
fontsize = 10,
precision = 2,
ax = ax
)
texto_modelo = export_text(
decision_tree = modelo,
feature_names = list([Link](columns = "MEDV").columns)
)
print(texto_modelo)
importancia_predictores = [Link](
{'predictor': [Link](columns = "MEDV").columns,
'importancia': modelo.feature_importances_}
)
print("Importancia de los predictores en el modelo")
print("-------------------------------------------")
importancia_predictores.sort_values('importancia', ascending=False)
# Pruning (const complexity pruning) por validación cruzada
# ------------------------------------------------------------------------------
# Valores de ccp_alpha evaluados
param_grid = {'ccp_alpha':[Link](0, 80, 20)}
# Búsqueda por validación cruzada
grid = GridSearchCV(
# El árbol se crece al máximo posible para luego aplicar el pruning
estimator = DecisionTreeRegressor(
max_depth = 3, #None,
min_samples_split = 2,
min_samples_leaf = 1,
random_state = 123
),
param_grid = param_grid,
cv = 10,
refit = True,
return_train_score = True
)
[Link](X_train, y_train)
fig, ax = [Link](figsize=(6, 3.84))
scores = [Link](grid.cv_results_)
[Link](x='param_ccp_alpha', y='mean_train_score', yerr='std_train_score', ax=ax)
[Link](x='param_ccp_alpha', y='mean_test_score', yerr='std_test_score', ax=ax)
ax.set_title("Error de validacion cruzada vs hiperparámetro ccp_alpha");
# Mejor valor ccp_alpha encontrado
# ------------------------------------------------------------------------------
grid.best_params_
# Estructura del árbol final
# ------------------------------------------------------------------------------
modelo_final = grid.best_estimator_
print(f"Profundidad del árbol: {modelo_final.get_depth()}")
print(f"Número de nodos terminales: {modelo_final.get_n_leaves()}")
fig, ax = [Link](figsize=(7, 5))
plot = plot_tree(
decision_tree = modelo_final,
feature_names = [Link](columns = "MEDV").columns,
class_names = 'MEDV',
filled = True,
impurity = False,
ax = ax
)
# Error de test del modelo inicial
#-------------------------------------------------------------------------------
predicciones = [Link](X = X_test)
rmse = mean_squared_error(
y_true = y_test,
y_pred = predicciones,
squared = False
)
print(f"El error (rmse) de test es: {rmse}")
print("valor real --- valor de predicción")
for i in range(7):
print("{:.2f} {:.2f}".format(y_test.iloc[i],predicciones[i]))
# Error de test del modelo final (tras aplicar pruning)
#-------------------------------------------------------------------------------
predicciones = modelo_final.predict(X = X_test)
rmse = mean_squared_error(
y_true = y_test,
y_pred = predicciones,
squared = False
)
print(f"El error (rmse) de test es: {rmse}")
print("valor real --- valor de predicción")
for i in range(5):
print("{:.2f} {:.2f}".format(y_test.iloc[i],predicciones[i]))