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, (^^ゞ