А. Используйте перекрестную проверку ансамбля (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 этого проекта.

Конечный результат:

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

  1. Результат с перекрестной проверкой ансамбля:

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/