Линейная регрессия с фиктивными / категориальными переменными - PullRequest
0 голосов
/ 07 июня 2018

У меня есть набор данных.Я использовал панд, чтобы преобразовать их в фиктивные и категориальные переменные соответственно.Итак, теперь я хочу знать, как запустить множественную линейную регрессию (я использую statsmodels) в Python?Есть ли какие-то соображения или, может быть, я должен указать, что переменные являются фиктивными / категоричными в моем коде?Или, может быть, трансформации переменных достаточно, и мне просто нужно выполнить регрессию как 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, и я хочу учиться.Привет из Южной Америки - Чили.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

В линейной регрессии с категориальными переменными вы должны быть осторожны с фиктивной ловушкой для переменных.Ловушка фиктивной переменной - это сценарий, в котором независимые переменные являются мультиколлинеарными - сценарий, в котором две или более переменных сильно коррелированы;Проще говоря, одну переменную можно предсказать из других.Это может привести к необычности модели, то есть ваша модель просто не будет работать. Прочтите об этом здесь

Идея состоит в том, чтобы использовать фиктивную переменную с кодировкой drop_first=True, при этом будет исключен один столбец из каждой категории после преобразования категориальной переменной в фиктивные / индикаторные переменные.Делая это, вы НЕ БУДЕТЕ потерять и релевантную информацию просто потому, что весь ваш смысл в наборе данных может быть полностью объяснен остальными функциями.

Вот полный код того, как вы можете сделать это для своего набора данных рабочих мест

Итак, у вас есть свои функции X:

Age, Gender, Job, Classification 

И одинчисловые особенности, которые вы пытаетесь предсказать:

Wage

Сначала вам нужно разделить ваш начальный набор данных на входные переменные и прогноз, предполагая, что его кадр данных pandas будет выглядеть так:

Входные переменные(ваш набор данных немного отличается, но весь код остается тем же самым, вы поместите каждый столбец из набора данных в X, кроме того, который перейдет к Y. pd.get_dummies работает без проблем подобным образом - он просто преобразует категориальные переменные, и он выиграл 't touch numeric):

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)
0 голосов
/ 07 июня 2018

Вам нужно будет указать, что либо 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 не будет использовать тот же категориальный уровень в качестве базовой линии, поэтому вы увидите несколько разные результаты для фиктивных коэффициентов на каждом уровне, даже если общее соответствие модели останется прежним.

...