带有虚拟/分类变量的线性回归

Posted

技术标签:

【中文标题】带有虚拟/分类变量的线性回归【英文标题】:Linear regression with dummy/categorical variables 【发布时间】:2018-11-16 21:12:59 【问题描述】:

我有一组数据。我已经使用 pandas 将它们分别转换为虚拟变量和分类变量。所以,现在我想知道,如何在 Python 中运行多元线性回归(我正在使用 statsmodels)?是否有一些注意事项,或者我可能必须以某种方式在我的代码中指出这些变量是虚拟的/分类的?或者也许变量的转换就足够了,我只需要以model = sm.OLS(y, X).fit()? 运行回归。

我的代码如下:

datos = pd.read_csv("datos_2.csv")
df = pd.DataFrame(datos)
print(df)

我明白了:

Age  Gender    Wage         Job         Classification 
32    Male  450000       Professor           High
28    Male  500000  Administrative           High
40  Female   20000       Professor            Low
47    Male   70000       Assistant         Medium
50  Female  345000       Professor         Medium
27  Female  156000       Assistant            Low
56    Male  432000  Administrative            Low
43  Female  100000  Administrative            Low

然后我做:1=男性,0=女性,1:教授,2:行政,3:助理:

df['Sex_male']=df.Gender.map('Female':0,'Male':1)
        df['Job_index']=df.Job.map('Professor':1,'Administrative':2,'Assistant':3)
print(df)

得到这个:

 Age  Gender    Wage             Job Classification  Sex_male  Job_index
 32    Male  450000       Professor           High         1          1
 28    Male  500000  Administrative           High         1          2
 40  Female   20000       Professor            Low         0          1
 47    Male   70000       Assistant         Medium         1          3
 50  Female  345000       Professor         Medium         0          1
 27  Female  156000       Assistant            Low         0          3
 56    Male  432000  Administrative            Low         1          2
 43  Female  100000  Administrative            Low         0          2

现在,如果我要运行多元线性回归,例如:

y = datos['Wage']
X = datos[['Sex_mal', 'Job_index','Age']]
X = sm.add_constant(X)
model1 = sm.OLS(y, X).fit()
results1=model1.summary(alpha=0.05)
print(results1)

结果正常显示了,但是可以吗?还是我必须以某种方式表明变量是虚拟变量或分类变量?请帮助,我是 Python 新手,我想学习。来自南美洲 - 智利的问候。

【问题讨论】:

【参考方案1】:

在具有分类变量的线性回归中,您应该小心虚拟变量陷阱。虚拟变量陷阱是自变量是多重共线性的场景——两个或多个变量高度相关的场景;简单来说,一个变量可以从其他变量中预测出来。这会产生模型的奇异性,这意味着您的模型将无法正常工作。 Read about it here

想法是使用带有drop_first=True 的虚拟变量编码,这将在将分类变量转换为虚拟/指标变量后从每个类别中省略一列。您不会因为这样做而丢失相关信息,因为您在数据集中的所有点都可以通过其余功能完全解释。

以下是有关如何为您的工作数据集执行此操作的完整代码

所以你有你的 X 特征:

Age, Gender, Job, Classification 

还有一个你试图预测的数字特征:

Wage

首先,您需要根据输入变量和预测拆分初始数据集,假设它的 pandas 数据框如下所示:

输入变量(您的数据集有点不同,但整个代码保持不变,您将把数据集中的每一列放在 X 中,除了将转到 Y 的那一列。pd.get_dummies 可以正常工作 - 它只会转换分类变量,它不会触及数字):

X = jobs[['Age','Gender','Job','Classification']]

预测:

Y = jobs['Wage']

将分类变量转换为虚拟/指标变量,并在每个类别中删除一个:

X = pd.get_dummies(data=X, drop_first=True)

因此,现在如果您使用drop_first=True 检查 X (X.shape) 的形状,您将看到它少了 4 列 - 每个类别变量都有一列。

您现在可以继续在线性模型中使用它们。对于 scikit-learn 实现,它可能如下所示:

from sklearn import linear_model
from sklearn.model_selection import train_test_split
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = .20, random_state = 40)
        regr = linear_model.LinearRegression() # Do not use fit_intercept = False if you have removed 1 column after dummy encoding
        regr.fit(X_train, Y_train)
    predicted = regr.predict(X_test)

【讨论】:

您好!如何绘制这个值?我说 X 和 y 值的大小不同。【参考方案2】:

您需要指出JobJob_index 是一个分类变量;否则,在Job_index 的情况下,它将被视为一个连续变量(恰好取值123),这是不对的。

您可以在statsmodels 中使用几种不同的符号,这是公式方法,它使用C() 来表示分类变量:

from statsmodels.formula.api import ols

fit = ols('Wage ~ C(Sex_male) + C(Job) + Age', data=df).fit() 

fit.summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   Wage   R-squared:                       0.592
Model:                            OLS   Adj. R-squared:                  0.048
Method:                 Least Squares   F-statistic:                     1.089
Date:                Wed, 06 Jun 2018   Prob (F-statistic):              0.492
Time:                        22:35:43   Log-Likelihood:                -104.59
No. Observations:                   8   AIC:                             219.2
Df Residuals:                       3   BIC:                             219.6
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
=======================================================================================
                          coef    std err          t      P>|t|      [0.025      0.975]
---------------------------------------------------------------------------------------
Intercept             3.67e+05   3.22e+05      1.141      0.337   -6.57e+05    1.39e+06
C(Sex_male)[T.1]     2.083e+05   1.39e+05      1.498      0.231   -2.34e+05    6.51e+05
C(Job)[T.Assistant] -2.167e+05   1.77e+05     -1.223      0.309    -7.8e+05    3.47e+05
C(Job)[T.Professor] -9273.0556   1.61e+05     -0.058      0.958   -5.21e+05    5.03e+05
Age                 -3823.7419   6850.345     -0.558      0.616   -2.56e+04     1.8e+04
==============================================================================
Omnibus:                        0.479   Durbin-Watson:                   1.620
Prob(Omnibus):                  0.787   Jarque-Bera (JB):                0.464
Skew:                          -0.108   Prob(JB):                        0.793
Kurtosis:                       1.839   Cond. No.                         215.
==============================================================================

注意:JobJob_index 不会使用相同的分类级别作为基线,因此您会看到每个级别的虚拟系数的结果略有不同,即使整体模型拟合保持不变。

【讨论】:

好的,非常感谢,但出现了一个新问题,因为在结果中只显示了两个类别(男性和女性)之一的 Sex_male 的系数?以同样的方式,对于 Job,只有它的三个类别中的两个的系数?。你能解释一下为什么会这样吗? 在回归中,任何分类变量都需要使用一个级别作为比较其他级别的基线。这就是您为每个类别级别获得单独系数的方式 - 与基线​​相比,该系数将指示该级别的预测信号。基线没有与自身进行比较,因此没有系数。您可以查看对比以获取更多信息(但有关此的更多问题更适合 CrossValidated 而不是 ***)。 @Héctor Alonso 如果此答案已解决您的原始问题,请单击答案旁边的复选符号将其标记为已接受。谢谢! 完成。谢谢 :D 这真的很有帮助

以上是关于带有虚拟/分类变量的线性回归的主要内容,如果未能解决你的问题,请参考以下文章

多元线性回归的计算公式是怎样的?

处理多元线性回归Python中的分类和数值变量

怎么对多元线性回归模型的回归系数β做t检验和F检验

如何使用spss进行一元非线性回归分析

Python应用实战线性回归(附Python代码)

机器学习(时间序列):线性回归之虚拟变量 dummy variables