Прежде чем мы начнем понимать, что такое ансамблевое обучение и как оно работает, нам нужно знать набор данных, используемый в этом тематическом исследовании.

Используемый набор данных является подмножеством базы данных переписи населения США за 1994 год, предоставленной Барри Беккером и доступной в Репозитории машинного обучения UCI. Задача прогнозирования этого репозитория - определить, человек зарабатывает более 50 тыс. В год, для этого предусмотрены следующие атрибуты и значения:

  • high_income: целевой класс.
  • возраст: постоянно.
  • рабочий класс: частный, Self-emp-not-inc, Self-emp-inc, федеральное правительство, местное правительство, государственное правительство, без оплаты, никогда не работал.
  • fnlwgt: непрерывно.
  • образование: бакалавриат, Some-College, 11-е, высшее образование, профессиональная школа, Assoc-acdm, доц., 9, 7-8, 12, магистратура, 1–4, 10, докторская степень. , 5-6-я, дошкольное учреждение.
  • education-num: непрерывное.
  • семейное положение: женат-гражданский супруг, разведен, не был в браке, разлучен, вдовец, женат-супруг-отсутствует, женат-AF-супруг.
  • род деятельности: техподдержка, ремесло-ремонт, другое-обслуживание, продажи, исполнительный менеджер, проф-специальность, хендлеры-уборщики, машинная поддержка, адм-канцелярия, сельское хозяйство-рыболовство, транспорт. -перемещение, Прив-хаус-серв, Защит-серв, Вооруженные Силы.
  • отношения: жена, собственный ребенок, муж, не в семье, другой родственник, не состоящий в браке.
  • раса: белые, выходцы из Азии, выходцы из тихоокеанских островов, американские индейцы-эскимосы, другие, черные.
  • пол: женский, мужской.
  • прирост капитала: непрерывно.
  • убыток капитала: непрерывно.
  • часов в неделю: непрерывно.
  • родная страна: США, Камбоджа, Англия, Пуэрто-Рико, Канада, Германия, окраины США (Гуам-ВИ-США и т. д.), Индия, Япония, Греция, Юг, Китай, Куба, Иран, Гондурас, Филиппины, Италия, Польша, Ямайка, Вьетнам, Мексика, Португалия, Ирландия, Франция, Доминиканская Республика, Лаос, Эквадор, Тайвань, Гаити, Колумбия, Венгрия, Гватемала, Никарагуа, Шотландия, Таиланд, Югославия, Эль- Сальвадор, Тринадад и Тобаго, Перу, Гонконг, Голландия-Нидерланды.

Что такое ансамблевое обучение?

Ансамблевое обучение - это метод, который объединяет другие модели машинного обучения для оптимизации и создания более совершенной.

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

Упаковка и оклейка: что это такое? Как это работает?

B ootstrap Agg regat ing или Bagging метод, сочетающий методы начальной загрузки и агрегирования. Первый метод состоит в разделении набора данных на n подмножеств с заменой, идея второго метода заключается в создании n моделей, по одной для каждого подмножества, и их агрегации для получения окончательного результата. прогноз.

Метод вставки работает аналогично бэггингу, но разница заключается в том, что на этапе начальной загрузки разделение выполняется без замены.

А что насчет Случайного леса?

Случайный лес - это особый тип алгоритма ансамбля, который использует несколько деревьев решений для построения своей модели. Каждое дерево обучается с разными частями набора данных. Обычно это разделение выполняется аналогичным образом с использованием техники мешков, и окончательная модель строится из нескольких моделей дерева решений, которые в совокупности производят прогноз модели.

А теперь пора писать код!

В этом проекте мы будем использовать python в качестве языка программирования и библиотеки: pandas и scikit-learn. Для начала давайте узнаем «лицо» наших данных:

# load the dataset
income = pd.read_csv("income.csv")
income.head()

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

Теперь мы будем использовать две отличные функции scikit-learn, названные Pipeline и GridSearchCV, которые позволяют нам автоматически тестировать несколько гиперпараметров различных моделей.

# split-out train/validation and test dataset
X_train, X_test, y_train, y_test = train_test_split(income.drop(labels="high_income",axis=1),                                                    income["high_income"],test_size=0.20,random_state=seed,shuffle=True,stratify=income["high_income"])
# The full pipeline as a step in another pipeline with an estimator as the final step
pipe = Pipeline(steps = [("clf",RandomForestClassifier())])
# create a dictionary with the hyperparameters
search_space = [{"clf":[DecisionTreeClassifier()],
                 "clf__criterion": ["gini","entropy"],
                 "clf__splitter": ["best","random"],
                 "clf__random_state": [seed],
                 "fs__score_func":[chi2],
                 "fs__k":[4,6,8]},
                {"clf":[RandomForestClassifier()],
                 "clf__n_estimators": [200,300],
                 "clf__criterion": ["gini","entropy"],
                 "clf__max_leaf_nodes": [32,64,128],
                 "clf__random_state": [seed],
                 "fs__score_func":[chi2],
                 "fs__k":[4,6,8]},
                {'clf' [BaggingClassifier(DecisionTreeClassifier(random_state=42))],
                 "clf__base_estimator__criterion": ['gini','entropy'],
                 "clf__base_estimator__splitter": ['best','random'],
                 "clf__oob_score": [True],
                 "clf__n_estimators": [200,300],
                 "clf__bootstrap":[True],
                 "fs__score_func":[chi2],
                 "fs__k":[4,6,8]},
                {'clf': [BaggingClassifier(DecisionTreeClassifier(random_state=42))],
                 "clf__base_estimator__criterion": ['gini','entropy'],
                 "clf__base_estimator__splitter": ['best','random'],
                 "clf__oob_score": [False],
                 "clf__n_estimators": [200,300],
                 "clf__bootstrap":[False],
                 "fs__score_func":[chi2],
                 "fs__k":[4,6,8]}]
# create grid search
kfold = KFold(n_splits=num_folds,random_state=seed)
grid = GridSearchCV(estimator=pipe, 
                    param_grid=search_space,
                    cv=kfold,
                    scoring=scoring,
                    return_train_score=True,
                    n_jobs=-1,
                    refit="AUC", verbose=10)
# fit grid search
best_model = grid.fit(X_train,y_train)

Эта конфигурация позволяет алгоритму использовать все доступные ядра, которые будут тестировать 960 различных конфигураций деревьев решений, случайных лесов и классификаторов пакетов (с деревьями решений в качестве внутренней модели) параллельно.

После этого процесса лучшей моделью, созданной GridSearchCV, была модель случайного леса со следующей конфигурацией:

Прежде чем мы определим, является ли это лучшей моделью, давайте проверим точность модели для обучения и тестирования наборов данных. Цель этого сравнения - проверить, недостаточно или переоборудована модель.

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

В классификаторе случайного леса мы можем установить гиперпараметр под названием bootstrap, который определяет, будут ли образцы погоды обучаться с заменой или нет. Хотя лучшая модель была выбрана с этим параметром как false, который пытается помочь модели свести к минимуму вероятность переобучения, несколько других моделей дают аналогичные результаты, когда параметр был установлен. как true, как видно на изображении ниже.

Итак, для этого набора данных мы достигли хороших результатов независимо от значения переменной начальной загрузки. Однако худшие результаты из-за возможного переобучения были при начальной загрузке, равной true.

Понимание важности функции

Теперь давайте проверим важность каждой функции набора данных для нашей модели. Для этой задачи мы использовали два инструмента: важность функции из классификатора случайного леса и библиотеку SHAP (SH apley A dditive ex P lanations), который представляет собой единый подход к объяснению результатов любой модели машинного обучения.

Левое изображение было создано feature_importances_ из scikit-learn, а правое изображение было создано SHAP. Важно видеть, что оба результата представляют схожие результаты и 4 наиболее важные характеристики совпадают, изменяются только позиции. По этим результатам легко узнать информацию, которая больше всего влияет на модель, что очень помогает понять и решить проблему.