Преобразование признаков с использованием ансамблей деревьев

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы научимся преобразовывать признаки в пространство большей размерности и разреженности с использованием ансамбля деревьев. Затем мы обучим линейную модель на этих признаках. Мы будем использовать различные типы ансамблевых методов, включая Random Forest и Gradient Boosting, и сравним их производительность.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике в Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Подготовка данных

Во - первых, мы создадим большой датасет из 80 000 образцов и разделим его на три множества:

  • Множество для обучения ансамблевых методов, которые впоследствии будут использоваться в качестве трансформера для инженерных преобразований признаков
  • Множество для обучения линейной модели
  • Множество для тестирования линейной модели.
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=80_000, random_state=10)

X_full_train, X_test, y_full_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=10
)

X_train_ensemble, X_train_linear, y_train_ensemble, y_train_linear = train_test_split(
    X_full_train, y_full_train, test_size=0.5, random_state=10
)

Обучение ансамблевых методов

Для каждого из ансамблевых методов мы будем использовать 10 оценщиков и максимальную глубину в 3 уровня.

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier

n_estimators = 10
max_depth = 3

random_forest = RandomForestClassifier(
    n_estimators=n_estimators, max_depth=max_depth, random_state=10
)
random_forest.fit(X_train_ensemble, y_train_ensemble)

gradient_boosting = GradientBoostingClassifier(
    n_estimators=n_estimators, max_depth=max_depth, random_state=10
)
_ = gradient_boosting.fit(X_train_ensemble, y_train_ensemble)

Обучение трансформера встраивания

RandomTreesEmbedding - это метод без учителя и не требует самостоятельного обучения.

from sklearn.ensemble import RandomTreesEmbedding

random_tree_embedding = RandomTreesEmbedding(
    n_estimators=n_estimators, max_depth=max_depth, random_state=0
)

rt_model = make_pipeline(random_tree_embedding, LogisticRegression(max_iter=1000))
rt_model.fit(X_train_linear, y_train_linear)

Преобразование признаков с использованием Random Forest и Gradient Boosting

Теперь мы создадим два конвейера, которые будут использовать вышеописанное встраивание на этапе предварительной обработки. Преобразование признаков произойдет при вызове метода apply. Затем мы создадим конвейер, включающий в себя Random Forest или Gradient Boosting, а также логистическую регрессию. Однако, конвейер в scikit - learn ожидает вызов метода transform. Поэтому мы обернули вызов apply в FunctionTransformer.

from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import OneHotEncoder

def rf_apply(X, model):
    return model.apply(X)

rf_leaves_yielder = FunctionTransformer(rf_apply, kw_args={"model": random_forest})

rf_model = make_pipeline(
    rf_leaves_yielder,
    OneHotEncoder(handle_unknown="ignore"),
    LogisticRegression(max_iter=1000),
)
rf_model.fit(X_train_linear, y_train_linear)

def gbdt_apply(X, model):
    return model.apply(X)[:, :, 0]

gbdt_leaves_yielder = FunctionTransformer(
    gbdt_apply, kw_args={"model": gradient_boosting}
)

gbdt_model = make_pipeline(
    gbdt_leaves_yielder,
    OneHotEncoder(handle_unknown="ignore"),
    LogisticRegression(max_iter=1000),
)
gbdt_model.fit(X_train_linear, y_train_linear)

Оценка моделей

Наконец, мы можем показать различные кривые ROC для всех моделей.

import matplotlib.pyplot as plt
from sklearn.metrics import RocCurveDisplay

fig, ax = plt.subplots()

models = [
    ("RT embedding -> LR", rt_model),
    ("RF", random_forest),
    ("RF embedding -> LR", rf_model),
    ("GBDT", gradient_boosting),
    ("GBDT embedding -> LR", gbdt_model),
]

model_displays = {}
for name, pipeline in models:
    model_displays[name] = RocCurveDisplay.from_estimator(
        pipeline, X_test, y_test, ax=ax, name=name
    )
_ = ax.set_title("ROC curve")

Резюме

В этом практическом занятии мы научились преобразовывать признаки в пространство большей размерности и разреженности с использованием ансамбля деревьев. Мы использовали разные типы ансамблевых методов, включая Random Forest и Gradient Boosting, и сравнили их производительность. RandomTreesEmbedding - это метод без учителя и не требует самостоятельного обучения. Мы также узнали, как создавать конвейеры на основе Random Forest или Gradient Boosting с использованием логистической регрессии с помощью FunctionTransformer. Наконец, мы оценили производительность всех моделей с использованием кривых ROC.