Введение
В этом практическом занятии показано, как применить разные конвейеры предварительной обработки и извлечения признаков к различным подмножествам признаков с использованием 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 для настройки гиперпараметров нашего конвейера.