En este artículo, discutimos 8 formas de realizar una regresión lineal simple usando código / paquetes de Python. Pasamos por alto sus pros y contras, y mostramos su medida relativa de complejidad computacional.
Para muchos científicos de datos, la regresión lineal es el punto de partida de muchos proyectos de modelado estadístico y análisis predictivo. No se puede subestimar la importancia de ajustar (con precisión y rapidez) un modelo lineal a un gran conjunto de datos. Como se señaló en este artículo, el término ' LINEAL ' en el modelo de regresión lineal se refiere a los coeficientes y no al grado de las características.
Las características (o variables independientes) pueden ser de cualquier grado o incluso funciones trascendentales como exponencial, logarítmica, sinusoidal. Por lo tanto, se puede modelar un gran cuerpo de fenómenos naturales (aproximadamente) utilizando estas transformaciones y el modelo lineal, incluso si la relación funcional entre la salida y las características es altamente no lineal.
Por otro lado, Python está emergiendo rápidamente como el lenguaje de programación de facto elegido por los científicos de datos. Por lo tanto, es fundamental que un científico de datos conozca todos los métodos para ajustar rápidamente un modelo lineal a un conjunto de datos bastante grande y evaluar la importancia relativa de cada característica en el resultado del proceso.
Sin embargo, ¿hay solo una forma de realizar análisis de regresión lineal en Python? En caso de múltiples opciones disponibles, ¿cómo elegir el método más efectivo?Debido a la gran popularidad de la biblioteca de aprendizaje automático scikit-learn, un enfoque común suele ser llamar a la clase Modelo lineal desde esa biblioteca y ajustar los datos. Si bien esto puede ofrecer ventajas adicionales de aplicar otras características de canalización del aprendizaje automático (por ejemplo, normalización de datos, regularización de coeficientes de modelo, alimentar el modelo lineal a otro modelo posterior), a menudo este no es el método más rápido o más limpio cuando un analista de datos solo necesita una y una forma sencilla de determinar los coeficientes de regresión (y algunas estadísticas básicas asociadas).
Hay métodos más rápidos y limpios. Pero es posible que no todos ofrezcan la misma cantidad de información o flexibilidad de modelado.
Por favor sigue leyendo.
El código completo de la placa de la caldera para varios métodos de regresión lineal está disponible aquí en mi repositorio de GitHub. La mayoría de ellos se basan en el paquete SciPy.
SciPy es una colección de algoritmos matemáticos y funciones de conveniencia basadas en la extensión Numpy de Python . Agrega una potencia significativa a la sesión interactiva de Python al proporcionar al usuario comandos y clases de alto nivel para manipular y visualizar datos.
Permítanme discutir cada método brevemente,
Método: Scipy.polyfit () o numpy.polyfit ()

Esta es una función de ajuste polinomial de mínimos cuadrados bastante general que acepta el conjunto de datos y una función polinomial de cualquier grado (especificado por el usuario), y devuelve una matriz de coeficientes que minimiza el error al cuadrado. Aquí se proporciona una descripción detallada de la función. Para la regresión lineal simple, se puede elegir el grado 1. Si desea ajustar un modelo de mayor grado, puede construir entidades polinomiales a partir de los datos de entidades lineales y ajustarlas también al modelo.
Método: Stats.linregress ()

Esta es una función de regresión lineal altamente especializada disponible dentro del módulo de estadísticas de Scipy. Tiene una flexibilidad bastante restringida, ya que está optimizado para calcular una regresión lineal de mínimos cuadrados solo para dos conjuntos de medidas. Por lo tanto, no puede ajustar un modelo lineal generalizado o una regresión multivariable usando esto. Pero, debido a su naturaleza especializada, es uno de los métodos más rápidos cuando se trata de regresión lineal simple. Aparte del coeficiente de intercepción y equipada plazo, también devuelve las estadísticas básicas tales como R coeficiente ² y el error estándar.
Método: Optimize.curve_fit ()

Esto está en la misma línea que el método Polyfit, pero de naturaleza más general. Esta poderosa función del módulo scipy.optimize puede ajustar cualquier función definida por el usuario a un conjunto de datos mediante la minimización de mínimos cuadrados.
Para la regresión lineal simple, se puede escribir una función lineal mx + c y llamar a este estimador. No hace falta decir que también funciona para regresiones multivariadas. Devuelve una matriz de parámetros de función para los que se minimiza la medida de mínimos cuadrados y la matriz de covarianza asociada.
Método: numpy.linalg.lstsq

Este es el método fundamental para calcular la solución de mínimos cuadrados a un sistema lineal de ecuaciones mediante factorización matricial. Viene del práctico módulo de álgebra lineal del paquete numpy. Bajo el capó, resuelve la ecuación ax = b calculando un vector x que minimiza la norma euclidiana 2 || b - hacha || ² .
La ecuación puede estar subdeterminada, bien o sobredeterminada (es decir, el número de filas linealmente independientes de a puede ser menor, igual o mayor que su número de columnas linealmente independientes). Si a es cuadrado y de rango completo, entonces x (pero para el error de redondeo) es la solución "exacta" de la ecuación.
Puede hacer una regresión simple o multivariada con esto y recuperar los coeficientes y residuos calculados. Un pequeño truco es que antes de llamar a esta función, debe agregar una columna de 1 a los datos de x para calcular el término de intersección. Resulta que es uno de los métodos más rápidos para probar problemas de regresión lineal.
Método: Statsmodels.OLS ()
Statsmodels es un pequeño paquete de Python que proporciona clases y funciones para la estimación de muchos modelos estadísticos diferentes, así como para realizar pruebas estadísticas y exploración de datos estadísticos. Hay disponible una lista extensa de estadísticas de resultados para cada estimador. Los resultados se prueban con los paquetes estadísticos existentes para garantizar su exactitud.
Para la regresión lineal, se puede utilizar la función MCO u Ordinary-Least-Square de este paquete y obtener la información estadística completa sobre el proceso de estimación.
Un pequeño truco para recordar es que debe agregar una constante manualmente a los datos x para calcular la intersección; de lo contrario, de manera predeterminada, solo informará el coeficiente. A continuación se muestra la instantánea del resumen de resultados completo del modelo OLS. Es tan rico como cualquier lenguaje estadístico funcional como R o Julia.

Método: Solución analítica utilizando el método inverso de matriz.
Para problemas de regresión lineal bien acondicionados (al menos donde # de puntos de datos> # de características), existe una solución de matriz de forma cerrada simple para calcular los coeficientes que garantiza la minimización de mínimos cuadrados. Está dado por,

La derivación detallada y la discusión sobre esta solución se discuten aquí.
Uno tiene dos opciones aquí:
(a) usando una matriz multiplicativa simple inversa.
(b) primero calcular la matriz pseudoinversa generalizada de Moore-Penrose de datos x seguido de tomar un producto escalar con los datos y. Debido a que este segundo proceso implica la descomposición de valores singulares (SVD), es más lento pero puede funcionar bien para conjuntos de datos no bien acondicionados.
Método: sklearn.linear_model.LinearRegression ()
Este es el método por excelencia utilizado por la mayoría de los ingenieros de aprendizaje automático y científicos de datos. Por supuesto, para problemas del mundo real, probablemente nunca se use mucho y sea reemplazado por algoritmos regularizados y con validación cruzada como la regresión Lasso o la regresión Ridge. Pero el núcleo esencial de esas funciones avanzadas reside en este modelo.
Medir la complejidad del tiempo y la velocidad de estos métodos
Como científico de datos, uno siempre debe buscar métodos / funciones precisos pero rápidos para hacer el trabajo de modelado de datos. Si el método es inherentemente lento, creará un cuello de botella de ejecución para grandes conjuntos de datos.
Una buena forma de determinar la escalabilidad es ejecutar los modelos para aumentar el tamaño del conjunto de datos, extraer los tiempos de ejecución de todas las ejecuciones y trazar la tendencia.
Aquí está el código de la placa de la caldera para esto. Y aqui esta el resultado. Debido a su simplicidad, stats.linregress y los métodos de matriz inversa simple son más rápidos, incluso hasta 10 millones de puntos de datos.

Resumen
Como científico de datos, uno siempre debe explorar múltiples opciones para resolver el mismo análisis o tarea de modelado y elegir lo mejor para su problema particular.
En este artículo, discutimos 8 formas de realizar una regresión lineal simple. La mayoría de ellos también son escalables a modelos de regresión polinomial y multivariados más generalizados. No enumeramos el R² adecuado para estos métodos, ya que todos ellos están muy cerca de 1.
Para una regresión de una sola variable, con millones de puntos de datos generados artificialmente, el coeficiente de regresión se estima muy bien.
El objetivo de este artículo es principalmente discutir la velocidad relativa / complejidad computacional de estos métodos. Mostramos la medida de complejidad computacional de cada uno de ellos probando un conjunto de datos sintetizados de tamaño creciente (hasta 10 millones de muestras). Sorprendentemente, la solución analítica inversa de matriz simple funciona bastante rápido en comparación con el modelo lineal ampliamente utilizado de scikit-learn.
Si tiene alguna pregunta o idea para compartir, comuníquese con el autor en tirthajyoti [AT] gmail.com . También puede consultar los repositorios de GitHub del autor para ver otros divertidos fragmentos de código en Python, R o MATLAB y recursos de aprendizaje automático. Si, como yo, eres un apasionado del aprendizaje automático / ciencia de datos / semiconductores, no dudes en agregarme a LinkedIn o seguirme en Twitter.