Shikata Ga Nai

Private? There is no such things.

36. 特徴量エンジニアリングの重要性

Hello there, ('ω')ノ

📌 1. 特徴量エンジニアリングとは?

✅ 特徴量エンジニアリングとは?

特徴量エンジニアリング(Feature Engineering) とは、
機械学習モデルが適切に学習できるように、データを最適な形に変換するプロセス です。

📌 なぜ特徴量エンジニアリングが重要なのか? - 適切な特徴量を作れば、単純なモデルでも高精度な予測が可能! - 不要な特徴を削除することで、過学習を防ぎ、学習を高速化! - 特徴量のスケーリングやエンコーディングにより、学習効率が向上!

「データをどう加工するか」が、モデルの性能を決める!


📌 2. 代表的な特徴量エンジニアリング手法

✅ ① カテゴリ変数のエンコーディング

機械学習モデル(特にXGBoostやランダムフォレストなどの決定木系)は、文字データを扱えない ため、
カテゴリデータ(例: 「性別=男性・女性」)を数値化する必要があります。

📌 代表的なエンコーディング方法

手法 説明
One-Hot Encoding カテゴリを「0 or 1」のダミー変数に変換 性別 → [男性:1, 女性:0]
Label Encoding カテゴリを整数値に変換 性別 → [男性:0, 女性:1]
Target Encoding 各カテゴリのターゲット平均を特徴量にする 職業 → [エンジニア:0.8, 医師:0.9]

決定木系のモデルなら「Label Encoding」でもOK、線形モデルなら「One-Hot Encoding」が必要!


✅ ② 数値データのスケーリング

数値データの単位がバラバラだと、学習がうまくいかないことがあります。
例えば、「年収(万円)」と「年齢(歳)」をそのまま使うと、年収の値が圧倒的に大きくなり、学習が偏る可能性があります。

📌 代表的なスケーリング方法

手法 説明
標準化(Standardization) 平均0、標準偏差1に変換 z = (x - μ) / σ
正規化(Normalization) 0〜1の範囲に変換 x = (x - min) / (max - min)
対数変換(Log Transformation) 外れ値の影響を抑える x = log(x + 1)

線形回帰やSVMなどのモデルでは「標準化」が重要!


✅ ③ 新しい特徴量の作成

「既存の特徴を組み合わせて、新しい特徴量を作る」 のも有効な手法です。
例えば、不動産価格の予測では、「家の広さ(m²)」だけでなく、
「家の広さ ÷ 部屋数」(1部屋あたりの面積)
「家の広さ × 最寄り駅までの距離」(アクセスの良さ)
などの新しい特徴を作ることで、モデルの性能が向上します!

📌

df["price_per_room"] = df["total_price"] / df["num_rooms"]
df["income_to_debt_ratio"] = df["income"] / df["debt"]

「ドメイン知識」を活かして、新しい特徴量を考えることがポイント!


✅ ④ 時系列データの特徴量エンジニアリング

時系列データ(例: 売上データ、天気データ)では、以下のような特徴を作成できます。

📌 時系列データの特徴例

特徴 説明
曜日(Day of Week) 曜日(0〜6)
月(Month) 月(1〜12)
移動平均(Rolling Mean) 直近N日間の平均値
差分(Difference) 前日との差(トレンドを学習)

📌 例(曜日情報の追加)

df["date"] = pd.to_datetime(df["date"])
df["day_of_week"] = df["date"].dt.dayofweek

時系列データでは「過去のデータを活用する特徴量」が有効!


📌 3. Pythonで実践! 特徴量エンジニアリング

以下のコードでは、
カテゴリ変数のエンコーディング
数値データのスケーリング
新しい特徴量の作成
を実践します!

import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# サンプルデータ
data = {
    "gender": ["male", "female", "female", "male"],
    "age": [25, 30, 45, 35],
    "income": [500, 800, 1200, 1500]
}
df = pd.DataFrame(data)

# One-Hot Encoding(性別)
df = pd.get_dummies(df, columns=["gender"])

# 標準化(年齢 & 収入)
scaler = StandardScaler()
df[["age", "income"]] = scaler.fit_transform(df[["age", "income"]])

# 新しい特徴量の作成(収入 ÷ 年齢)
df["income_per_age"] = df["income"] / df["age"]

print(df)

数値データの標準化 + カテゴリ変数のOne-Hot Encoding!
新しい特徴量「income_per_age(収入 ÷ 年齢)」を追加!


📌 4. 特徴量エンジニアリングのベストプラクティス

特徴量の分布を確認し、外れ値を処理する(ヒストグラム, BoxPlot)
相関が高すぎる特徴量は削除する(VIF, 相関係数)
ターゲット(目的変数)と相関が強い特徴量を優先する
不要な特徴を削除することで、過学習を防ぐ!


🎯 まとめ

特徴量エンジニアリングは、モデルの性能を決める重要なプロセス!
カテゴリ変数のエンコーディングや数値データのスケーリングが必須!
新しい特徴量を作ることで、より良い予測が可能!
Pythonで実践し、効果的な特徴量を作成してみよう!

Best regards, (^^ゞ