Column Transformer с смешанными типами

Beginner

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

Введение

В этом практическом занятии показано, как применить разные конвейеры предварительной обработки и извлечения признаков к различным подмножествам признаков с использованием ColumnTransformer. Это особенно удобно в случае датасетов, содержащих различные типы данных, так как мы, возможно, захотим масштабировать числовые признаки и применить one-hot кодирование к категориальным.

В этом практическом занятии мы будем использовать датасет Titanic из OpenML для построения конвейера, который предварительно обрабатывает как категориальные, так и числовые данные с использованием ColumnTransformer, и используем его для обучения модели логистической регрессии.

Советы по использованию ВМ

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

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

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

Импорт библиотек

В этом шаге мы импортируем необходимые библиотеки для построения нашего конвейера.

import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.datasets import fetch_openml
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.feature_selection import SelectPercentile, chi2

Загрузка датасета

В этом шаге мы загрузим датасет Titanic из OpenML с использованием fetch_openml.

X, y = fetch_openml(
    "titanic", version=1, as_frame=True, return_X_y=True, parser="pandas"
)

Определение числовых и категориальных признаков

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

numeric_features = ["age", "fare"]
numeric_transformer = Pipeline(
    steps=[("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler())]
)

categorical_features = ["embarked", "sex", "pclass"]
categorical_transformer = Pipeline(
    steps=[
        ("encoder", OneHotEncoder(handle_unknown="ignore")),
        ("selector", SelectPercentile(chi2, percentile=50)),
    ]
)

Определение препроцессора

В этом шаге мы определим ColumnTransformer, который будет использоваться для предварительной обработки наших данных.

preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, numeric_features),
        ("cat", categorical_transformer, categorical_features),
    ]
)

Добавление классификатора в конвейер предварительной обработки

В этом шаге мы добавим классификатор логистической регрессии в наш конвейер предварительной обработки с использованием Pipeline.

clf = Pipeline(
    steps=[("preprocessor", preprocessor), ("classifier", LogisticRegression())]
)

Разделение данных

В этом шаге мы разделим наши данные на обучающий и тестовый наборы с использованием train_test_split.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Настроить конвейер

В этом шаге мы настроим наш конвейер на обучающие данные.

clf.fit(X_train, y_train)

Оценить конвейер

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

print("model score: %.3f" % clf.score(X_test, y_test))

Использовать ColumnTransformer для выбора столбцов по типам данных

В этом шаге мы будем использовать ColumnTransformer для выбора столбцов по типам данных. Мы будем использовать make_column_selector для выбора столбцов на основе их типов данных.

from sklearn.compose import make_column_selector as selector

subset_feature = ["embarked", "sex", "pclass", "age", "fare"]
X_train, X_test = X_train[subset_feature], X_test[subset_feature]

preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, selector(dtype_exclude="category")),
        ("cat", categorical_transformer, selector(dtype_include="category")),
    ]
)
clf = Pipeline(
    steps=[("preprocessor", preprocessor), ("classifier", LogisticRegression())]
)

Использовать Grid Search для настройки гиперпараметров

В этом шаге мы будем использовать grid search для настройки гиперпараметров нашего конвейера.

param_grid = {
    "preprocessor__num__imputer__strategy": ["mean", "median"],
    "preprocessor__cat__selector__percentile": [10, 30, 50, 70],
    "classifier__C": [0.1, 1.0, 10, 100],
}

search_cv = RandomizedSearchCV(clf, param_grid, n_iter=10, random_state=0)
search_cv.fit(X_train, y_train)

print("Best params:")
print(search_cv.best_params_)
print(f"Internal CV score: {search_cv.best_score_:.3f}")

Резюме

В этом практическом занятии мы узнали, как использовать ColumnTransformer для предварительной обработки категориальных и числовых данных в конвейере, а также как использовать grid search для настройки гиперпараметров нашего конвейера.