パイプライン処理で効率化: scikit-learnのpipelineモジュール
scikit-learnのpipelineについてChatGPTに訊いてみた。
要するに、.fit()メソッドを使った一連の処理を効率的に実行できる、ということか。確かにコードも読みやすくなるし、慣れればいろいろ使えそう。
Pipelineとは
Pipelineは、.fit()メソッドを持つ一連のオブジェクト(変換器や予測器など)の処理を効率的に自動化するためのツールです。
基本:スケーリングとモデルの学習
スケーリングとロジスティック回帰モデルの学習を行います。
まず、共通の前処理で、scikit-learnの「breast_cancerデータセット」を訓練データとテストデータに分割します。
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# データの読み込み
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=42)
Pipelineを使わない場合
以下は、スケーリングとモデルの学習をPipelineを使わずに行う方法です:
# スケーリング
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# モデルの学習
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
# 精度の計算
predictions = model.predict(X_test_scaled)
accuracy = accuracy_score(y_test, predictions)
print("Accuracy:", accuracy)
Pipelineを使った場合
Pipelineを使用すると、スケーリングとモデル学習のプロセスを一つの連続したプロセスとして実行できます:
from sklearn.pipeline import Pipeline
# Pipelineの作成
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])
# スケーリングとモデルの学習を一度に
pipeline.fit(X_train, y_train)
# 精度の計算
predictions = pipeline.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print("Pipeline Accuracy:", accuracy)
応用:FunctionTransformerとカスタム変換器
さらに、FunctionTransformerやカスタム変換器を使用することで、.fit()メソッドを持たない既存の関数や独自の関数もPipelineに組み込むことが可能です。
FunctionTransformer
FunctionTransformerは、.fit()メソッドを持たない既存の関数をPipelineに組み込むために使います。以下は、ログ変換を行う関数をPipelineに組み込む例です:
from sklearn.preprocessing import FunctionTransformer
import numpy as np
# ログ変換を行う関数
def log_transform(x):
return np.log(x + 1)
# FunctionTransformerの作成
log_transformer = FunctionTransformer(log_transform)
# Pipelineに組み込む
pipeline = Pipeline([
('log', log_transformer),
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])
# 学習と評価
pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print("FunctionTransformer Accuracy:", accuracy)
カスタム変換器
カスタム変換器を作成することで、独自の複雑なデータ変換ロジックや特定の条件に基づく処理をPipelineに組み込むことができます。以下はカスタム変換器の例です:
# カスタム変換器の定義
class MyCustomTransformer(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
# 特定の条件の学習や設定
return self
def transform(self, X):
# データ変換のロジック
return X_transformed