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

Héc*_*nso 3 python linear-regression pandas statsmodels dummy-variable

我有一组数据。我使用熊猫分别将它们转换为虚拟变量和分类变量。那么,现在我想知道如何在Python中运行多元线性回归(我正在使用statsmodels)?是否有一些考虑因素,或者也许我必须指出我的代码中变量是虚拟的还是分类的?也许变量的转换就足够了,我只需要将回归作为model = sm.OLS(y, X).fit()?运行。

我的代码如下:

datos = pd.read_csv("datos_2.csv")
df = pd.DataFrame(datos)
print(df)
Run Code Online (Sandbox Code Playgroud)

我得到这个:

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
Run Code Online (Sandbox Code Playgroud)

然后我这样做: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)
Run Code Online (Sandbox Code Playgroud)

得到这个:

 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

and*_*ece 12

您需要表明,要么Job或者Job_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.
==============================================================================
Run Code Online (Sandbox Code Playgroud)

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


Har*_*vey 5

使用分类变量进行线性回归时,应注意“虚拟变量陷阱”。虚拟变量陷阱是其中自变量为多重共线性的场景,即其中两个或多个变量高度相关的场景。简单来说,可以从其他变量中预测一个变量。这会产生模型的奇异性,这意味着您的模型将无法工作。在这里阅读

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

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

因此,您具有X功能:

Age, Gender, Job, Classification 
Run Code Online (Sandbox Code Playgroud)

您尝试预测的一种数值特征:

Wage
Run Code Online (Sandbox Code Playgroud)

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

输入变量(您的数据集有些不同,但整个代码保持不变,您将数据集中的每一列都放在X中,除了要转到Y的那一列。pd.get_dummies可以正常工作,不会发生问题-它将转换类别变量,不会涉及数字):

X = jobs[['Age','Gender','Job','Classification']]
Run Code Online (Sandbox Code Playgroud)

预测:

Y = jobs['Wage']
Run Code Online (Sandbox Code Playgroud)

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

X = pd.get_dummies(data=X, drop_first=True)
Run Code Online (Sandbox Code Playgroud)

因此,现在如果您检查X的形状(X.shape),drop_first=True您会发现它少了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)
Run Code Online (Sandbox Code Playgroud)