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