Capítulo 13: Proyectos Prácticos de Aprendizaje Automático
13.1 Proyecto 1: Predicción de Precios de Casas con Regresión
En este proyecto, desarrollaremos un modelo de aprendizaje automático para predecir los precios de las casas. Esta es una aplicación del mundo real común de la regresión, un tipo de método de aprendizaje supervisado en el aprendizaje automático. Utilizaremos el conjunto de datos de Boston Housing, que contiene información recopilada por el Servicio del Censo de los Estados Unidos sobre viviendas en el área de Boston, Massachusetts.
13.1.1 Declaración del Problema
El objetivo de este proyecto es construir un modelo que pueda predecir el valor medio de las viviendas ocupadas por sus propietarios en Boston, dadas un conjunto de características como la tasa de criminalidad, el promedio de habitaciones por vivienda y otras.
13.1.2 Conjunto de Datos
El conjunto de datos utilizado en este proyecto proviene del Repositorio de Aprendizaje Automático de la UCI. Estos datos se recopilaron en 1978 y cada una de las 506 entradas representa información agregada sobre 14 características de viviendas de varios suburbios ubicados en Boston.
Las características se pueden resumir de la siguiente manera:
- CRIM: Esta es la tasa de criminalidad per cápita por ciudad
- ZN: Esta es la proporción de terreno residencial zonificado para lotes de más de 25,000 pies cuadrados.
- INDUS: Esta es la proporción de acres de negocios no minoristas por ciudad.
- CHAS: Esta es la variable ficticia del río Charles (igual a 1 si el terreno linda con el río; 0 en caso contrario)
- NOX: Esta es la concentración de óxidos de nitrógeno (partes por 10 millones)
- RM: Este es el número promedio de habitaciones por vivienda
- AGE: Esta es la proporción de unidades ocupadas por el propietario construidas antes de 1940
- DIS: Estas son las distancias ponderadas a cinco centros de empleo en Boston.
- RAD: Este es el índice de accesibilidad a carreteras radiales.
- TAX: Esta es la tasa de impuestos a la propiedad de valor completo por $10,000
- PTRATIO: Esta es la proporción alumno-maestro por ciudad
- B: Esto se calcula como 1000(Bk — 0.63)², donde Bk es la proporción de personas de ascendencia africana por ciudad.
- LSTAT: Este es el porcentaje de población de estatus más bajo
- MEDV: Este es el valor mediano de las viviendas ocupadas por sus propietarios en $1000
13.1.3 Implementación
Paso 1
Comencemos por cargar el conjunto de datos y eliminar las características no esenciales.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# Import supplementary visualizations code visuals.py
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
Desglose del código:
La primera línea importa la biblioteca NumPy, que proporciona una interfaz de alto nivel para la computación numérica. La segunda línea importa la biblioteca Pandas, que proporciona estructuras de datos de alto nivel y herramientas de análisis de datos. La tercera línea importa la clase ShuffleSplit de scikit-learn, que se utiliza para crear divisiones de entrenamiento/prueba de datos. La cuarta línea importa el código de visualizaciones suplementarias desde el archivo visuals.py. La quinta línea configura el cuaderno para imprimir de manera legible. La sexta línea carga el conjunto de datos de viviendas de Boston desde el archivo housing.csv. La séptima línea crea la variable de precios, que contiene el valor mediano de las viviendas ocupadas por sus propietarios en miles de dólares. La octava línea crea la variable de características, que contiene las 13 características del conjunto de datos. La novena línea imprime un mensaje de éxito, seguido del número de puntos de datos y variables en el conjunto de datos.
Luego dividiremos el conjunto de datos en características y la variable objetivo. Las características 'RM', 'LSTAT' y 'PTRATIO' nos proporcionan información cuantitativa sobre cada punto de datos. La variable objetivo, 'MEDV', será la variable que intentaremos predecir.
A continuación, calcularemos algunas estadísticas descriptivas sobre los precios de las viviendas en Boston.
import numpy as np
import pandas as pd
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
# Minimum price of the data
minimum_price = np.min(prices)
# Maximum price of the data
maximum_price = np.max(prices)
# Mean price of the data
mean_price = np.mean(prices)
# Median price of the data
median_price = np.median(prices)
# Standard deviation of prices of the data
std_price = np.std(prices)
# Show the calculated statistics
print("Statistics for Boston housing dataset:\n")
print("Minimum price: ${}".format(minimum_price))
print("Maximum price: ${}".format(maximum_price))
print("Mean price: ${}".format(mean_price))
print("Median price ${}".format(median_price))
print("Standard deviation of prices: ${:.2f}".format(std_price))
Desglose del código:
El código primero importa la biblioteca NumPy, que proporciona una serie de funciones para trabajar con datos numéricos. A continuación, el código define una variable llamada prices
, que contiene los precios medianos de las viviendas en el conjunto de datos de viviendas de Boston. Luego, el código utiliza las funciones de NumPy amin()
, amax()
, mean()
, median()
y std()
para calcular el mínimo, el máximo, la media, la mediana y la desviación estándar de los precios, respectivamente. Finalmente, el código imprime las estadísticas calculadas.
Podemos hacer algunas suposiciones sobre los datos. Por ejemplo, las casas con más habitaciones (un valor 'RM' más alto) tendrán un mayor valor. Los vecindarios con más trabajadores de clase baja (un valor 'LSTAT' más alto) tendrán un menor valor. Los vecindarios con una proporción más alta de estudiantes por maestro ('PTRATIO') tendrán un menor valor.
A continuación, dividiremos los datos en conjuntos de entrenamiento y prueba.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis=1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=42)
# Success
print("Training and testing split was successful.")
Desglose del código:
El código primero importa la función train_test_split
de la biblioteca sklearn.model_selection
. A continuación, el código define dos variables, features
y prices
, que contienen las características y los precios del conjunto de datos de viviendas de Boston, respectivamente. Luego, el código utiliza la función train_test_split
para dividir los datos en subconjuntos de entrenamiento y prueba. El parámetro test_size
especifica que se debe utilizar el 20% de los datos para realizar pruebas, y el parámetro random_state
especifica que los datos deben mezclarse de forma aleatoria. Finalmente, el código imprime un mensaje que indica que la división de entrenamiento y prueba se realizó con éxito.
Luego entrenaremos un modelo utilizando el algoritmo de árbol de decisión. Para asegurarnos de que estamos produciendo un modelo optimizado, entrenaremos el modelo utilizando la técnica de búsqueda en cuadrícula para optimizar el parámetro 'max_depth' del árbol de decisión.
# Import 'ShuffleSplit'
from sklearn.model_selection import ShuffleSplit
def fit_model(X, y):
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': list(range(1, 11))}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search cv object --> GridSearchCV()
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
Desglose del código:
El código primero importa las funciones DecisionTreeRegressor
, make_scorer
y GridSearchCV
de las bibliotecas sklearn.tree
, sklearn.metrics
y sklearn.model_selection
, respectivamente. A continuación, el código define una función llamada fit_model()
, que toma dos argumentos, X
e y
, que representan los datos de entrenamiento y los valores objetivo, respectivamente. El código luego crea un objeto ShuffleSplit
llamado cv_sets
, que divide los datos de entrenamiento en 10 pliegues, con un 20% de los datos utilizados para las pruebas en cada pliegue. A continuación, el código crea un objeto DecisionTreeRegressor
llamado regressor
. Luego, el código crea un diccionario llamado params
, que asigna el nombre del parámetro max_depth
a una lista de valores del 1 al 10. Luego, el código utiliza la función make_scorer()
para crear una función de puntuación llamada scoring_fnc
, que se utilizará para evaluar el rendimiento de los diferentes modelos. Finalmente, el código crea un objeto GridSearchCV
llamado grid
, que se utilizará para buscar el modelo óptimo. El objeto grid
recibe los objetos regressor
, params
, scoring_fnc
y cv_sets
. Luego, el objeto grid
se ajusta a los datos, lo que encontrará el modelo óptimo. El modelo óptimo se devuelve luego desde la función fit_model()
.
Finalmente, realizaremos predicciones sobre nuevos conjuntos de datos de entrada.
# Assume reg is the trained model obtained from fit_model
# Produce a matrix for client data
client_data = [[5, 17, 15], # Client 1
[4, 32, 22], # Client 2
[8, 3, 12]] # Client 3
# Show predictions
for i, price in enumerate(reg.predict(client_data)):
print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i + 1, price))
Desglose del código:
El código primero crea una matriz llamada client_data
, que contiene los datos del cliente. Luego, el código utiliza la función reg.predict()
para predecir el precio de venta para cada cliente. El código luego utiliza la función enumerate()
para iterar sobre los precios predichos y las identificaciones de los clientes. Luego, el código imprime el precio de venta predicho para cada cliente.
Este proyecto proporciona una aplicación práctica del aprendizaje automático en un entorno del mundo real. Muestra cómo utilizar la regresión para predecir los precios de las viviendas en función de diversas características. El código proporcionado puede servir como punto de partida para una mayor exploración y experimentación.
13.1 Proyecto 1: Predicción de Precios de Casas con Regresión
En este proyecto, desarrollaremos un modelo de aprendizaje automático para predecir los precios de las casas. Esta es una aplicación del mundo real común de la regresión, un tipo de método de aprendizaje supervisado en el aprendizaje automático. Utilizaremos el conjunto de datos de Boston Housing, que contiene información recopilada por el Servicio del Censo de los Estados Unidos sobre viviendas en el área de Boston, Massachusetts.
13.1.1 Declaración del Problema
El objetivo de este proyecto es construir un modelo que pueda predecir el valor medio de las viviendas ocupadas por sus propietarios en Boston, dadas un conjunto de características como la tasa de criminalidad, el promedio de habitaciones por vivienda y otras.
13.1.2 Conjunto de Datos
El conjunto de datos utilizado en este proyecto proviene del Repositorio de Aprendizaje Automático de la UCI. Estos datos se recopilaron en 1978 y cada una de las 506 entradas representa información agregada sobre 14 características de viviendas de varios suburbios ubicados en Boston.
Las características se pueden resumir de la siguiente manera:
- CRIM: Esta es la tasa de criminalidad per cápita por ciudad
- ZN: Esta es la proporción de terreno residencial zonificado para lotes de más de 25,000 pies cuadrados.
- INDUS: Esta es la proporción de acres de negocios no minoristas por ciudad.
- CHAS: Esta es la variable ficticia del río Charles (igual a 1 si el terreno linda con el río; 0 en caso contrario)
- NOX: Esta es la concentración de óxidos de nitrógeno (partes por 10 millones)
- RM: Este es el número promedio de habitaciones por vivienda
- AGE: Esta es la proporción de unidades ocupadas por el propietario construidas antes de 1940
- DIS: Estas son las distancias ponderadas a cinco centros de empleo en Boston.
- RAD: Este es el índice de accesibilidad a carreteras radiales.
- TAX: Esta es la tasa de impuestos a la propiedad de valor completo por $10,000
- PTRATIO: Esta es la proporción alumno-maestro por ciudad
- B: Esto se calcula como 1000(Bk — 0.63)², donde Bk es la proporción de personas de ascendencia africana por ciudad.
- LSTAT: Este es el porcentaje de población de estatus más bajo
- MEDV: Este es el valor mediano de las viviendas ocupadas por sus propietarios en $1000
13.1.3 Implementación
Paso 1
Comencemos por cargar el conjunto de datos y eliminar las características no esenciales.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# Import supplementary visualizations code visuals.py
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
Desglose del código:
La primera línea importa la biblioteca NumPy, que proporciona una interfaz de alto nivel para la computación numérica. La segunda línea importa la biblioteca Pandas, que proporciona estructuras de datos de alto nivel y herramientas de análisis de datos. La tercera línea importa la clase ShuffleSplit de scikit-learn, que se utiliza para crear divisiones de entrenamiento/prueba de datos. La cuarta línea importa el código de visualizaciones suplementarias desde el archivo visuals.py. La quinta línea configura el cuaderno para imprimir de manera legible. La sexta línea carga el conjunto de datos de viviendas de Boston desde el archivo housing.csv. La séptima línea crea la variable de precios, que contiene el valor mediano de las viviendas ocupadas por sus propietarios en miles de dólares. La octava línea crea la variable de características, que contiene las 13 características del conjunto de datos. La novena línea imprime un mensaje de éxito, seguido del número de puntos de datos y variables en el conjunto de datos.
Luego dividiremos el conjunto de datos en características y la variable objetivo. Las características 'RM', 'LSTAT' y 'PTRATIO' nos proporcionan información cuantitativa sobre cada punto de datos. La variable objetivo, 'MEDV', será la variable que intentaremos predecir.
A continuación, calcularemos algunas estadísticas descriptivas sobre los precios de las viviendas en Boston.
import numpy as np
import pandas as pd
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
# Minimum price of the data
minimum_price = np.min(prices)
# Maximum price of the data
maximum_price = np.max(prices)
# Mean price of the data
mean_price = np.mean(prices)
# Median price of the data
median_price = np.median(prices)
# Standard deviation of prices of the data
std_price = np.std(prices)
# Show the calculated statistics
print("Statistics for Boston housing dataset:\n")
print("Minimum price: ${}".format(minimum_price))
print("Maximum price: ${}".format(maximum_price))
print("Mean price: ${}".format(mean_price))
print("Median price ${}".format(median_price))
print("Standard deviation of prices: ${:.2f}".format(std_price))
Desglose del código:
El código primero importa la biblioteca NumPy, que proporciona una serie de funciones para trabajar con datos numéricos. A continuación, el código define una variable llamada prices
, que contiene los precios medianos de las viviendas en el conjunto de datos de viviendas de Boston. Luego, el código utiliza las funciones de NumPy amin()
, amax()
, mean()
, median()
y std()
para calcular el mínimo, el máximo, la media, la mediana y la desviación estándar de los precios, respectivamente. Finalmente, el código imprime las estadísticas calculadas.
Podemos hacer algunas suposiciones sobre los datos. Por ejemplo, las casas con más habitaciones (un valor 'RM' más alto) tendrán un mayor valor. Los vecindarios con más trabajadores de clase baja (un valor 'LSTAT' más alto) tendrán un menor valor. Los vecindarios con una proporción más alta de estudiantes por maestro ('PTRATIO') tendrán un menor valor.
A continuación, dividiremos los datos en conjuntos de entrenamiento y prueba.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis=1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=42)
# Success
print("Training and testing split was successful.")
Desglose del código:
El código primero importa la función train_test_split
de la biblioteca sklearn.model_selection
. A continuación, el código define dos variables, features
y prices
, que contienen las características y los precios del conjunto de datos de viviendas de Boston, respectivamente. Luego, el código utiliza la función train_test_split
para dividir los datos en subconjuntos de entrenamiento y prueba. El parámetro test_size
especifica que se debe utilizar el 20% de los datos para realizar pruebas, y el parámetro random_state
especifica que los datos deben mezclarse de forma aleatoria. Finalmente, el código imprime un mensaje que indica que la división de entrenamiento y prueba se realizó con éxito.
Luego entrenaremos un modelo utilizando el algoritmo de árbol de decisión. Para asegurarnos de que estamos produciendo un modelo optimizado, entrenaremos el modelo utilizando la técnica de búsqueda en cuadrícula para optimizar el parámetro 'max_depth' del árbol de decisión.
# Import 'ShuffleSplit'
from sklearn.model_selection import ShuffleSplit
def fit_model(X, y):
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': list(range(1, 11))}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search cv object --> GridSearchCV()
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
Desglose del código:
El código primero importa las funciones DecisionTreeRegressor
, make_scorer
y GridSearchCV
de las bibliotecas sklearn.tree
, sklearn.metrics
y sklearn.model_selection
, respectivamente. A continuación, el código define una función llamada fit_model()
, que toma dos argumentos, X
e y
, que representan los datos de entrenamiento y los valores objetivo, respectivamente. El código luego crea un objeto ShuffleSplit
llamado cv_sets
, que divide los datos de entrenamiento en 10 pliegues, con un 20% de los datos utilizados para las pruebas en cada pliegue. A continuación, el código crea un objeto DecisionTreeRegressor
llamado regressor
. Luego, el código crea un diccionario llamado params
, que asigna el nombre del parámetro max_depth
a una lista de valores del 1 al 10. Luego, el código utiliza la función make_scorer()
para crear una función de puntuación llamada scoring_fnc
, que se utilizará para evaluar el rendimiento de los diferentes modelos. Finalmente, el código crea un objeto GridSearchCV
llamado grid
, que se utilizará para buscar el modelo óptimo. El objeto grid
recibe los objetos regressor
, params
, scoring_fnc
y cv_sets
. Luego, el objeto grid
se ajusta a los datos, lo que encontrará el modelo óptimo. El modelo óptimo se devuelve luego desde la función fit_model()
.
Finalmente, realizaremos predicciones sobre nuevos conjuntos de datos de entrada.
# Assume reg is the trained model obtained from fit_model
# Produce a matrix for client data
client_data = [[5, 17, 15], # Client 1
[4, 32, 22], # Client 2
[8, 3, 12]] # Client 3
# Show predictions
for i, price in enumerate(reg.predict(client_data)):
print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i + 1, price))
Desglose del código:
El código primero crea una matriz llamada client_data
, que contiene los datos del cliente. Luego, el código utiliza la función reg.predict()
para predecir el precio de venta para cada cliente. El código luego utiliza la función enumerate()
para iterar sobre los precios predichos y las identificaciones de los clientes. Luego, el código imprime el precio de venta predicho para cada cliente.
Este proyecto proporciona una aplicación práctica del aprendizaje automático en un entorno del mundo real. Muestra cómo utilizar la regresión para predecir los precios de las viviendas en función de diversas características. El código proporcionado puede servir como punto de partida para una mayor exploración y experimentación.
13.1 Proyecto 1: Predicción de Precios de Casas con Regresión
En este proyecto, desarrollaremos un modelo de aprendizaje automático para predecir los precios de las casas. Esta es una aplicación del mundo real común de la regresión, un tipo de método de aprendizaje supervisado en el aprendizaje automático. Utilizaremos el conjunto de datos de Boston Housing, que contiene información recopilada por el Servicio del Censo de los Estados Unidos sobre viviendas en el área de Boston, Massachusetts.
13.1.1 Declaración del Problema
El objetivo de este proyecto es construir un modelo que pueda predecir el valor medio de las viviendas ocupadas por sus propietarios en Boston, dadas un conjunto de características como la tasa de criminalidad, el promedio de habitaciones por vivienda y otras.
13.1.2 Conjunto de Datos
El conjunto de datos utilizado en este proyecto proviene del Repositorio de Aprendizaje Automático de la UCI. Estos datos se recopilaron en 1978 y cada una de las 506 entradas representa información agregada sobre 14 características de viviendas de varios suburbios ubicados en Boston.
Las características se pueden resumir de la siguiente manera:
- CRIM: Esta es la tasa de criminalidad per cápita por ciudad
- ZN: Esta es la proporción de terreno residencial zonificado para lotes de más de 25,000 pies cuadrados.
- INDUS: Esta es la proporción de acres de negocios no minoristas por ciudad.
- CHAS: Esta es la variable ficticia del río Charles (igual a 1 si el terreno linda con el río; 0 en caso contrario)
- NOX: Esta es la concentración de óxidos de nitrógeno (partes por 10 millones)
- RM: Este es el número promedio de habitaciones por vivienda
- AGE: Esta es la proporción de unidades ocupadas por el propietario construidas antes de 1940
- DIS: Estas son las distancias ponderadas a cinco centros de empleo en Boston.
- RAD: Este es el índice de accesibilidad a carreteras radiales.
- TAX: Esta es la tasa de impuestos a la propiedad de valor completo por $10,000
- PTRATIO: Esta es la proporción alumno-maestro por ciudad
- B: Esto se calcula como 1000(Bk — 0.63)², donde Bk es la proporción de personas de ascendencia africana por ciudad.
- LSTAT: Este es el porcentaje de población de estatus más bajo
- MEDV: Este es el valor mediano de las viviendas ocupadas por sus propietarios en $1000
13.1.3 Implementación
Paso 1
Comencemos por cargar el conjunto de datos y eliminar las características no esenciales.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# Import supplementary visualizations code visuals.py
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
Desglose del código:
La primera línea importa la biblioteca NumPy, que proporciona una interfaz de alto nivel para la computación numérica. La segunda línea importa la biblioteca Pandas, que proporciona estructuras de datos de alto nivel y herramientas de análisis de datos. La tercera línea importa la clase ShuffleSplit de scikit-learn, que se utiliza para crear divisiones de entrenamiento/prueba de datos. La cuarta línea importa el código de visualizaciones suplementarias desde el archivo visuals.py. La quinta línea configura el cuaderno para imprimir de manera legible. La sexta línea carga el conjunto de datos de viviendas de Boston desde el archivo housing.csv. La séptima línea crea la variable de precios, que contiene el valor mediano de las viviendas ocupadas por sus propietarios en miles de dólares. La octava línea crea la variable de características, que contiene las 13 características del conjunto de datos. La novena línea imprime un mensaje de éxito, seguido del número de puntos de datos y variables en el conjunto de datos.
Luego dividiremos el conjunto de datos en características y la variable objetivo. Las características 'RM', 'LSTAT' y 'PTRATIO' nos proporcionan información cuantitativa sobre cada punto de datos. La variable objetivo, 'MEDV', será la variable que intentaremos predecir.
A continuación, calcularemos algunas estadísticas descriptivas sobre los precios de las viviendas en Boston.
import numpy as np
import pandas as pd
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
# Minimum price of the data
minimum_price = np.min(prices)
# Maximum price of the data
maximum_price = np.max(prices)
# Mean price of the data
mean_price = np.mean(prices)
# Median price of the data
median_price = np.median(prices)
# Standard deviation of prices of the data
std_price = np.std(prices)
# Show the calculated statistics
print("Statistics for Boston housing dataset:\n")
print("Minimum price: ${}".format(minimum_price))
print("Maximum price: ${}".format(maximum_price))
print("Mean price: ${}".format(mean_price))
print("Median price ${}".format(median_price))
print("Standard deviation of prices: ${:.2f}".format(std_price))
Desglose del código:
El código primero importa la biblioteca NumPy, que proporciona una serie de funciones para trabajar con datos numéricos. A continuación, el código define una variable llamada prices
, que contiene los precios medianos de las viviendas en el conjunto de datos de viviendas de Boston. Luego, el código utiliza las funciones de NumPy amin()
, amax()
, mean()
, median()
y std()
para calcular el mínimo, el máximo, la media, la mediana y la desviación estándar de los precios, respectivamente. Finalmente, el código imprime las estadísticas calculadas.
Podemos hacer algunas suposiciones sobre los datos. Por ejemplo, las casas con más habitaciones (un valor 'RM' más alto) tendrán un mayor valor. Los vecindarios con más trabajadores de clase baja (un valor 'LSTAT' más alto) tendrán un menor valor. Los vecindarios con una proporción más alta de estudiantes por maestro ('PTRATIO') tendrán un menor valor.
A continuación, dividiremos los datos en conjuntos de entrenamiento y prueba.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis=1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=42)
# Success
print("Training and testing split was successful.")
Desglose del código:
El código primero importa la función train_test_split
de la biblioteca sklearn.model_selection
. A continuación, el código define dos variables, features
y prices
, que contienen las características y los precios del conjunto de datos de viviendas de Boston, respectivamente. Luego, el código utiliza la función train_test_split
para dividir los datos en subconjuntos de entrenamiento y prueba. El parámetro test_size
especifica que se debe utilizar el 20% de los datos para realizar pruebas, y el parámetro random_state
especifica que los datos deben mezclarse de forma aleatoria. Finalmente, el código imprime un mensaje que indica que la división de entrenamiento y prueba se realizó con éxito.
Luego entrenaremos un modelo utilizando el algoritmo de árbol de decisión. Para asegurarnos de que estamos produciendo un modelo optimizado, entrenaremos el modelo utilizando la técnica de búsqueda en cuadrícula para optimizar el parámetro 'max_depth' del árbol de decisión.
# Import 'ShuffleSplit'
from sklearn.model_selection import ShuffleSplit
def fit_model(X, y):
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': list(range(1, 11))}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search cv object --> GridSearchCV()
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
Desglose del código:
El código primero importa las funciones DecisionTreeRegressor
, make_scorer
y GridSearchCV
de las bibliotecas sklearn.tree
, sklearn.metrics
y sklearn.model_selection
, respectivamente. A continuación, el código define una función llamada fit_model()
, que toma dos argumentos, X
e y
, que representan los datos de entrenamiento y los valores objetivo, respectivamente. El código luego crea un objeto ShuffleSplit
llamado cv_sets
, que divide los datos de entrenamiento en 10 pliegues, con un 20% de los datos utilizados para las pruebas en cada pliegue. A continuación, el código crea un objeto DecisionTreeRegressor
llamado regressor
. Luego, el código crea un diccionario llamado params
, que asigna el nombre del parámetro max_depth
a una lista de valores del 1 al 10. Luego, el código utiliza la función make_scorer()
para crear una función de puntuación llamada scoring_fnc
, que se utilizará para evaluar el rendimiento de los diferentes modelos. Finalmente, el código crea un objeto GridSearchCV
llamado grid
, que se utilizará para buscar el modelo óptimo. El objeto grid
recibe los objetos regressor
, params
, scoring_fnc
y cv_sets
. Luego, el objeto grid
se ajusta a los datos, lo que encontrará el modelo óptimo. El modelo óptimo se devuelve luego desde la función fit_model()
.
Finalmente, realizaremos predicciones sobre nuevos conjuntos de datos de entrada.
# Assume reg is the trained model obtained from fit_model
# Produce a matrix for client data
client_data = [[5, 17, 15], # Client 1
[4, 32, 22], # Client 2
[8, 3, 12]] # Client 3
# Show predictions
for i, price in enumerate(reg.predict(client_data)):
print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i + 1, price))
Desglose del código:
El código primero crea una matriz llamada client_data
, que contiene los datos del cliente. Luego, el código utiliza la función reg.predict()
para predecir el precio de venta para cada cliente. El código luego utiliza la función enumerate()
para iterar sobre los precios predichos y las identificaciones de los clientes. Luego, el código imprime el precio de venta predicho para cada cliente.
Este proyecto proporciona una aplicación práctica del aprendizaje automático en un entorno del mundo real. Muestra cómo utilizar la regresión para predecir los precios de las viviendas en función de diversas características. El código proporcionado puede servir como punto de partida para una mayor exploración y experimentación.
13.1 Proyecto 1: Predicción de Precios de Casas con Regresión
En este proyecto, desarrollaremos un modelo de aprendizaje automático para predecir los precios de las casas. Esta es una aplicación del mundo real común de la regresión, un tipo de método de aprendizaje supervisado en el aprendizaje automático. Utilizaremos el conjunto de datos de Boston Housing, que contiene información recopilada por el Servicio del Censo de los Estados Unidos sobre viviendas en el área de Boston, Massachusetts.
13.1.1 Declaración del Problema
El objetivo de este proyecto es construir un modelo que pueda predecir el valor medio de las viviendas ocupadas por sus propietarios en Boston, dadas un conjunto de características como la tasa de criminalidad, el promedio de habitaciones por vivienda y otras.
13.1.2 Conjunto de Datos
El conjunto de datos utilizado en este proyecto proviene del Repositorio de Aprendizaje Automático de la UCI. Estos datos se recopilaron en 1978 y cada una de las 506 entradas representa información agregada sobre 14 características de viviendas de varios suburbios ubicados en Boston.
Las características se pueden resumir de la siguiente manera:
- CRIM: Esta es la tasa de criminalidad per cápita por ciudad
- ZN: Esta es la proporción de terreno residencial zonificado para lotes de más de 25,000 pies cuadrados.
- INDUS: Esta es la proporción de acres de negocios no minoristas por ciudad.
- CHAS: Esta es la variable ficticia del río Charles (igual a 1 si el terreno linda con el río; 0 en caso contrario)
- NOX: Esta es la concentración de óxidos de nitrógeno (partes por 10 millones)
- RM: Este es el número promedio de habitaciones por vivienda
- AGE: Esta es la proporción de unidades ocupadas por el propietario construidas antes de 1940
- DIS: Estas son las distancias ponderadas a cinco centros de empleo en Boston.
- RAD: Este es el índice de accesibilidad a carreteras radiales.
- TAX: Esta es la tasa de impuestos a la propiedad de valor completo por $10,000
- PTRATIO: Esta es la proporción alumno-maestro por ciudad
- B: Esto se calcula como 1000(Bk — 0.63)², donde Bk es la proporción de personas de ascendencia africana por ciudad.
- LSTAT: Este es el porcentaje de población de estatus más bajo
- MEDV: Este es el valor mediano de las viviendas ocupadas por sus propietarios en $1000
13.1.3 Implementación
Paso 1
Comencemos por cargar el conjunto de datos y eliminar las características no esenciales.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# Import supplementary visualizations code visuals.py
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
Desglose del código:
La primera línea importa la biblioteca NumPy, que proporciona una interfaz de alto nivel para la computación numérica. La segunda línea importa la biblioteca Pandas, que proporciona estructuras de datos de alto nivel y herramientas de análisis de datos. La tercera línea importa la clase ShuffleSplit de scikit-learn, que se utiliza para crear divisiones de entrenamiento/prueba de datos. La cuarta línea importa el código de visualizaciones suplementarias desde el archivo visuals.py. La quinta línea configura el cuaderno para imprimir de manera legible. La sexta línea carga el conjunto de datos de viviendas de Boston desde el archivo housing.csv. La séptima línea crea la variable de precios, que contiene el valor mediano de las viviendas ocupadas por sus propietarios en miles de dólares. La octava línea crea la variable de características, que contiene las 13 características del conjunto de datos. La novena línea imprime un mensaje de éxito, seguido del número de puntos de datos y variables en el conjunto de datos.
Luego dividiremos el conjunto de datos en características y la variable objetivo. Las características 'RM', 'LSTAT' y 'PTRATIO' nos proporcionan información cuantitativa sobre cada punto de datos. La variable objetivo, 'MEDV', será la variable que intentaremos predecir.
A continuación, calcularemos algunas estadísticas descriptivas sobre los precios de las viviendas en Boston.
import numpy as np
import pandas as pd
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
# Minimum price of the data
minimum_price = np.min(prices)
# Maximum price of the data
maximum_price = np.max(prices)
# Mean price of the data
mean_price = np.mean(prices)
# Median price of the data
median_price = np.median(prices)
# Standard deviation of prices of the data
std_price = np.std(prices)
# Show the calculated statistics
print("Statistics for Boston housing dataset:\n")
print("Minimum price: ${}".format(minimum_price))
print("Maximum price: ${}".format(maximum_price))
print("Mean price: ${}".format(mean_price))
print("Median price ${}".format(median_price))
print("Standard deviation of prices: ${:.2f}".format(std_price))
Desglose del código:
El código primero importa la biblioteca NumPy, que proporciona una serie de funciones para trabajar con datos numéricos. A continuación, el código define una variable llamada prices
, que contiene los precios medianos de las viviendas en el conjunto de datos de viviendas de Boston. Luego, el código utiliza las funciones de NumPy amin()
, amax()
, mean()
, median()
y std()
para calcular el mínimo, el máximo, la media, la mediana y la desviación estándar de los precios, respectivamente. Finalmente, el código imprime las estadísticas calculadas.
Podemos hacer algunas suposiciones sobre los datos. Por ejemplo, las casas con más habitaciones (un valor 'RM' más alto) tendrán un mayor valor. Los vecindarios con más trabajadores de clase baja (un valor 'LSTAT' más alto) tendrán un menor valor. Los vecindarios con una proporción más alta de estudiantes por maestro ('PTRATIO') tendrán un menor valor.
A continuación, dividiremos los datos en conjuntos de entrenamiento y prueba.
# Import libraries necessary for this project
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
# Load the Boston housing dataset
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis=1)
# Success
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=42)
# Success
print("Training and testing split was successful.")
Desglose del código:
El código primero importa la función train_test_split
de la biblioteca sklearn.model_selection
. A continuación, el código define dos variables, features
y prices
, que contienen las características y los precios del conjunto de datos de viviendas de Boston, respectivamente. Luego, el código utiliza la función train_test_split
para dividir los datos en subconjuntos de entrenamiento y prueba. El parámetro test_size
especifica que se debe utilizar el 20% de los datos para realizar pruebas, y el parámetro random_state
especifica que los datos deben mezclarse de forma aleatoria. Finalmente, el código imprime un mensaje que indica que la división de entrenamiento y prueba se realizó con éxito.
Luego entrenaremos un modelo utilizando el algoritmo de árbol de decisión. Para asegurarnos de que estamos produciendo un modelo optimizado, entrenaremos el modelo utilizando la técnica de búsqueda en cuadrícula para optimizar el parámetro 'max_depth' del árbol de decisión.
# Import 'ShuffleSplit'
from sklearn.model_selection import ShuffleSplit
def fit_model(X, y):
# Create cross-validation sets from the training data
cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)
# Create a decision tree regressor object
regressor = DecisionTreeRegressor()
# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
params = {'max_depth': list(range(1, 11))}
# Transform 'performance_metric' into a scoring function using 'make_scorer'
scoring_fnc = make_scorer(performance_metric)
# Create the grid search cv object --> GridSearchCV()
grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets)
# Fit the grid search object to the data to compute the optimal model
grid = grid.fit(X, y)
# Return the optimal model after fitting the data
return grid.best_estimator_
Desglose del código:
El código primero importa las funciones DecisionTreeRegressor
, make_scorer
y GridSearchCV
de las bibliotecas sklearn.tree
, sklearn.metrics
y sklearn.model_selection
, respectivamente. A continuación, el código define una función llamada fit_model()
, que toma dos argumentos, X
e y
, que representan los datos de entrenamiento y los valores objetivo, respectivamente. El código luego crea un objeto ShuffleSplit
llamado cv_sets
, que divide los datos de entrenamiento en 10 pliegues, con un 20% de los datos utilizados para las pruebas en cada pliegue. A continuación, el código crea un objeto DecisionTreeRegressor
llamado regressor
. Luego, el código crea un diccionario llamado params
, que asigna el nombre del parámetro max_depth
a una lista de valores del 1 al 10. Luego, el código utiliza la función make_scorer()
para crear una función de puntuación llamada scoring_fnc
, que se utilizará para evaluar el rendimiento de los diferentes modelos. Finalmente, el código crea un objeto GridSearchCV
llamado grid
, que se utilizará para buscar el modelo óptimo. El objeto grid
recibe los objetos regressor
, params
, scoring_fnc
y cv_sets
. Luego, el objeto grid
se ajusta a los datos, lo que encontrará el modelo óptimo. El modelo óptimo se devuelve luego desde la función fit_model()
.
Finalmente, realizaremos predicciones sobre nuevos conjuntos de datos de entrada.
# Assume reg is the trained model obtained from fit_model
# Produce a matrix for client data
client_data = [[5, 17, 15], # Client 1
[4, 32, 22], # Client 2
[8, 3, 12]] # Client 3
# Show predictions
for i, price in enumerate(reg.predict(client_data)):
print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i + 1, price))
Desglose del código:
El código primero crea una matriz llamada client_data
, que contiene los datos del cliente. Luego, el código utiliza la función reg.predict()
para predecir el precio de venta para cada cliente. El código luego utiliza la función enumerate()
para iterar sobre los precios predichos y las identificaciones de los clientes. Luego, el código imprime el precio de venta predicho para cada cliente.
Este proyecto proporciona una aplicación práctica del aprendizaje automático en un entorno del mundo real. Muestra cómo utilizar la regresión para predecir los precios de las viviendas en función de diversas características. El código proporcionado puede servir como punto de partida para una mayor exploración y experimentación.