python - 带有虚拟/分类变量的线性回归
问题描述
我有一组数据。我已经使用 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 新手,我想学习。来自南美洲 - 智利的问候。
解决方案
在使用分类变量的线性回归中,您应该小心虚拟变量陷阱。虚拟变量陷阱是自变量是多重共线的场景 - 两个或多个变量高度相关的场景;简单来说,一个变量可以从其他变量中预测出来。这会产生模型的奇异性,这意味着您的模型将无法正常工作。在这里阅读
想法是使用虚拟变量编码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)
推荐阅读
- python-asyncio - 如何在 asyncio3.7 中向主协程添加多个任务?
- json - 在字符串前一行打印时间戳函数的结果
- angular - Ionic 4 beta 18 - 带有 routerLink 的 ion-item 和 ion-button 不会改变路由
- php - 多个 FPDF 通过 PHP 中的邮件
- android - React Native - 如何使用图像组件中的 uri 加载本地图像?
- arduino - 在 Atmel Studio 中定义 F_CPU
- android - 2.+ 以下的 android gradle 插件版本已在 2018 年底被弃用,这是真的吗?
- go - 如何从 exec 命令中获取错误消息
- bash - 如何计算csv文件中每行列数奇数的唯一字段数
- javascript - 如何仅在不存在时将值附加到数组并在不存在时将其删除?