特徴量エンジニアリング

本番環境向けのMachine Learningモデル開発

Sinan Ozdemir

Data Scientist and Author

特徴量エンジニアリング入門

  • 学習データを変換し、MLパイプラインの性能を最大化
  • 計算の複雑さを削減
    • 複数ソースからのデータ集約
    • 新しい特徴量の構築
    • 特徴量変換の適用

特徴量エンジニアリングのパイプライン

1 https://www.manning.com/books/feature-engineering-bookcamp
本番環境向けのMachine Learningモデル開発

複数ソースからのデータ集約

  • 異なるデータセットを結合
  • 複数タイプのデータを使用(例: 数値・カテゴリ)

利点:

  • モデル精度の向上
  • より複雑なモデルの活用

画面上のグラフ

本番環境向けのMachine Learningモデル開発

データ集約の例

class DataAggregator:
    def __init__(self):
        pass

    def fit(self, X, y=None):
        return self  # 学習することはない

    def transform(self, X, y=None):
        # 複数ソースからデータを読み込む
        data1 = pd.read_csv('data1.csv')
        data2 = pd.read_csv('data2.csv')
        data3 = pd.read_csv('data3.csv')

        # すべてのソース(X含む)を結合して1つのデータフレームに
        aggregated_data = pd.concat([X, data1, data2, data3], axis=0)

        return aggregated_data  # 集約データを返す
本番環境向けのMachine Learningモデル開発

特徴量構築

  • 既存の特徴量から新しい特徴量を作る
  • 既存データから新特徴量を生成
  • モデル性能の向上
  • 解釈性の向上
本番環境向けのMachine Learningモデル開発

特徴量構築の例

class FeatureConstructor:
    def __init__(self):
        pass

    def fit(self, X, y=None):
        return self

    def transform(self, X, y=None):
        # 各列の平均を計算
        mean_values = X.mean()

        # 平均に基づく新しい特徴量を作成
        X['mean_col1'] = X['col1'] - mean_values['col1']
        X['mean_col2'] = X['col2'] - mean_values['col2']

        return X  # 拡張したデータを返す
本番環境向けのMachine Learningモデル開発

特徴量変換

既存の特徴量をその場で変換

  • データ分布の正規化
  • 外れ値の除去
  • 精度・性能の向上
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

data = load_breast_cancer()  # データセットを読み込み
X, y = data.data, data.target
model = LogisticRegression(random_state=42)  # モデルを作成

# 学習・テストに分割
X_train, X_test, y_train, y_test = train_test_split(
  X, y, test_size=0.3, random_state=42)

model.fit(X_train, y_train)  # スケーリングなしで学習
y_pred_no_scaling = model.predict(X_test)
acc_no_scaling = accuracy_score(y_test, y_pred_no_scaling)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model.fit(X_train_scaled, y_train)  # スケーリングありで学習
y_pred_with_scaling = model.predict(X_test_scaled)
acc_with_scaling = accuracy_score(y_test, y_pred_with_scaling)

# スケーリング有無で精度を比較
print(f"Accuracy without scaling: {acc_no_scaling}")  # 0.971
print(f"Accuracy with scaling: {acc_with_scaling}")  # 0.982
本番環境向けのMachine Learningモデル開発

特徴量選択

冗長・無関係な特徴量を除き、より大きな集合からサブセットを選択

  • 過学習の抑制
  • 精度・性能の向上
  • 解釈性の向上

特徴量選択

1 https://www.manning.com/books/feature-engineering-bookcamp
本番環境向けのMachine Learningモデル開発

特徴量エンジニアリングの例(続き)

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.pipeline import Pipeline

pipeline = Pipeline([  # 特徴量エンジニアリングのパイプライン定義

    ('aggregate', DataAggregator()),  # 複数ソースのデータを集約

    ('construction', FeatureConstructor()),  # 特徴量構築

    ('scaler', StandardScaler()),  # 特徴量変換

    ('select', SelectKBest(chi2, k=10)),  # 特徴量選択
])
X_transformed = pipeline.fit_transform(X)  # パイプラインで学習・変換
本番環境向けのMachine Learningモデル開発

特徴量エンジニアリングをさらに学ぶ

FEの書籍

本番環境向けのMachine Learningモデル開発

練習しましょう!

本番環境向けのMachine Learningモデル開発

Preparing Video For Download...