А. Используйте перекрестную проверку ансамбля (CV): В этом проекте я использовал перекрестную проверку, чтобы подтвердить надежность модели. Весь набор данных был разделен на пять подмножеств. В каждом резюме 4 из 5 подмножеств используются для обучения, а оставшийся набор использовался для проверки модели. В каждом резюме модель также предсказывает (вероятности, а не класс) тестовые данные. В конце перекрестной проверки у нас есть пять вероятностей предсказания тестирования. Наконец, я усредняю вероятности предсказания для всех классов. Показатели обучения модели были стабильными и имели почти постоянный отзыв и оценку f1 в каждом резюме. Эта техника помогла мне очень хорошо предсказать тестовые данные в одном из соревнований Kaggle, в котором я занял 25-е место из 5355, что составляет 1% лучших. В следующих фрагментах кода показана реализация перекрестной проверки Ensemble:
for j, (train_idx, valid_idx) in enumerate(folds): X_train = X[train_idx] Y_train = y[train_idx] X_valid = X[valid_idx] Y_valid = y[valid_idx] clf.fit(X_train, Y_train) valid_pred = clf.predict(X_valid) recall = recall_score(Y_valid, valid_pred, average='macro') f1 = f1_score(Y_valid, valid_pred, average='macro') recall_scores[i][j] = recall f1_scores[i][j] = f1 train_pred[valid_idx, i] = valid_pred test_pred[:, test_col] = clf.predict(T) test_col += 1 ## Probabilities valid_proba = clf.predict_proba(X_valid) train_proba[valid_idx, :] = valid_proba test_proba += clf.predict_proba(T) test_proba /= self.n_splits
Б. Установите вес / важность класса. Обучение с учетом затрат является одним из многих других подходов, позволяющих сделать случайный лес более подходящим для обучения на основе очень несбалансированных данных. РФ имеет тенденцию быть предвзятым к классу большинства. Следовательно, наложение штрафа за неправильную классификацию класса меньшинства может быть полезным. Поскольку доказано, что этот метод улучшает характеристики модели, я присваиваю более высокий вес классу меньшинства (т. Е. Более высокую стоимость ошибочной классификации). Затем веса классов включаются в алгоритм RF. Я определяю вес класса по соотношению между количеством наборов данных в классе-1 и количеством классов в наборе данных. Например, соотношение между количеством наборов данных в классе-1 и классе-3 составляет примерно 110, а соотношение для класса-1 и класса-2 составляет около 26. Позже я немного изменил это число для повышения производительности модели на методом проб и ошибок. Следующие ниже фрагменты кода показывают реализацию различных весов классов.
from sklearn.ensemble import RandomForestClassifier class_weight = dict({1:1.9, 2:35, 3:180}) rdf = RandomForestClassifier(bootstrap=True, class_weight=class_weight, criterion='gini', max_depth=8, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=4, min_samples_split=10, min_weight_fraction_leaf=0.0, n_estimators=300, oob_score=False, random_state=random_state, verbose=0, warm_start=False)
С. Прогнозировать метку больше, чем недооценивать: Этот метод не является обязательным. Я применял эту технику с тех пор, как меня попросили ее реализовать. Мне кажется, этот метод очень влияет на улучшение производительности класса меньшинства. Вкратце, метод состоит в том, чтобы больше всего наказывать модель, если она неправильно классифицирует класс-3, немного меньше - для класса-2 и меньше всего - для класса-1.
Для реализации метода я изменил порог вероятности для каждого класса. Для этого я установил вероятность для класса 3, класса 2 и класса 1 в порядке возрастания (т. Е. Класс 3 = 0,25, класс 2 = 0,35, класс 1 = 0,50), чтобы модель была вынужден переоценить класс. Подробную реализацию этого алгоритма можно найти на странице Github этого проекта.
Конечный результат:
Следующие результаты показывают, как три вышеупомянутых метода помогли улучшить производительность модели.
- Результат с перекрестной проверкой ансамбля:
2. Результат с перекрестной проверкой ансамбля + вес класса:
3. Результат с перекрестной проверкой ансамбля + вес класса + переоценка метки:
Заключение
Поначалу мне кажется, что завышение прогнозов - сложная задача. Однако изучение метода помогает мне найти способ обойти проблему. Из-за нехватки времени я не мог сосредоточиться на точной настройке и разработке функций модели. Есть много возможностей для дальнейшего улучшения модели. Например, удаление ненужных функций и добавление дополнительных функций инженерным путем. Я также пробовал LightGBM и XgBoost. Но за это короткое время я обнаружил, что Random Forest превосходит другие алгоритмы. Мы могли бы попробовать другие алгоритмы, в том числе нейронную сеть, чтобы улучшить модель. Наконец, я бы сказал, что из этой проблемы с данными я научился правильно организовывать несбалансированные данные.
Большое спасибо за чтение. Полный код можно найти на Github. Дайте мне знать, если у вас возникнут какие-либо вопросы или эта статья нуждается в исправлении.
Хотите найти поблизости кого-нибудь, кто тоже интересуется машинным обучением?
Я собираюсь закончить эту статью, поделившись интересной информацией о xoolooloo. Это поисковая система на основе местоположения, которая находит местных жителей по схожим и множественным интересам. Например, если вы читаете эту статью, вас наверняка интересуют наука о данных, теория графов, машинное обучение. Таким образом, вы можете найти людей с этими интересами в вашем районе; зайдите на www.xoolooloo.com
Давайте обсудим
Если у вас есть вопросы, не стесняйтесь спросить. Пожалуйста, комментируйте, если вы видите опечатки, ошибки или у вас есть предложения. Вы можете связаться со мной:
Email: [email protected] LinkedIn: https://www.linkedin.com/in/sabber-ahamed/ Github: https://github.com/msahamed Medium: https://medium.com/@sabber/