はじめに
この実験では、ColumnTransformer を使用して、異なる特徴量のサブセットに対してさまざまな前処理と特徴量抽出パイプラインを適用する方法を示します。これは、異種データ型を含むデータセットの場合に特に便利です。なぜなら、数値型の特徴量をスケーリングし、カテゴリ型の特徴量をワンホットエンコードする必要がある場合があるからです。
この実験では、OpenML からのタイタニック号のデータセットを使用して、ColumnTransformer を使ってカテゴリデータと数値データの両方を前処理するパイプラインを構築し、それを使ってロジスティック回帰モデルを学習させます。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、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
データセットの読み込み
このステップでは、fetch_openml を使って 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())]
)
グリッドサーチを使ってハイパーパラメータを調整する
このステップでは、グリッドサーチを使ってパイプラインのハイパーパラメータを調整します。
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をどのように使用するか、およびパイプラインのハイパーパラメータを調整するためにグリッドサーチをどのように使用するかを学びました。