dummy/categorical 个变量的线性回归

Linear regression with dummy/categorical variables

我有一组数据。我已经使用 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:Professor,2:Administrative,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 的新手,我想学习。来自南美洲的问候——智利。

您需要指出 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 不会使用相同的分类水平作为基线,因此您会看到每个水平的虚拟系数的结果略有不同,即使整体模型拟合保持不变。

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

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

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

所以你有你的 X 特征:

Age, Gender, Job, Classification 

以及您要预测的一项数值特征:

Wage

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

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

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

预测:

Y = jobs['Wage']

将分类变量转换为 dummy/indicator 个变量并在每个类别中删除一个:

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)