ゼロから始めるDecision Tree入門:身近な例で機械学習モデルを作ってみよう
はじめに
機械学習のモデルの一つに Decision Tree(決定木) があります。
これは、条件分岐を木構造の形で表現し、データから予測や分類を行うシンプルかつ強力なアルゴリズムです。
今回は、身近な例として「男性のモテ度を推定するモデル」を作ってみます。
(もちろん実際の恋愛はもっと複雑ですが、ここでは学習目的のサンプルです!)
例として、以下のようなモテ度予測の簡単なDecision Treeを想像してみましょう。
[年収 > 500万円?]
/ \
Yes No
/ \
[身長 > 175cm?] モテ度 30%
/ \
Yes No
モテ度 80% モテ度 60%
このようなツリー構造を機械的に構築し、データを使って最適化するのがDecision Treeモデルです。
必要なライブラリ
- Pandas
- scikit-learn(
pip install scikit-learn
) - matplotlib(
pip install matplotlib
)
モデル構築の基本的な流れ
1. データの取得
- サンプルデータ(.csv)
身長_cm,体脂肪率_%,年収_万円,モテ度_%
170,18,400,60
165,22,350,40
180,15,800,85
175,20,600,70
160,25,300,35
185,12,1000,95
172,19,500,65
178,16,700,80
168,23,320,45
182,14,900,90
CSVやExcelなどからデータを読み込みます。
import pandas as pd
df = pd.read_csv("mote_data.csv")
2. データの整形・分析
- 整形: データ型変換、欠損値処理、カラム名変更など
- 分析: 変数候補を確認
print(df.columns) # カラム一覧
3. 変数の準備
- 予測対象(目的変数):
y = df["モテ度"]
- 特徴量(説明変数):
features = ["身長", "体脂肪率", "年収"]
X = df[features]
4. モデルの構築
scikit-learnのDecisionTreeRegressor
を使用します。
from sklearn.tree import DecisionTreeRegressor
# random_stateは乱数シードの固定用パラメータ
# これを設定すると、実行ごとに同じ結果が得られます
model = DecisionTreeRegressor(random_state=1)
# モデルの学習(適合)
model.fit(X, y)
5. モデル予測
predictions = model.predict(X)
print(predictions)
6. モデルの評価
print("実際のモテ度: ")
print(y.head())
print("予測されたモテ度: ")
print(model.predict(X.head()))
7. モデルの品質測定
機械学習モデルを構築した後は、予測精度を評価する必要があります。ここでは代表的な指標として**平均絶対誤差(MAE: Mean Absolute Error)**を使います。
- 平均絶対誤差(MAE)
- 実測値と予測値の差の絶対値の平均を計算する指標
- 値が小さいほど予測が実測値に近いことを意味します
from sklearn.metrics import mean_absolute_error
# predictions は先ほどのモデルによる予測結果
mae = mean_absolute_error(y, predictions)
print(f"平均絶対誤差(MAE): {mae}")
- データを分割して評価(train_test_split)
単純に全データで評価すると**過学習(Overfitting)**の可能性があります。
train_test_split を使うことで、学習用データと検証用データに分け、モデルの汎化性能を確認できます。
from sklearn.model_selection import train_test_split
# データを学習用と検証用に分割
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=0)
# モデルの学習
model.fit(train_X, train_y)
# 検証データで予測
val_predictions = model.predict(val_X)
# 検証データのMAEを計算
val_mae = mean_absolute_error(val_y, val_predictions)
print(f"検証データでの平均絶対誤差(MAE): {val_mae}")
補足: random_state
とは?
機械学習アルゴリズムの一部は、初期値やデータ分割に乱数を使います。
random_state
を設定することで、この乱数の種を固定し、毎回同じ結果を得ることができます。
再現性を確保するため、学習時には設定しておくことが推奨されます。
8. 可視化してみよう(matplotlib)
数値だけでなく、グラフで可視化するとモデルの挙動がより分かりやすくなります。
ここでは デファクトスタンダードであるMatplotlib を用いて予測結果を可視化してみましょう。
(SeabornやPlotlyが使われることもあるようです。)
- 実測値と予測値の比較(散布図)
これにより、予測がどの程度実際の値に近いかを一目で確認できます。点が赤い破線(y=x)に近いほど精度が良いことを意味します。
import matplotlib.pyplot as plt
# 実測値 vs 予測値 を散布図で表示
plt.figure(figsize=(6,6))
plt.scatter(y, predictions, alpha=0.6)
# 参考線(y=x)を描画
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')
plt.xlabel("実測値")
plt.ylabel("予測値")
plt.title("実測値 vs 予測値")
plt.show()
- 特徴量の重要度を可視化
決定木では「どの特徴量が予測にどれだけ寄与したか」を確認できます。
import numpy as np
# 特徴量の重要度を取得
importances = model.feature_importances_
# 棒グラフで表示
plt.figure(figsize=(6,4))
plt.bar(features, importances)
plt.xlabel("特徴量")
plt.ylabel("重要度")
plt.title("特徴量の重要度 (Feature Importance)")
plt.show()
まとめ
- Decision Treeは、条件分岐で予測を行うシンプルなモデル
- Pandasでデータを整形 → scikit-learnでモデル構築 → 予測・評価の流れが基本
-
random_state
は再現性を確保する重要なパラメータ