Trabajando con Python: Machine Learning y la Regresión

Anavelyz Perez
qu4nt
Published in
9 min readJan 27, 2019
Cortesía de pexels.com

El machine learning (ML), en una definición corta, es una rama de la inteligencia artificial encargada de generar algoritmos que tienen la capacidad de aprender por sí mismos según se va repitiendo su ejecución. En ML existen dos tipos de aprendizaje: aprendizaje supervisado y no supervisado, que a su vez poseen dos fases de desarrollo: fase de entrenamiento y fase de prueba.

Veamos un poco más en detalle.

El aprendizaje supervisado es aquel en el cual se entrena un algoritmo de ML facilitándole preguntas (que se traducen en características) y respuestas (organizadas en etiquetas) con el objetivo de generar predicciones. Este modelo recibe el nombre supervisado, pues aprende en muestras de datos donde las respuestas / etiquetas de salida deseadas ya se conocen de antemano pues se han adquirido durante la fase de capacitación. El proceso de aprendizaje se subdivide en dos dimensiones: clasificación y regresión.

El aprendizaje no supervisado, por su parte, permite agrupar los datos según las características que se le facilitan previamente al algoritmo. Existe mucha más información de este tipo de aprendizaje, sin embargo nos centraremos en el aprendizaje supervisado específicamente en la regresión.

Imagen cortesía de Ely Bendersky

La regresión

Es un modelo estadístico que permite establecer un patrón que describe la relación lineal entre variables. Su función principal es examinar y predecir una variable a partir de otra(s). Es por ello que en las tareas de aprendizaje automático cuyo objetivo principal es la estimación del valor, se pueden denominar tareas de la regresión.

Los métodos basados ​​en regresión, están entrenados en muestras de datos de entrada que tienen respuestas de salida como valores numéricos continuos; a diferencia de la clasificación, donde tenemos categorías o clases discretas. Los modelos de regresión se valen de atributos o características de datos de entrada (también llamadas variables explicativas o independientes), y sus correspondientes valores de salida numéricos continuos (también llamados como respuesta, dependiente o variable de resultado), para aprender relaciones y asociaciones específicas entre las entradas y sus salidas correspondientes.

Un dato interesante sobre la regresión se presenta en este articulo donde se indica que esta técnica ocupa el primer puesto entre los 10 algoritmos y métodos más utilizados por la ciencia de datos.

Python: algunas librerías, paquetes o módulos que brindan herramientas para aplicar la regresión.

Como ya habrán visto, en nuestros análisis de datos, nos gusta utilizar Python. Lo consideramos un lenguaje flexible, sencillo y muy maleable. Mostraré algunas de las librerías de Python que utilizamos en nuestros análisis.

Statsmodels

Es una librería de análisis estadístico y econométrico en Python. Proporciona las capacidades para operaciones estadísticas, financieras y econométricas con el objetivo de combinar las ventajas de Python con los poderes estadísticos de los lenguajes como R.

El paquete inicial del statsmodel fue desarrollado por Jonathan Taylor, un estadístico de Stanford, como parte de SciPy bajo el nombre de models. La mejora de esta base de código se aceptó entonces como un proyecto centrado en SciPy para Google Summer of Code en 2009 y nuevamente en 2010. El paquete actual está disponible como SciKit o como un paquete adicional para SciPy.

Al igual que con Pandas y NumPy, la forma más fácil de instalar Statsmodels es a través del paquete Anaconda . Después de instalarlo, deberá importarlo cada vez que quiera usarlo a partir del código:

import statsmodels.api as sm

El módulo statsmodels.regression nos permite aprender modelos lineales sobre datos con i.d.d, es decir, errores distribuidos de forma independiente e idéntica. Además de usar diferentes métodos como mínimos cuadrados ordinarios (OLS), mínimos cuadrados ponderados (WLS), mínimos cuadrados generalizados (GLS), y así sucesivamente, para la estimación de los parámetros del modelo lineal. Se puede realizar regresión lineal simple o múltiple con hasta trece variables.

Funciones estadísticas para matrices encubiertas (scipy.stats.mstats)

Este módulo contiene una gran cantidad de funciones estadísticas que se pueden usar con matrices encubiertas.

La mayoría de estas funciones son similares a las de scipy.stats pero pueden tener pequeñas diferencias en la API o en el algoritmo utilizado. Dado que este es un paquete relativamente nuevo, algunos cambios API aún son posibles.

Específicamente el sub módulo scipy.stats.mstats.linregress permite calcular una regresión lineal de mínimos cuadrados para dos conjuntos de mediciones. Este devuelve:

slope : número real (float) Es la pendiente de la línea de regresión

intercept: número real (float) Es la intersección de la línea de regresión

rvalue : número real (float) Es el coeficiente de correlación

pvalue : número real (float) Valor p (dos colas) para una prueba de hipótesis cuya hipótesis nula es que la pendiente es cero, usando la prueba de Wald con la distribución t para el estadístico de prueba.

stderr : número real(float) Error estándar del parámetro estimado.

Scikit-learn

Scikit-learn es casi el estándar de oro cuando se trata de aprendizaje automático en Python. Tiene muchos algoritmos de aprendizaje, para regresión, clasificación, agrupamiento y reducción de dimensionalidad. Para utilizar la regresión lineal, debemos importarla:

from sklearn import linear_model

Ejemplos

Se crearán dos arreglos con 10 valores aleatorios cada uno, para luego establecer la regresión lineal, fijaremos la semilla para utilizar los valores con dos de las tres opciones vistas (esto se realizará a partir de Numpy). Esto es a partir de las siguientes líneas de código:

import numpy as npnp.random.seed(533869252)x = np.random.random(10)y = np.random.random(10)

Regresión con stats models

La línea sm.OLS(nombre_de_la_variable_dependiente(y), nombre_de_la_variable_independiente(x)) creará el modelo de regresión sin intercepto, si se desea agregar el intercepto se debe adicionar una línea de código con lo siguiente, nombre_de_la_variable_independiente(x) = sm.add_constant(nombre_de_la_variable_independiente(x)). De esta manera nuestro modelo con stats models esta dado por:

import statsmodels.api as smx = sm.add_constant(x)model = sm.OLS(y, x).fit() #Crea el modelo de regresión a partir del método de mínimos cuadrados ordinariosmodel.summary() #Muestra las estadísticas correspondientes al modelo

La salida:

OLS Regression Results 
==============================================================================
Dep. Variable: y R-squared: 0.105
Model: OLS Adj. R-squared: -0.007
Method: Least Squares F-statistic: 0.9372
Date: Sun, 16 Sep 2018 Prob (F-statistic): 0.361
Time: 13:27:07 Log-Likelihood: -0.83655
No. Observations: 10 AIC: 5.673
Df Residuals: 8 BIC: 6.278
Df Model: 1
Covariance Type: nonrobust
====================================================================
coef std err t P>|t| [0.025 0.975]
====================================================================
const 0.6308 0.189 3.329 0.010 0.194 1.068
x1 -0.2578 0.266 -0.968 0.361 -0.872 0.356
==============================================================================
Omnibus: 1.292 Durbin-Watson: 2.206
Prob(Omnibus): 0.524 Jarque-Bera (JB): 0.501
Skew: 0.537 Prob(JB): 0.778
Kurtosis: 2.781 Cond. №4.07
==============================================================================

Observamos que el código nos permite calcular las estadísticas correspondientes al modelo. En este caso tenemos que y=0.6308–0.2578x, además nos permite verificar la significancia individual y conjunta de los valores estimados, esto a partir de t, P>|t| y F-statistic, Prob( F-statistic). En este caso los valores 0.6308 y -0.2578 no son significativos conjuntamente y a su su vez el coeficiente de determinación no es distinto de cero. Por otra parte el valor 0.6308 es estadísticamente significativo mientras que el valor de la pendiente no lo es.

Regresión con scipy.stats
Utilizaremos los mismos datos del ejemplo anterior, ahora la regresión se calcula y muestra por lo siguiente:

from scipy import statsslope, intercept, r_value, p_value, std_err = stats.linregress(x, y)print(“Pendiente (B1):”,slope)print(“Intercepto (B1)”, intercept)print(“Coeficiente de correlación:”, r_value)print(“Valor p asociado a B1:”, p_value)print(“Error estándar de B1:” , std_err)print("R-Cuadrado:", r_value**2)

La salida para este caso son valores:

Pendiente (B1): -0.2578
Intercepto (B0): 0.6308
Coeficiente de correlación: -0.3238
Valor p asociado a B1: 0.3614
Error estándar de B1: 0.2663
R-Cuadrado: 0.1049

Regresión con scikit-learn

Para este caso importaremos una data que corresponde a 442 individuos, a los cuales se les midió 10 variables. Estos datos están en la librería y solo es cuestión de importarlos, el ejemplo que se presentará a continuación esta tomado de los ejemplos descritos aquí.

import  numpy  as np 
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
#Cargando el conjunto de datos diabetes
diabetes = datasets.load_diabetes ()


# Para utilizar una sola variable
diabetes_X = diabetes.data[:, np.newaxis, 2]

#Divide los datos en conjuntos de entrenamiento / prueba
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# Divide los objetivos en los conjuntos de entrenamiento / prueba
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]

# Crear objeto de regresión lineal
lm= linear_model.LinearRegression()

# Entrenar al modelo usando los datos de entrenamiento
lm.fit(diabetes_X_train, diabetes_y_train)
# Hacer predicciones usando el conjunto de pruebas
diabetes_y_pred = lm.predict(diabetes_X_test)

# Los coeficientes
print('Coeficientes: \n', lm.coef_)
# Cuadrado medio del error
print("Cuadrado medio del error: %.2f"
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# Coeficiente de variación
print('R-Cuadrado: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))

En este ejemplo ya es más evidente el procedimiento para aplicar la regresión, pues se esta dividiendo la data en dos partes con la finalidad de que la maquina aprenda y realice predicciones.

La salida del código anterior son los números correspondientes al coeficiente de variación y al cuadrado medio del error.

¿Machine Learning con Regresión?

Utilizaremos la data con el nombre Boston que esta disponible en la librería de sklearn,

from sklearn.datasets import load_boston boston = load_boston()

A continuación importamos las funciones del mismo sklearn que nos permitirán dividir los datos en dos partes (para entrenar y para hacer el testing) y también la función que calcula el modelo de regresión.

from sklearn.model_selection import train_test_split as ttsfrom sklearn.linear_model import LinearRegression

La siguiente línea nos permite ver la cantidad de observaciones y características de la data

boston.data.shape

Ahora asignaremos las características y la data a dos variables para facilitar y evitar tanta escritura en el código

dt = boston.data #datatg = boston.target #características

A continuación dividiremos la data Boston en dos partes, una para entrenamiento (x_ent, y_ent) y la otra para el test (x_test, y_test)

x_ent, x_test, y_ent, y_test = tts(dt, tg)

Para entrenar utilizamos la data de entrenamiento

lm = LinearRegression()
lm.fit(x_ent, y_ent)

Entonces verificamos que tanto aprendió el algoritmo mediante

lm.score(x_test,y_test )

da una puntuación entre 0 y 1, donde el 1 indica que el algoritmo aprendió a la perfección y 0 que no aprendió nada.

Guardar el algoritmo ya entrenado

from sklearn.externals import joblibjoblib.dump(lm, “Modelo_entrenado.pkl”)

Utilizar el modelo entrenado que hemos guardado

from sklearn.externals import joblib
from
sklearn import datasets
lm = joblib.load(“Modelo_entrenado.pkl”)boston = datasets.load_boston()lm.score(boston.data, boston.target)

Referencias

S/A S/F. Regresión simple y múltiple con Python. Artículo disponible desde https://towardsdatascience.com/simple-and-multiple-linear-regression-in-python-c928425168f9

S/A SciKit de regresión lineal. Disponible desde https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py

S/A Guía de Referencia de SciPy. Disponible desde https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.linregress.html

S/A Documentación de StatsModels. Disponible desde http://www.statsmodels.org/stable/index.html

Sarkar, Bali & Tushar. (2018). SharmaPractical Machine Learning with Python. A Problem-Solver’s Guide to Building Real-World Intelligent Systems. Dipanjan Sarkar, Raghav Bali and Tushar Sharma.

--

--