Puedes leer más artículos de Data Science en español aquí
Sabemos que la ecuación de una línea recta es básicamente:
“Donde b es el intercepto y m es la pendiente de la línea. Así que básicamente, el algoritmo de regresión lineal nos da el valor más óptimo para la intercepción y la pendiente (en dos dimensiones). Las variables y y x siguen siendo las mismas, ya que son las características de los datos y no pueden cambiarse. Los valores que podemos controlar son el intercepto(b) y la pendiente(m). Puede haber múltiples líneas rectas dependiendo de los valores de intercepción y pendiente. Básicamente lo que hace el algoritmo de regresión lineal es ajustar múltiples líneas en los puntos de datos y devolver la línea que da como resultado el menor error.”
Puedes leer más artículos de Data Science en español aquí
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as seabornInstance from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn import metrics%matplotlib inline
dataset = pd.read_csv('/Users/nageshsinghchauhan/Documents/projects/ML/ML_BLOG_LInearRegression/Weather.csv')
dataset.shape
dataset.describe()
dataset.plot(x='MinTemp', y='MaxTemp', style='o') plt.title('MinTemp vs MaxTemp') plt.xlabel('MinTemp') plt.ylabel('MaxTemp') plt.show()
plt.figure(figsize=(15,10)) plt.tight_layout() seabornInstance.distplot(dataset['MaxTemp'])
X = dataset['MinTemp'].values.reshape(-1,1) y = dataset['MaxTemp'].values.reshape(-1,1)
A continuación, dividimos el 80% de los datos al conjunto de entrenamiento mientras que el 20% de los datos al conjunto de pruebas usando el código de abajo.
Puedes leer más artículos de Data Science en español aquí
La variable test_size es nos permite definir la proporción del conjunto de pruebas.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression() regressor.fit(X_train, y_train) #Entrena el algoritmo
#Para obtener el intercepto: print(regressor.intercept_) #Para obtener la pendiente print(regressor.coef_)
El resultado debe ser aproximadamente 10.66185201 y 0.92033997 respectivamente.
df = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': y_pred.flatten()}) df
También podemos visualizar el resultado de la comparación como un gráfico de barras usando el siguiente código:
Nota: Como el número de registros es enorme, para fines de representación sólo tomo 25 registros.
df1 = df.head(25) df1.plot(kind='bar',figsize=(16,10)) plt.grid(which='major', linestyle='-', linewidth='0.5', color='green') plt.grid(which='minor', linestyle=':', linewidth='0.5', color='black') plt.show()
Aunque nuestro modelo no es muy preciso, los porcentajes predichos se acercan a los reales.
plt.scatter(X_test, y_test, color='gray') plt.plot(X_test, y_pred, color='red', linewidth=2) plt.show()
La línea recta del gráfico anterior muestra que nuestro algoritmo es correcto. El paso final es evaluar el desempeño del algoritmo. Este paso es especialmente importante para comparar el rendimiento de los diferentes algoritmos en un determinado dataset. Para los algoritmos de regresión, se utilizan comúnmente tres métricas de evaluación:
1. Error absoluto medio (MAE: Mean Absolute Error) es la media del valor absoluto de los errores. Se calcula como:
2. Error cuadrático medio: (MSE: Mean Squared Error) es la media de los errores al cuadrado y se calcula como:
3. Raíz del error cuadrático medio: (RMSE: Root Mean Squared Error ) es la raíz cuadrada de la media del error al cuadrado
Por suerte, no tenemos que hacer estos cálculos manualmente. La biblioteca de Scikit-Learn viene con funciones pre construidas que pueden ser usadas para averiguar estos valores por nosotros.
Encontremos los valores de estas métricas usando nuestros datos de prueba.
print('Error Absoluto Medio:',metrics.mean_absolute_error(y_test, y_pred)) print('Error Cuadratico Medio:', metrics.mean_squared_error(y_test, y_pred)) print('Raíz del error cuadrático medio:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
Debería recibir esta salida (pero probablemente un poco diferente):
('Error Absoluto Medio:', 3.19932917837853)
('Error Cuadratico Medio:', 17.631568097568447)
('Raíz del error cuadrático medio:', 4.198996082109204)
Se puede ver que el valor Raíz del error cuadrático medio 4,19, lo cual es más del 10% del valor medio de los porcentajes de toda la temperatura, es decir, 22,41. Esto significa que nuestro algoritmo no fue muy preciso pero aún así puede hacer predicciones razonablemente buenas.
Puedes leer más artículos de Data Science en español aquí
Importar todas las librerías requeridas: import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as seabornInstance from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn import metrics %matplotlib inline
dataset = pd.read_csv('/Users/nageshsinghchauhan/Documents/projects/ML/ML_BLOG_LInearRegression/winequality.csv')
Exploremos un poco los datos comprobando el número de filas y columnas en él dataset
dataset.shape
Dará (1599, 12) como salida lo que significa que nuestro conjunto de datos tiene 1599 filas y 12 columnas.
dataset.describe()
Limpiemos un poco nuestros datos, así que primero comprobemos cuáles son las columnas que contienen valores NaN (Que no son un número)
dataset.isnull().any()
dataset = dataset.fillna(method='ffill')
Nuestro siguiente paso es dividir los datos en "atributos" y "etiquetas". La variable X contiene todos los atributos/características y la variable Y contiene las etiquetas.
X = dataset[['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates','alcohol']].values y = dataset['quality'].values
plt.figure(figsize=(15,10)) plt.tight_layout() seabornInstance.distplot(dataset['quality'])
Puedes leer más artículos de Data Science en español aquí
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression() regressor.fit(X_train, y_train)
Como se ha dicho antes, en el caso de la regresión lineal multivariable, el modelo de regresión tiene que encontrar los coeficientes más óptimos para todos los atributos. Para ver qué coeficientes ha elegido nuestro modelo de regresión, ejecute el siguiente código:
coeff_df = pd.DataFrame(regressor.coef_, X.columns, columns=['Coefficient']) coeff_df
“Esto significa que para un aumento de una unidad en la "densidad", hay una disminución de 31,51 unidades en la calidad del vino. Del mismo modo, la disminución en una unidad de los "Cloruros" resulta en un aumento de 1,87 unidades en la calidad del vino. Podemos ver que el resto de los atributos tienen muy poco efecto en la calidad del vino.”
Ahora hagamos una predicción sobre los datos de la prueba.
y_pred = regressor.predict(X_test)
Revisemos la diferencia entre el valor real y el valor previsto.
df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred}) df1 = df.head(25)
df1.plot(kind='bar',figsize=(10,8)) plt.grid(which='major', linestyle='-', linewidth='0.5', color='green') plt.grid(which='minor', linestyle=':', linewidth='0.5', color='black') plt.show()
Como podemos observar aquí, nuestro modelo ha dado muy buenos resultados de predicción.
El paso final es evaluar el rendimiento del algoritmo. Lo haremos encontrando los valores de MAE, MSE y RMSE. Ejecute el siguiente código:
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred)) print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred)) print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
('Mean Absolute Error:', 0.46963309286611077)
('Mean Squared Error:', 0.38447119782012446)
('Root Mean Squared Error:', 0.6200574149384268)
Se puede ver que el valor de la raíz del error cuadrático medio es de 0,62, que es ligeramente superior al 10% del valor de la media que es de 5,63. Esto significa que nuestro algoritmo no fue muy preciso pero aún así puede hacer predicciones razonablemente buenas.
Hay muchos factores que pueden haber contribuido a esta inexactitud, por ejemplo:
1. Necesita más datos: Necesitamos una gran cantidad de datos para obtener la mejor predicción posible.
2. Malas suposiciones: Hicimos la suposición de que estos datos tienen una relación lineal, pero puede que no sea así. Visualizar los datos puede ayudar a determinar eso.
Puedes leer más artículos de Data Science en español aquí
Conclusión
En este artículo, estudiamos los algoritmos de machine learning más fundamentales, es decir, la regresión lineal. Implementamos tanto la regresión lineal simple como la regresión lineal múltiple con la ayuda de la biblioteca de aprendizaje automático de Scikit-Learn.
Espero que hayan disfrutado de la lectura. Háganme saber sus dudas/sugerencias en la sección de comentarios.
Gracias por la lectura.
Feliz Aprendizaje!!
Este artículo también está publicado en KDnuggets.