Как исправить очень высокий уровень ложных отрицательных результатов в достаточно сбалансированной бинарной классификации? - PullRequest
1 голос
/ 12 марта 2020

У меня есть проект, который запрашивает бинарную классификацию того, уйдет ли сотрудник из компании или нет, основываясь на 52 функциях и 2000 строках данных. Данные несколько сбалансированы: от 1200 до 800 поз. Я сделал обширную EDA и очистку данных. Я решил попробовать несколько разных моделей: sklearn, Logarithmi c Regression, SVM и Random Forests. Я получаю очень плохие и похожие результаты от всех них. Я использовал только 15 из 52 функций для этого прогона, но результаты почти идентичны, когда я использовал все 52 функции. Из 52 функций 6 были категориальными, которые я конвертировал в макеты (между 3-6 категориями на функцию), а 3 были датой и временем, которые я конвертировал в дни с тех пор. Не было пустых значений для заполнения.

Это код и матрица путаницы в моем последнем прогоне со случайным лесом.

x_train, x_test, y_train, y_test = train_test_split(small_features, endreason, test_size=0.2, random_state=0)


RF = RandomForestClassifier(bootstrap = True,
                            max_features = 'sqrt',
                            random_state=0)
RF.fit(x_train, y_train)
RF.predict(x_test)


cm = confusion_matrix(y_test, rf_predictions)
plot_confusion_matrix(cm, classes = ['Negative', 'Positive'],
                      title = 'Confusion Matrix')

enter image description here

Какие шаги я могу сделать, чтобы лучше соответствовать этой модели?

1 Ответ

1 голос
/ 12 марта 2020

Результаты, которые вы показываете, определенно кажутся немного обескураживающими для методов, которые вы предлагаете, и баланса данных, которые вы описываете. Тем не менее, из описания проблемы, безусловно, есть много возможностей для улучшения.

Когда вы используете train_test_split, убедитесь, что вы передали stratify=endreason, чтобы убедиться, что нет проблем с метками при разбиении набора данных. Перейдем к полезным пунктам для улучшения вашей модели:

Прежде всего, уменьшение размерности : поскольку вы имеете дело со многими функциями, некоторые из них могут оказаться бесполезными или даже загрязнить проблему классификации. пытаемся решить. Очень важно рассмотреть вопрос о том, как приспособить различные методы уменьшения размера к вашим данным и использовать эти адаптированные данные для подачи в вашу модель. Некоторые общие подходы, которые стоит попробовать:

  • PCA (анализ главных компонентов)
  • Фильтр низкой дисперсии и корреляции
  • Важность функции случайных лесов

Во-вторых понимание модели : Хотя Logisti c Регрессия может оказаться отличной базой для линейного классификатора, это не обязательно будет то, что вам нужно для этой задачи , Случайные леса кажутся намного лучше при захвате нелинейных отношений, но их необходимо контролировать и сокращать, чтобы избежать переобучения и может потребовать много данных. С другой стороны, SVM - очень мощный метод с нелинейными ядрами, но он может оказаться неэффективным при работе с огромными объемами данных. XGBoost и LightGBM - это очень мощные алгоритмы повышения градиента, которые выиграли несколько соревнований по борьбе и успешно работают почти во всех случаях, конечно, требуется некоторая предварительная обработка, как XGBoost не подготовлен для работы с категориальными функциями (LightGBM есть). Мое предложение состоит в том, чтобы попробовать эти последние 2 метода. От худшего к последнему (в общем случае сценарий ios) я бы перечислил:

  • LightGBM / XGBoost
  • RandomForest / SVM / Logisti c Регрессия

Последнее, но не менее важное Настройка гиперпараметра : Независимо от выбранного вами метода, всегда будет какая-то подстройка, которую необходимо выполнить. Sklearn предлагает gridsearch , что очень удобно. Однако вам необходимо понять, как ведут себя ваши классификаторы, чтобы понять, что вам следует искать. Я не буду go углубляться в это, поскольку это будет вне топи c и не подходит для SO, но вы можете определенно прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...