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

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

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

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

Введение

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

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

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

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_selection("Feature Selection") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/impute("Impute") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/compose("Composite Estimators") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/preprocessing -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/feature_selection -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/pipeline -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/impute -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/model_selection -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/compose -.-> lab-49086{{"Column Transformer с смешанными типами"}} sklearn/datasets -.-> lab-49086{{"Column Transformer с смешанными типами"}} ml/sklearn -.-> lab-49086{{"Column Transformer с смешанными типами"}} end

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

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

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 для настройки гиперпараметров нашего конвейера.

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 для настройки гиперпараметров нашего конвейера.