Я пытаюсь получить значение функций для модели регрессии. У меня есть 58 независимых переменных и одна зависимая переменная. Большинство независимых переменных являются числовыми, а некоторые — бинарными.
Сначала я использовал это:
X = dataset.drop(['y'], axis=1)
y = dataset[['y']]
# define the model
model = LinearRegression()
# fit the model
model.fit(X, y)
# get importance
importance = model.coef_[0]
print(model.coef_)
print(importance)
# summarize feature importance
for i,v in enumerate(importance):
print('Feature: %0d, Score: %.5f' % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
и получил следующие результаты: Важность сюжета
Затем я использовал MinMaxScaler() для масштабирования данных перед подбором модели:
scaler = MinMaxScaler()
dataset[dataset.columns] = scaler.fit_transform(dataset[dataset.columns])
print(dataset)
X = dataset.drop(['y'], axis=1)
y = dataset[['y']]
# define the model
model = LinearRegression()
# fit the model
model.fit(X, y)
# get importance
importance = model.coef_[0]
print(model.coef_)
print(importance)
# summarize feature importance
for i,v in enumerate(importance):
print('Feature: %0d, Score: %.5f' % (i,v))
# plot feature importance
pyplot.bar([x for x in range(len(importance))], importance)
pyplot.show()
что привело к следующему сюжету: График важности функции после использования MinMaxScaler
Как вы можете видеть в верхнем левом углу, это 1e11, что означает, что самые большие значения отрицательные 60 миллиардов. Что я здесь делаю неправильно? И правильно ли использовать MinMaxScaler?
В регрессионном анализе величина ваших коэффициентов не обязательно связана с их важностью. Наиболее распространенными критериями для определения важности независимых переменных в регрессионном анализе являются p-значения. Небольшие значения p подразумевают высокий уровень важности, тогда как высокие значения p означают, что переменная не является статистически значимой. Вы должны использовать величину коэффициентов только в качестве меры важности функции, когда ваша модель наказывает переменные. То есть, когда проблема оптимизации имеет штрафы L1 или L2, такие как лассо или гребневая регрессия.
sklearn
не сообщает p-значения. Я рекомендую запустить ту же регрессию, используя statsmodels.OLS
. Для всех других моделей, включая деревья, ансамбли, нейронные сети и т. д., вы должны использовать feature_importances_
, чтобы определить индивидуальную важность каждой независимой переменной.
Используя model.coef_
в качестве меры важности функции, вы принимаете во внимание только величину бета. Если это действительно то, что вас интересует, попробуйте numpy.abs(model.coef_[0])
, потому что бета тоже может быть отрицательной.
Что касается вашего использования min_max_scaler()
, вы используете его правильно. Однако вы преобразуете весь набор данных, хотя на самом деле вы должны только масштабировать свои независимые переменные.
X = dataset.drop(['y'], axis=1)
y = dataset['y']
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
print(X)
Используя scaler.fit_transform(dataset[dataset.columns])
, вы масштабировали ВСЕ столбцы в вашем объекте dataset
, включая вашу зависимую переменную. Фактически ваш код эквивалентен scaler.fit_transform(dataset)
, так как вы выбирали все столбцы в dataset
.
Как правило, масштабировать данные следует только в том случае, если вы подозреваете, что выбросы влияют на вашу оценку. При повторном масштабировании ваших данных бета-коэффициенты больше не интерпретируются (или, по крайней мере, не так интуитивно понятны). Это происходит потому, что данная бета больше не указывает на изменение зависимой переменной, вызванное предельным изменением соответствующей независимой переменной.
Наконец, это не должно быть проблемой, но просто на всякий случай убедитесь, что масштабатор не изменяет ваши двоичные независимые переменные.
Привет! Я немного обновил ответ. В регрессионном анализе следует использовать p-значения, а не величину коэффициентов. Sklearn не сообщает p-значения, поэтому я рекомендую запустить ту же регрессию, используя statsmodels.OLS
.
Спасибо, посмотрю! Есть ли шанс, что я могу быстро задать вам несколько дополнительных вопросов в чате? Это проще, чем использовать функцию комментариев
Конечно. Есть ли чат при переполнении стека?
Есть, но я только что понял, что нужно иметь как минимум 20 репутации, а у меня только 11, так что это, вероятно, не сработает... Разве что вы можете пригласить меня в чат, возможно? meta.stackexchange.com/questions/231544/…
Ха-ха. Я проголосовал за один из ваших старых постов. Теперь у вас есть 21 повторение. Пригласите меня, если хотите.
пожалуйста, проверьте чат снова, когда / если у вас есть время :)
Большое спасибо за ваш подробный ответ! «Я хотел бы начать с того, что в регрессионном анализе величина ваших коэффициентов не обязательно связана с их важностью». - Можно ли тогда как-то найти "важность" моих коэффициентов?