我有一组数据。我已经使用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新手,我想学习。来自南美洲的问候 - 智利。
答案 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)
您需要指明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
不会使用与基线相同的分类级别,因此即使整体模型适合,您也会看到每个级别的虚拟系数略有不同的结果保持不变。