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

时间:2018-06-07 04:34:03

标签: python pandas linear-regression statsmodels dummy-variable

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

2 个答案:

答案 0 :(得分:3)

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

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

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

因此,您拥有X功能:

Age, Gender, Job, Classification 

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

Wage

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

输入变量(您的数据集有些不同,但整个代码保持不变,您将数据集中的每一列都放在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)

答案 1 :(得分:0)

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