Cómo usar Python para implementar regresión con variables independientes virtuales
Utilice Python para realizar una regresión lineal
Comprenda qué es la regresión lineal
Regresión lineal, también llamada regresión de mínimos cuadrados ordinarios (OLS). Su modelo matemático es así:
y = a+ b* x+e
Entre ellos, a se llama término constante o intercepción b se llama coeficiente de regresión o pendiente de; el modelo ;e es el término de error. a y b son parámetros del modelo.
Por supuesto, los parámetros del modelo solo se pueden estimar a partir de los datos de muestra:
y'= a' + b'* x
Nuestro objetivo es elegir los parámetros apropiados que permitan que este modelo lineal se ajuste mejor a los valores observados. Cuanto mayor sea el ajuste, mejor será el modelo.
Entonces, la siguiente pregunta es: ¿cómo juzgamos la calidad del ajuste?
Este modelo lineal se puede representar mediante una línea recta en un plano bidimensional, llamada línea de regresión.
Cuanto mayor sea el grado de ajuste del modelo, significa que los puntos de muestra están más cerca de la línea de regresión.
¿Cómo calcular la cercanía entre el punto de muestra y la línea de regresión?
El método encontrado por Gauss y Legendre es: los parámetros seleccionados deben minimizar la suma de las diferencias entre la recta de regresión calculada y los valores observados. Expresado como una función:
Esto se llama método de mínimos cuadrados. El principio del método de mínimos cuadrados es el siguiente: cuando la suma de los cuadrados de la distancia entre el valor predicho y el valor real es la más pequeña, se seleccionan los dos parámetros (ayb) en el modelo. Este modelo no refleja necesariamente la verdadera relación entre las variables explicativas y de respuesta. Pero su coste computacional es bajo; es más fácil de interpretar que los modelos complejos.
Después de estimar el modelo, la pregunta que debemos responder es:
¿Qué tan bien se ajusta nuestro modelo? En otras palabras, ¿qué tan bien explica este modelo la variable dependiente? (R2)
¿Puede todo el modelo predecir significativamente cambios en la variable dependiente? (Prueba F)
¿Cada variable independiente predice significativamente cambios en la variable dependiente? (prueba t)
Responde primero la primera pregunta. Para evaluar qué tan bien se ajusta un modelo, debemos tener un modelo de referencia con el que podamos comparar.
¿Si te pidieran que predeciras el peso de una persona? Sin ninguna información adicional, puedes usar el promedio para hacer una predicción. Aunque habrá algún error, es mejor que adivinar.
Ahora, si conoce la información de su altura, su valor previsto definitivamente será diferente del promedio. La capacidad de la información adicional para predecir la variable predicha con mayor precisión que el promedio representa el poder explicativo del modelo.
En la figura anterior, SSA representa la suma de las desviaciones al cuadrado de y causadas por la variable independiente x, es decir, la suma de cuadrados de la regresión, que representa el poder explicativo del modelo de regresión; la desviación al cuadrado de y causada por la suma de factores aleatorios, es decir, la suma de cuadrados restante, representa la parte que no puede explicarse por el modelo de regresión. SST es la suma total de las desviaciones al cuadrado, es decir, el error causado cuando estimamos y; basado únicamente en el valor promedio de y.
Dividir la variación que el modelo puede explicar entre la variación total es el grado de ajuste del modelo:
R2=SSA/SST=1-SSE
R2 (R al cuadrado) también se llama coeficiente de determinación o coeficiente de determinación.
Segunda pregunta, ¿nuestro modelo predice significativamente cambios en y?
Suponiendo que la relación lineal entre y y x no es obvia, entonces la probabilidad de que SSA ocupe una proporción mayor en relación con SSE es menor. En otras palabras, bajo la premisa de que no existe una relación lineal entre y y x, cuanto mayor sea la proporción de SSA en relación con SSE, menor será la probabilidad, que presentará una determinada distribución de probabilidad. Los estadísticos nos dicen que satisface la distribución F, así:
Si SSA tiene una proporción relativamente grande en relación con SSE, por ejemplo, según la distribución F, la probabilidad de que este valor ocurra es menor que 5 %. Entonces, es mejor para nosotros rechazar la hipótesis original de que la relación lineal entre y y x no es significativa, y pensar que es más apropiado que exista una relación lineal significativa entre ambos.
La tercera pregunta es: ¿puede cada variable independiente predecir significativamente cambios en la variable dependiente? En otras palabras, ¿son significativos los coeficientes de regresión?
La prueba de significancia del coeficiente de regresión se lleva a cabo alrededor de la distribución muestral (distribución t) del coeficiente de regresión. El proceso de inferencia es similar al proceso de prueba de todo el modelo, por lo que no se necesitan detalles.
De hecho, para un modelo lineal univariado con una sola variable independiente, la prueba de significancia del modelo y la prueba del coeficiente de regresión son consistentes, pero para un modelo lineal multivariado, las dos no son equivalentes.
Usar modelos de estadísticas para la regresión de mínimos cuadrados
#Importar el módulo correspondiente
En , y_hat, 'r', alpha=0.9) #Agregar línea de regresión, roja
Regresión lineal múltiple (más de una variable predictora)
Usamos una línea recta para describir la relación entre las variables predictoras y la variable de resultado en el modelo lineal de una variable, mientras que En la regresión múltiple, usaremos un espacio multidimensional (p) para ajustar múltiples variables predictivas. A continuación se muestra un gráfico tridimensional que muestra dos variables predictoras: ventas del producto y presupuesto publicitario en dos medios diferentes: televisión y radio.
El modelo matemático es:
Ventas = beta_0 + beta_1*TV + beta_2*Radio
En la figura, los puntos de datos blancos son puntos en el plano. , y el negro Los puntos de datos son puntos debajo del plano. El color del avión está determinado por el volumen de ventas del producto correspondiente. El alto es rojo y el bajo es azul.
Usa modelos de estadísticas para regresión lineal múltiple
En [1]: importa pandas como pd
En [2]: importa numpy como np
En [3]: importar statsmodels.api como sm
En [4]: df_adv=pd.read_csv('g.csv',index_col=0)
En [ 6]: X=df_adv[['TV','Radio']]
En [7]: y=df_adv['Ventas']
En [8] : df_adv .head()
Salida[8]:
TV ?Radio ?Periódico ?Ventas
1 ?230,1 ? p>
2 ? 44,5 ? 39,3 ? 45,1 ? 151,5 ? p> 5 ? 180,8 ? 10,8 ? 58,4 ? ,X ).fit()
En [11]: est.summary()
Fuera[11]:
También puedes usar el módulo de fórmulas de statsmodels para construir un modelo de regresión múltiple
En [12]: importar statsmodels.formula.api como smf
En [13]: est=smf.ols(formula='Sales ~ TV + Radio ',data=df_adv).fit()
Procesamiento de variables categóricas
El género o la región son variables categóricas.
En [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
En [16] : p>
En [18]: df.head()
Fuera[18]:
sbp ?tabaco ?ldl ?adiposidad ?famhist ?typea ?obesidad ?alcohol ?160 12.00 ?5.73 ?23.11 ?Presente 49 25.30 97.20
2 ?144 0.01 ?4.41 ?28.61 ? 28,87 2,06
3 ?118 0,08 ?3,48 ?32,28 ?Presente 52 29,14 3,81
4 ?170 7,50 ?6,41 ?38,03 ?Presente 51 31,99 24,26
5 ? 134 13,60 ?3,50 ?27,78 ?Presente 60 25,99 57,34
edad ?chd
nombres.fila
1 ? 2 ? 63 1
3 ? 46 0
4 ? . groupby(X.famhist).mean()
Fuera[19]:
famhist
Ausente 0.237037
Presente 0.500000<. /p> p>
Nombre: chd, dtype: float64
En [20]: importar statsmodels.formula.api como smf
En [21]: df[' famhist_ord'] =pd.Categorical(df.famhist).labels
En [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit() p>
Existen muchos métodos de codificación para variables categóricas. Uno de los métodos de codificación es la codificación de variables ficticias (codificación ficticia), que consiste en codificar una variable categórica de nivel k en variables dicotómicas k-1. Implementado usando funciones C en statsmodels.
En [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()
En [26]: est .summary()
Out[26]:
Manejo de interacciones
A medida que aumenta la educación, ¿aumentará el salario? ¿Este efecto es el mismo para hombres y mujeres?
El problema aquí involucra la interacción entre género y años de educación.
En otras palabras, el impacto de los años de educación en el salario es diferente entre hombres y mujeres.
#Importar módulos relacionados
En [1]: importar pandas como pd
En [2]: importar numpy como np
En [4]: importar statsmodels.api como sm
#Importar datos y almacenarlos en el objeto de marco de datos
En [5]: df=pd.read_csv('/ Users/xiangzhendong/ Downloads/pydatafromweb/wages.csv')
En [6]: df[['Wage','Education','Sex']].tail()
Salida[ 6]:
Salario ?Educación ?Sexo
529 ?11,36 18 0
530 6,10 12 1
531 ?23.25 17 1
532 ?19.88 12 0
533 ?15.38 16 0
Dado que el género es una variable dicotómica, podemos dibujar dos líneas de regresión, uno es sexo= 0 (masculino), otro es sexo=1 (femenino)
# Dibujar un diagrama de dispersión
En [7]: plt.scatter(df.Education,df .Salario, alfa =0.3)
En [9]: plt.xlabel('educación')
En [10]: plt.ylabel('salario')
#La función de linspace es generar n números distribuidos uniformemente desde el más pequeño al más grande
En [17]: education_linspace=np.linspace(df.Education.min(), df. Education.max(),100)
En [12]: importar statsmodels.formula.api como smf
En [13]: est=smf.ols(formula='Salario ~ Educación + Sexo', data=df).fit()
En [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params [2]0, 'r')
En [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')
Las dos líneas anteriores son paralelas. Esto se debe a que las variables categóricas solo afectan la intersección de la línea de regresión, no la pendiente.
A continuación, podemos agregar términos de interacción al modelo de regresión para explorar los efectos de la interacción.
En otras palabras, las pendientes de las rectas de regresión son diferentes para las dos categorías.
En [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
En [33]: plt.xlabel('educación') p> p>
En [34]: plt.ylabel('wage')
# Utilice * para representar que además del efecto de interacción, nuestro modelo de regresión también incluye el efecto principal de la dos variables; si solo desea ver el efecto de interacción, puede usar: en su lugar, pero generalmente no solo verá el efecto de interacción
En [35]: est=smf.ols(formula= 'Salario ~ Sexo*Educación', data=df). fit()
En [36]: plt.plot(education_linspace, est.params[0]+est.params[1]est .params[2]education_linspace+est.params[3] 0education_linspace, 'r')
En [37]: plt.plot(education_linspace, est.params[0]+est.params[1] 1+est.params[2]education_linspace+est.params [3]1education_linspace, 'g')
Materiales de referencia:
DataRobot | Mínimos cuadrados ordinarios en Python
DataRoboe | Regresión múltiple usando Statsmodels
AnalyticsVidhya | ¡7 tipos de técnicas de regresión que debes conocer!