簡體   English   中英

具有虛擬/分類變量的線性回歸

[英]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)

您需要指出JobJob_index是類別變量; 否則,在的情況下Job_index它將被視為作為連續變量(這恰好取值12 ,和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.
==============================================================================

注意: JobJob_index不會使用與基線相同的分類級別,因此,即使總體模型擬合保持不變,每個級別的虛擬系數結果也會略有不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM