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 的新手,我想学习。来自南美洲的问候——智利。
您需要指出 Job
或 Job_index
是分类变量;否则,在 Job_index
的情况下,它将被视为连续变量(恰好取值 1
、2
和 3
),这不是正确的。
您可以在 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.
==============================================================================
注意:Job
和 Job_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)
我有一组数据。我已经使用 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 的新手,我想学习。来自南美洲的问候——智利。
您需要指出 Job
或 Job_index
是分类变量;否则,在 Job_index
的情况下,它将被视为连续变量(恰好取值 1
、2
和 3
),这不是正确的。
您可以在 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.
==============================================================================
注意:Job
和 Job_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)