首页 > 解决方案 > 带有虚拟/分类变量的线性回归

问题描述

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

标签: pythonpandaslinear-regressionstatsmodelsdummy-variable

解决方案


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

想法是使用虚拟变量编码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)

因此,现在如果您检查 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)

推荐阅读