Uso del aprendizaje automático para predecir el clima: Parte 2

Este artículo es una continuación del artículo anterior en una serie de tres partes sobre el uso de Machine Learning en Python para predecir las temperaturas climáticas para la ciudad de L...

Este artículo es una continuación del artículo anterior en una serie de tres partes sobre el uso de Machine Learning en Python para predecir las temperaturas climáticas para la ciudad de Lincoln, Nebraska en los Estados Unidos, según los datos recopilados de los servicios API de Weather Underground.

En el primer artículo de la serie, Uso del aprendizaje automático para predecir el clima: Parte 1, describí cómo para extraer los datos de Weather Underground, analizarlos y limpiarlos. Para obtener un resumen de los temas de cada uno de los artículos presentados en esta serie, consulte la introducción del artículo anterior.

El enfoque de este artículo será describir los procesos y pasos necesarios para construir un modelo de regresión lineal riguroso para predecir valores de temperatura diarios medios futuros basados ​​en el conjunto de datos creado en el artículo anterior. Para construir el modelo de Regresión Lineal, estaré demostrando el uso de dos bibliotecas de Python importantes en la industria del Aprendizaje Automático: Scikit-Aprender y EstadísticasModelos .

En el tercer artículo de la serie, Uso del aprendizaje automático para predecir el clima: Parte 3, describo cómo los procesos y los pasos necesarios para construir una red neuronal utilizando TensorFlow de Google para predecir las temperaturas diarias medias futuras. Con este método, puedo comparar los resultados con el modelo de regresión lineal.

Volver a familiarizarnos con el conjunto de datos {#volver a familiarizarnos con el conjunto de datos}

En este repositorio de GitHub encontrará un Jupyter Notebook con el nombre de archivo Weather Underground API.ipynb que describe paso a paso las acciones necesarias para recopilar los conjunto de datos con el que trabajaremos en este artículo y en el último. Además, en este repositorio encontrará un archivo Pandas DataFrame en escabeche llamado end-part1_df.pkl. Por lo tanto, si desea continuar sin pasar por la dolorosa experiencia de recopilar, procesar y limpiar los datos descritos en el artículo anterior, descargue el archivo pickle y use el siguiente código para deserializar los datos nuevamente en un Pandas DataFrame para su uso en esta sección.

1
2
3
import pickle
with open('end-part1_df.pkl', 'rb') as fp:
    df = pickle.load(fp)

Si recibe un error que indica No hay ningún módulo llamado 'pandas.indexes', es probable que esté usando una versión de pandas más nueva que la que estaba usando al momento de escribir este artículo (v0.18.1).

Para evitar esto, desde entonces he incluido un archivo CSV en el repositorio que contiene los datos del final de la parte 1 que puede leer usando el siguiente código:

1
2
import pandas as pd
df = pd.read_csv('end-part2_df.csv').set_index('date')

Antecedentes sobre la regresión lineal usando mínimos cuadrados ordinarios

La regresión lineal tiene como objetivo aplicar un conjunto de suposiciones primarias con respecto a las relaciones lineales y técnicas numéricas para predecir un resultado (Y, también conocido como la variable dependiente) basado en uno o más predictores (las variables independientes de X) con el objetivo final de establecer un modelo (fórmula matemática) para predecir resultados dados solo los valores predictores con cierta cantidad de incertidumbre.

La fórmula generalizada para un modelo de regresión lineal es:

ŷ = β0 + β1 * x1 + β2 * x2 + ... + β(p-n) x(p-n) + Ε

dónde:

  • ŷ es la variable de resultado prevista (variable dependiente)
  • x~j~ son las variables predictoras (variables independientes) para los parámetros j = 1,2,..., p-1
  • β~0~ es el intercepto o el valor de ŷ cuando cada x~j~ es igual a cero
  • β~j~ es el cambio en ŷ basado en un cambio de una unidad en uno de los correspondientes x~j~
  • Ε es un término de error aleatorio asociado con la diferencia entre el valor previsto de ŷ~i~ y el valor real de y~i~

Ese último término en la ecuación de la regresión lineal es muy importante. La forma más básica de construir un modelo de regresión lineal se basa en un algoritmo conocido como mínimos cuadrados ordinarios que encuentra la combinación de los valores de β~j~\ que minimizan el término Ε.

Selección de funciones para nuestro modelo

Una suposición clave requerida por la técnica de regresión lineal es que tiene una relación lineal entre la variable dependiente y cada variable independiente. Una forma de evaluar la linealidad entre nuestra variable independiente, que por ahora será la temperatura media, y el resto de variables independientes es calcular el Coeficiente de conexión de Pearson.

El coeficiente de correlación de Pearson (r) es una medida de la cantidad de correlación lineal entre matrices de igual longitud que genera un valor que oscila entre -1 y 1. Los valores de correlación que oscilan entre 0 y 1 representan una correlación positiva cada vez más fuerte. Con esto quiero decir que dos series de datos están correlacionadas positivamente cuando los valores de una serie de datos aumentan simultáneamente con los valores de la otra serie y, a medida que ambos aumentan en una magnitud cada vez mayor, el valor de la correlación de Pearson se aproximará a 1.

Se dice que los valores de correlación de 0 a -1 están inversamente correlacionados, o negativamente, en el sentido de que cuando los valores de una serie aumentan, los valores correspondientes en la serie opuesta disminuyen pero, a medida que los cambios en magnitud entre las series se igualan (con dirección opuesta) el valor de correlación se aproximará a -1. Los valores de correlación de Pearson que se encuentran muy cerca de ambos lados de cero sugieren una relación lineal débil, que se vuelve más débil a medida que el valor se acerca a cero.

Las opiniones varían entre los estadísticos y los libros de estadísticas sobre límites claros para los niveles de fuerza de un coeficiente de correlación. Sin embargo, he encontrado que un conjunto generalmente aceptado de clasificaciones para las fuerzas de correlación son las siguientes:

Interpretación del valor de correlación

0.8 - 1.0 Muy fuerte 0.6 - 0.8 Fuerte 0.4 - 0.6 Moderado 0.2 - 0.4 Débil 0.0 - 0.2 Muy Débil

Para evaluar la correlación en estos datos, llamaré al método corr() del objeto Pandas DataFrame. Encadenado a esta llamada al método corr(), puedo seleccionar la columna de interés ("meantempm") y nuevamente encadenar otra llamada al método sort_values() en el objeto Pandas Series resultante. Esto generará los valores de correlación de los más correlacionados negativamente a los más correlacionados positivamente.

1
df.corr()[['meantempm']].sort_values('meantempm')
                meantempm

maxpresionm_1 -0.519699 maxpresionm_2 -0.425666 maxpresionm_3 -0.408902 presión mediam_1 -0.365682 presión mediam_2 -0.269896 presión mediam_3 -0.263008 minpresionm_1 -0.201003 minhumedad_1 -0.148602 minhumedad_2 -0.143211 minhumedad_3 -0.118564 minpresionm_2 -0.104455 minpresionm_3 -0.102955 precipm_2 0.084394 precipm_1 0.086617 precipm_3 0.098684 maxhumedad_1 0.132466 maxhumedad_2 0.151358 maxhumedad_3 0.167035 maxdewptm_3 0.829230 maxtempm_3 0.832974 mindewptm_3 0.833546 meandroptm_3 0.834251 mintempm_3 0.836340 maxdewptm_2 0.839893 meandroptm_2 0.848907 mindewptm_2 0.852760 mintempm_2 0.854320 meantempm_3 0.855662 maxtempm_2 0.863906 meantempm_2 0.881221 maxdewptm_1 0.887235 meandrowptm_1 0.896681 mindewptm_1 0.899000 mintempm_1 0.905423 maxtempm_1 0.923787 meantempm_1 0.937563 mintempm 0.973122 maxtempm 0.976328 tiempo medio 1.000000

Al seleccionar características para incluir en este modelo de regresión lineal, me gustaría cometer el error de ser un poco menos permisivo al incluir variables con coeficientes de correlación moderados o más bajos. Por lo tanto, eliminaré las funciones que tengan valores de correlación inferiores al valor absoluto de 0,6. Además, dado que las variables "mintempm" y "maxtempm" son para el mismo día que la variable de predicción "meantempm", también las eliminaré (es decir, si ya conozco las temperaturas mínima y máxima, entonces ya tengo la respuesta a mi predicción).

Con esta información, ahora puedo crear un nuevo DataFrame que solo contenga mis variables de interés.

1
2
3
4
5
6
7
predictors = ['meantempm_1',  'meantempm_2',  'meantempm_3', 
              'mintempm_1',   'mintempm_2',   'mintempm_3',
              'meandewptm_1', 'meandewptm_2', 'meandewptm_3',
              'maxdewptm_1',  'maxdewptm_2',  'maxdewptm_3',
              'mindewptm_1',  'mindewptm_2',  'mindewptm_3',
              'maxtempm_1',   'maxtempm_2',   'maxtempm_3']
df2 = df[['meantempm'] + predictors]

Visualización de las relaciones {#visualización de las relaciones}

Debido a que la mayoría de las personas, incluido yo mismo, están mucho más acostumbradas a mirar imágenes para evaluar y verificar patrones, graficaré cada uno de estos predictores seleccionados para probarme a mí mismo que, de hecho, existe una relación lineal. Para hacer esto, utilizaré el módulo pyplot de matplotlib.

Para esta gráfica, me gustaría que la variable dependiente "meantempm" sea el eje Y consistente a lo largo de las 18 gráficas de variables predictoras. Una forma de lograr esto es crear una cuadrícula de parcelas. Pandas viene con una función de trazado útil llamada scatter_plot(), pero generalmente solo la uso cuando solo hay unas 5 variables porque convierte el gráfico en una matriz N x N (18 x 18 en nuestro caso) , lo que hace difícil ver los detalles en los datos. En su lugar, crearé una estructura de cuadrícula con seis filas de tres columnas para evitar sacrificar la claridad en los gráficos.

1
2
3
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%matplotlib inline

# manually set the parameters of the figure to and appropriate size
plt.rcParams['figure.figsize'] = [16, 22]

# call subplots specifying the grid structure we desire and that 
# the y axes should be shared
fig, axes = plt.subplots(nrows=6, ncols=3, sharey=True)

# Since it would be nice to loop through the features in to build this plot
# let us rearrange our data into a 2D array of 6 rows and 3 columns
arr = np.array(predictors).reshape(6, 3)

# use enumerate to loop over the arr 2D array of rows and columns
# and create scatter plots of each meantempm vs each feature
for row, col_arr in enumerate(arr):
    for col, feature in enumerate(col_arr):
        axes[row, col].scatter(df2[feature], df2['meantempm'])
        if col == 0:
            axes[row, col].set(xlabel=feature, ylabel='meantempm')
        else:
            axes[row, col].set(xlabel=feature)
plt.show()

meantempm scatter plot{.img-responsive}

De los gráficos anteriores se puede reconocer que todas las variables predictoras restantes muestran una buena relación lineal con la variable de respuesta ("meantempm"). Además, también vale la pena señalar que todas las relaciones se ven uniformemente distribuidas al azar. Con esto quiero decir que parece haber una variación relativamente igual en la distribución de valores desprovista de forma de abanico o de cono. Una distribución aleatoria uniforme de dispersión a lo largo de los puntos también es otra suposición importante de la regresión lineal usando el algoritmo Mínimos cuadrados ordinarios.

Uso de la regresión paso a paso para construir un modelo sólido {#uso de la regresión paso a paso para construir un modelo sólido}

Un modelo de regresión lineal robusto debe utilizar pruebas estadísticas para seleccionar predictores significativos, estadísticamente significativos, para incluir. Para seleccionar características estadísticamente significativas, utilizaré la biblioteca statsmodels de Python. Sin embargo, antes de pasar a la implementación práctica del uso de la biblioteca statsmodels, me gustaría dar un paso atrás y explicar algunos de los significados teóricos y el propósito de adoptar este enfoque.

Un aspecto clave del uso de métodos estadísticos como la regresión lineal en un proyecto de análisis es el establecimiento y prueba de pruebas de hipótesis para validar la importancia de las suposiciones hechas sobre los datos en estudio. Hay numerosas pruebas de hipótesis que se han desarrollado para probar la solidez de un modelo de regresión lineal contra varias suposiciones que se hacen. Una de esas pruebas de hipótesis es evaluar la importancia de cada una de las variables predictoras incluidas.

La definición formal de la prueba de hipótesis para la significancia de los parámetros β~j~ es la siguiente:

  • H~0~: β~j~ = 0, la hipótesis nula establece que el predictor no tiene efecto en el valor de la variable de resultado
  • H~a~: β~j~ ≠ 0, la hipótesis alternativa es que el predictor tiene un efecto significativo en el valor de la variable de resultado

Mediante el uso de pruebas de probabilidad para evaluar la probabilidad de que cada β~j~ sea significativo más allá de la simple probabilidad aleatoria en un umbral Α seleccionado, podemos ser más estrictos en la selección de las variables a incluir, lo que da como resultado un modelo más sólido.

Sin embargo, en muchos conjuntos de datos pueden ocurrir interacciones entre variables que pueden conducir a interpretaciones falsas de estas simples pruebas de hipótesis. Para probar los efectos de las interacciones en la importancia de cualquier variable en un modelo de regresión lineal, a menudo se aplica una técnica conocida como regresión paso a paso. Con la regresión paso a paso, agrega o elimina variables del modelo y evalúa la importancia estadística de cada variable en el modelo resultante.

En este artículo, usaré una técnica conocida como eliminación hacia atrás, donde comienzo con un modelo general totalmente cargado que incluye todas mis variables de interés.

La eliminación hacia atrás funciona de la siguiente manera:

  1. Seleccione un nivel de significancia Α para el cual pruebe su hipótesis para determinar si una variable debe permanecer en el modelo
  2. Ajuste el modelo con todas las variables predictoras
  3. Evalúe los valores p de los coeficientes β~j~ y para el que tenga el mayor valor p, si el valor p > Α avance al paso 4, si no, tiene su modelo final
  4. Eliminar el predictor identificado en el paso 3
  5. Vuelva a ajustar el modelo, pero esta vez sin la variable eliminada y vuelva al paso 3

Entonces, sin más demora, construyamos este modelo generalizado completamente cargado usando statsmodels siguiendo los pasos anteriores.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# import the relevant module
import statsmodels.api as sm

# separate our my predictor variables (X) from my outcome variable y
X = df2[predictors]
y = df2['meantempm']

# Add a constant to the predictor variable set to represent the Bo intercept
X = sm.add_constant(X)
X.ix[:5, :5]
           const   meantempm_1   meantempm_2   meantempm_3   mintempm_1

fecha 2015-01-04 1,0 -4,0 -6,0 -6,0 -13,0 2015-01-05 1,0 -14,0 -4,0 -6,0 -18,0 2015-01-06 1,0 -9,0 -14,0 -4,0 -14,0 2015-01-07 1,0 -10,0 -9,0 -14,0 -14,0 2015-01-08 1,0 -16,0 -10,0 -9,0 -19,0

1
2
3
4
5
6
7
8
# (1) select a significance value
alpha = 0.05

# (2) Fit the model
model = sm.OLS(y, X).fit()

# (3) evaluate the coefficients' p-values
model.summary()

La llamada summary () producirá los siguientes datos en su cuaderno Jupyter:


dep. Variable: meantempm R-cuadrado: 0,895 Modelo: OLS Adj. R-cuadrado: 0,893 Método: Estadístico F de mínimos cuadrados: 462,7 Fecha: jueves, 16 de noviembre de 2017 Prob (estadística F): 0,00 Hora: 20:55:25 Log-Verosimilitud: -2679.2 N° Observaciones: 997 AIC: 5396. Df Residuales: 978 BIC: 5490. Modelo Df: 18 Tipo de covarianza: no robusto


: Resultados de la regresión OLS

 


             coef      std err   t        P\>\|t\|   \[0.025   0.975\]

constante 1,0769 0,526 2,049 0,041 0,046 2,108 meantempm_1 0.1047 0.287 0.364 0.716 -0.459 0.669 meantempm_2 0.3512 0.287 1.225 0.221 -0.211 0.914 meantempm_3 -0.1084 0.286 -0.379 0.705 -0.669 0.453 mintempm_1 0,0805 0,149 0,539 0,590 -0,213 0,373 mintempm_2 -0.2371 0.149 -1.587 0.113 -0.530 0.056 mintempm_3 0,1521 0,148 1,028 0,304 -0,138 0,443 meandrowptm_1 -0.0418 0.138 -0.304 0.761 -0.312 0.228 meandrowptm_2 -0.0121 0.138 -0.088 0.930 -0.282 0.258 meandrowptm_3 -0.0060 0.137 -0.044 0.965 -0.275 0.263 maxdewptm_1 -0.1592 0.091 -1.756 0.079 -0.337 0.019 maxdewptm_2 -0.0113 0.091 -0.125 0.900 -0.189 0.166 maxdewptm_3 0.1326 0.089 1.492 0.136 -0.042 0.307 mindewptm_1 0.3638 0.084 4.346 0.000 0.200 0.528 mindewptm_2 -0.0119 0.088 -0.136 0.892 -0.184 0.160 mindewptm_3 -0.0239 0.086 -0.279 0.780 -0.192 0.144 maxtempm_1 0.5042 0.147 3.438 0.001 0.216 0.792 maxtempm_2 -0.2154 0.147 -1.464 0.143 -0.504 0.073 maxtempm_3 0.0809 0.146 0.555 0.579 -0.205 0.367


 


Ómnibus: 13.252 Durbin-Watson: 2.015 Prob(Todos): 0,001 Jarque-Bera (JB): 17,097 Sesgo: -0,163 Prob(JB): 0,000194 Curtosis: 3.552 Cond. nº 291.


Ok, reconozco que la llamada a summary() solo vomitó una gran cantidad de información en la pantalla. ¡No te abrumes! Solo nos vamos a centrar en unos 2-3 valores en este artículo:

  1. P>|t| - este es el valor p que mencioné anteriormente que usaré para evaluar la prueba de hipótesis. Este es el valor que vamos a usar para determinar si eliminar una variable en esta técnica de eliminación hacia atrás paso a paso.
  2. R-cuadrado: una medida que indica cuánto de la variación general en el resultado puede explicar nuestro modelo
  3. Adj. R-cuadrado: lo mismo que R-cuadrado pero, para la regresión lineal múltiple, este valor tiene una penalización que se le aplica en función del número de variables que se incluyen para explicar el nivel de sobreajuste.

Esto no quiere decir que los otros valores en esta salida carezcan de mérito, todo lo contrario. Sin embargo, tocan las idiosincrasias más esotéricas de la regresión lineal en las que simplemente no tenemos tiempo para entrar ahora. Para obtener una explicación completa de ellos, lo remitiré a un libro de texto de regresión avanzada como el de Kutner [Modelos de regresión lineal aplicados, 5ª ed.] (http://stackabu.se/applied-linear-regression-models) como así como la documentación statsmodels.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# (3) cont. - Identify the predictor with the greatest p-value and assess if its > our selected alpha.
#             based off the table it is clear that meandewptm_3 has the greatest p-value and that it is
#             greater than our alpha of 0.05

# (4) - Use pandas drop function to remove this column from X
X = X.drop('meandewptm_3', axis=1)

# (5) Fit the model 
model = sm.OLS(y, X).fit()

model.summary()

dep. Variable: meantempm R-cuadrado: 0,895 Modelo: OLS Adj. R-cuadrado: 0,893 Método: Estadístico F de mínimos cuadrados: 490,4 Fecha: jueves, 16 de noviembre de 2017 Prob (estadística F): 0,00 Hora: 20:55:41 Probabilidad logarítmica: -2679,2 N° Observaciones: 997 AIC: 5394. Df Residuales: 979 BIC: 5483. Modelo Df: 17 Tipo de covarianza: no robusto


: Resultados de la regresión OLS

 


             coef      std err   t        P\>\|t\|   \[0.025   0.975\]

constante 1,0771 0,525 2,051 0,041 0,046 2,108 meantempm_1 0.1040 0.287 0.363 0.717 -0.459 0.667 meantempm_2 0.3513 0.286 1.226 0.220 -0.211 0.913 meantempm_3 -0.1082 0.286 -0.379 0.705 -0.669 0.452 mintempm_1 0,0809 0,149 0,543 0,587 -0,211 0,373 mintempm_2 -0.2371 0.149 -1.588 0.113 -0.530 0.056 mintempm_3 0,1520 0,148 1,028 0,304 -0,138 0,442 meandrowptm_1 -0.0419 0.137 -0.305 0.761 -0.312 0.228 meandrowptm_2 -0.0121 0.138 -0.088 0.930 -0.282 0.258 maxdewptm_1 -0.1592 0.091 -1.757 0.079 -0.337 0.019 maxdewptm_2 -0.0115 0.090 -0.127 0.899 -0.189 0.166 maxdewptm_3 0.1293 0.048 2.705 0.007 0.036 0.223 mindewptm_1 0.3638 0.084 4.349 0.000 0.200 0.528 mindewptm_2 -0.0119 0.088 -0.135 0.892 -0.184 0.160 mindewptm_3 -0.0266 0.058 -0.456 0.648 -0.141 0.088 maxtempm_1 0.5046 0.146 3.448 0.001 0.217 0.792 maxtempm_2 -0.2154 0.147 -1.465 0.143 -0.504 0.073 maxtempm_3 0.0809 0.146 0.556 0.579 -0.205 0.367


 


Ómnibus: 13.254 Durbin-Watson: 2.015 Prob(Todos): 0,001 Jarque-Bera (JB): 17,105 Sesgo: -0,163 Prob(JB): 0,000193 Curtosis: 3.553 Cond. nº 286.


Con respecto a su tiempo de lectura y en un intento por mantener el artículo en una extensión razonable, voy a omitir los ciclos de eliminación restantes necesarios para construir cada nuevo modelo, evaluar los valores p y eliminar el valor menos significativo. En su lugar, pasaré directamente al último ciclo y le proporcionaré el modelo final. Después de todo, el objetivo principal aquí era describir el proceso y el razonamiento detrás de él.

A continuación encontrará el resultado del modelo final en el que convergí después de aplicar la técnica de eliminación hacia atrás. Puede ver en la salida que todos los predictores restantes tienen valores p significativamente por debajo de nuestro Α de 0.05. Otra cosa que merece atención son los valores de R-cuadrado en el resultado final. Dos cosas a tener en cuenta aquí son (1) el R-cuadrado y Adj. Los valores de R-cuadrado son iguales, lo que sugiere que existe un riesgo mínimo de que nuestro modelo esté sobreajustado por variables excesivas y (2) el valor de 0,894 se interpreta de tal manera que nuestro modelo final explica alrededor del 90 % de la variación observada en la variable de resultado , el "tiempo medio".

1
2
model = sm.OLS(y, X).fit()
model.summary()

dep. Variable: meantempm R-cuadrado: 0,894 Modelo: OLS Adj. R-cuadrado: 0,894 Método: Estadístico F de mínimos cuadrados: 1196. Fecha: jueves, 16 de noviembre de 2017 Prob (estadística F): 0,00 Hora: 20:55:47 Probabilidad logarítmica: -2681,7 N° Observaciones: 997 AIC: 5379. Df Residuales: 989 BIC: 5419. Modelo Df: 7 Tipo de covarianza: no robusto


: Resultados de la regresión OLS

 


            coef      std err   t        P\>\|t\|   \[0.025   0.975\]

constante 1,1534 0,411 2,804 0,005 0,346 1,961 mintempm_1 0,1310 0,053 2,458 0,014 0,026 0,236 mintempm_2 -0.0964 0.037 -2.620 0.009 -0.169 -0.024 mintempm_3 0,0886 0,041 2,183 0,029 0,009 0,168 maxdewptm_1 -0.1939 0.047 -4.117 0.000 -0.286 -0.101 maxdewptm_3 0.1269 0.040 3.191 0.001 0.049 0.205 mindewptm_1 0.3352 0.051 6.605 0.000 0.236 0.435 maxtempm_1 0.5506 0.024 22.507 0.000 0.503 0.599


 


Ómnibus: 13.123 Durbin-Watson: 1.969 Prob(Todos): 0,001 Jarque-Bera (JB): 16,871 Sesgo: -0,163 Prob(JB): 0,000217 Curtosis: 3.548 Cond. nº 134.


Uso del módulo de regresión lineal de SciKit-Learn para predecir el clima {#uso del módulo de regresión lineal de SciKit-Learn para predecir el clima}

Ahora que hemos seguido los pasos para seleccionar predictores estadísticamente significativos (características), podemos usar SciKit-Learn para crear un modelo de predicción y probar su capacidad para predecir la media. la temperatura. SciKit-Learn es una biblioteca de aprendizaje automático muy bien establecida que se usa ampliamente tanto en la industria como en el mundo académico. Una cosa que es muy impresionante sobre SciKit-Learn es que mantiene una API muy consistente de "ajuste", "predecir" y "prueba" a través de muchas técnicas numéricas y algoritmos, lo que hace que su uso sea muy simple. Además de este diseño de API consistente, SciKit-Learn también viene con varias herramientas útiles para procesar datos comunes a muchos proyectos de aprendizaje automático.

Comenzaremos usando SciKit-Learn para dividir nuestro conjunto de datos en conjuntos de prueba y entrenamiento importando la función train_test_split() desde el módulo sklearn.model_selection. Dividiré los conjuntos de datos de entrenamiento y prueba en un 80 % de entrenamiento y un 20 % de prueba, y asignaré un estado_aleatorio de 12 para garantizar que obtendrá la misma selección aleatoria de datos que yo. Este parámetro random_state es muy útil para la reproducibilidad de los resultados.

1
from sklearn.model_selection import train_test_split
1
2
3
4
# first remove the const column because unlike statsmodels, SciKit-Learn will add that in for us
X = X.drop('const', axis=1)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12)

La siguiente acción a realizar es construir el modelo de regresión utilizando el conjunto de datos de entrenamiento. Para hacer esto, importaré y usaré la clase LinearRegression del módulo sklearn.linear_model. Como se mencionó anteriormente, scikit-learn obtiene importantes puntos de bonificación de usabilidad al implementar una API común fit() y predict() en sus numerosas técnicas numéricas, lo que hace que el uso de la biblioteca sea muy fácil de usar.

1
from sklearn.linear_model import LinearRegression
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# instantiate the regressor class
regressor = LinearRegression()

# fit the build the model by fitting the regressor to the training data
regressor.fit(X_train, y_train)

# make a prediction set using the test set
prediction = regressor.predict(X_test)

# Evaluate the prediction accuracy of the model
from sklearn.metrics import mean_absolute_error, median_absolute_error
print("The Explained Variance: %.2f" % regressor.score(X_test, y_test))
print("The Mean Absolute Error: %.2f degrees celsius" % mean_absolute_error(y_test, prediction))
print("The Median Absolute Error: %.2f degrees celsius" % median_absolute_error(y_test, prediction))
1
2
3
The Explained Variance: 0.90
The Mean Absolute Error: 2.69 degrees celsius
The Median Absolute Error: 2.17 degrees celsius

Como puede ver en las pocas líneas de código anteriores, usar scikit-learn para construir un modelo de predicción de regresión lineal es bastante simple. Aquí es realmente donde la biblioteca brilla en su capacidad para ajustar fácilmente un modelo y hacer predicciones sobre un resultado de interés.

Para obtener una comprensión interpretativa de la validez de los modelos, utilicé la función score() del modelo regresor para determinar que el modelo es capaz de explicar alrededor del 90 % de la varianza observada en la variable de resultado, la temperatura media. Además, utilicé mean_absolute_error() y median_absolute_error() del módulo sklearn.metrics para determinar que, en promedio, el valor predicho es de aproximadamente 3 grados centígrados y la mitad del tiempo es de aproximadamente 2 grados. Celsius.

Recursos

¿Quiere aprender las herramientas, las técnicas de aprendizaje automático y el análisis de datos utilizados en este tutorial? Aquí hay algunos recursos excelentes para comenzar:

Conclusión

En este artículo, demostré cómo usar el algoritmo de aprendizaje automático de regresión lineal para predecir las temperaturas climáticas medias futuras en función de los datos recopilados en el [artículo anterior](/usando-el-aprendizaje-automatico-para-predecir-el-clima- parte-1/). Demostré cómo usar la biblioteca statsmodels para seleccionar predictores estadísticamente significativos basados ​​en métodos estadísticos sólidos. Luego utilicé esta información para ajustar un modelo de predicción basado en un subconjunto de entrenamiento usando la clase LinearRegression de Scikit-Learn. Usando este modelo ajustado, pude predecir los valores esperados basados ​​en las entradas de un subconjunto de prueba y evaluar la precisión de la predicción, lo que indica una cantidad razonable de precisión.

Me gustaría agradecerle por leer mi artículo y espero que espere con ansias el próximo artículo final de esta serie de aprendizaje automático donde describo cómo construir una red neuronal para predecir la temperatura del clima.