[英]Linear regression with dummy/categorical variables
我有一組數據。 我使用熊貓分別將它們轉換為虛擬變量和分類變量。 那么,現在我想知道如何在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)
因此,現在如果您使用drop_first=True
檢查X的形狀(X.shape),您會發現它的列減少了四列-每個分類變量對應一列。
現在,您可以繼續在線性模型中使用它們。 對於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)
您需要指出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
不會使用與基線相同的分類級別,因此,即使總體模型擬合保持不變,每個級別的虛擬系數結果也會略有不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.