レーシングシミュレータの実データを使って、データサイエンスの概念を実装とともに解説しています。
この記事では決定木とRandom Forestを扱います。
こんな人に役立ちます
- 決定木とRandom Forestの違いを直感的に理解したい
- 特徴量重要度が何を測っているかを知りたい
- 相関係数との使い分けを実例で比べたい
結論
- 4つの走行指標のうち T1区間通過タイムへの寄与が最も高い変数はスロットル全開距離(43.5%)
- 相関係数の1位とは一致するが2〜4位の順序は異なる——2手法は補完的な視点
- 4指標だけでは予測精度に限界あり(CV R²が負)——重要度ランキングと予測精度は独立した話
問い:「相関係数が低い変数」でも、予測に役立てる方法はあるか
前の記事で外れ値を除いた後の95本では、4つの指標の相関係数は次の通りでした。
入口速度 : r = -0.129 (n.s.)
最大制動G : r = -0.131 (n.s.)
最大横G : r = +0.245 (*)
スロットル全開距離 : r = -0.463 (***)
入口速度と最大制動Gは「統計的に有意な相関なし」の判定です。では、これらの変数は本当に役に立たないのでしょうか。
相関係数は「線形の関係」しか測れません。非線形な関係や複数変数の組み合わせを捉えるには、別の手法が必要です。
決定木:「if-then」を繰り返して予測する
Random Forestの前に、その基本単位である決定木(Decision Tree)を理解します。
決定木は「ある変数がある閾値より大きいか小さいか」という分岐を繰り返して予測値を決めます。
from sklearn.tree import DecisionTreeRegressor, plot_tree
dt = DecisionTreeRegressor(max_depth=3, random_state=42)
dt.fit(X, y)
根ノード(一番上)の分割条件は「スロットル全開距離 <= 751.573 m」です。
- 真(<=751m):16本のラップ。T1タイム平均 12.783秒——比較的遅いグループ
- 偽(>751m):79本のラップ。T1タイム平均 12.241秒——速いグループ
「T1区間内で全開にできていた距離が短いグループ(<=751m)」と「全開にできていた距離が長いグループ(>751m)」に分かれています。この1回の分割だけで95本のラップが2つのグループに整理でき、スロットル全開距離がデータの中で最も情報量の多い変数であることが視覚的に確認できます。これは単に「早く踏めばよい」という意味ではなく、ブレーキ・旋回・立ち上がりがうまくつながった結果として全開区間を長く確保できているラップほど速い、という解釈が成立します。
不純度(impurity)と分割の選び方
決定木は「分割後のグループ内のばらつきが最も小さくなる変数と閾値」を自動的に選びます。このばらつきの指標を不純度と呼び、回帰では分散(MSE)が使われます。スロットル全開距離が根ノードに選ばれたのは、この変数で分割したときに各グループ内の T1タイムのばらつきが最も小さくなるからです。
Random Forest:多数の決定木の平均
1本の決定木の問題は過学習(overfitting)です。深い木は訓練データを記憶してしまい、見たことのないデータには対応できません。
# 1本の決定木
dt_r2_train = dt.score(X, y) # → 0.552
dt_cv_r2 = cross_val_score(dt, X, y, cv=5, scoring='r2').mean() # → -1.752
訓練 R²=0.552 に対して、5分割交差検証の R²=-1.752。平均値をそのまま予測するより悪い という結果です。
Random Forest はこの過学習を緩和します。
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=300, random_state=42, n_jobs=-1)
rf.fit(X, y)
rf_r2_train = rf.score(X, y) # → 0.884
rf_cv_r2 = cross_val_score(rf, X, y, cv=5, scoring='r2').mean() # → -1.150
仕組みは次の通りです。
- 訓練データからランダムにサンプルを復元抽出(バギング)
- 各分割で使う変数もランダムに限定(特徴量サブサンプリング)
- 上記の手順で300本の木を独立に学習させる
- 予測時は300本の出力の平均を取る
決定木の CV R²=-1.752 に対して、RF は -1.150 に改善しています。ただし今回は4指標だけでは T1タイムを精度よく予測するには不十分 で、両モデルとも交差検証では平均値予測以下の精度に留まります(後述)。
特徴量重要度:各変数の「貢献度」を数値化する
RF の学習後、各変数がどれだけ予測に貢献したかを取り出せます。
rf_df = pd.DataFrame({
'feature': feat_names,
'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)
特徴量重要度は「全ての木・全ての分割において、その変数で分割したときの不純度減少量の合計(を正規化したもの)」です。重要な変数ほど、多くの分割で大きなばらつき低減に貢献しています。
相関係数との比較
RF重要度 |相関係数|
スロットル全開距離 43.5% 0.463 ← 両手法で1位
最大制動G 24.6% 0.131 ← RF2位、相関3位
最大横G 17.0% 0.245 ← RF3位、相関2位
入口速度 14.9% 0.129 ← RF4位、相関4位
1位はどちらもスロットル全開距離です。ただし2〜3位の順序が異なります。相関係数は最大横G > 最大制動G の順ですが、RF は逆転しています。
この違いの解釈:相関係数は「線形な一対一の関係」を測ります。RF は「他の変数と組み合わせたときの予測貢献度」を測ります。最大制動G は単体では相関が弱い(r=-0.131)ですが、スロットル全開距離と組み合わせたときの補完効果をRFが捉えています。
また、入口速度と最大制動Gの相関係数は有意でなかった(p > 0.2)にもかかわらず、RF重要度はそれぞれ14.9% / 24.6% です。「線形な関係がない = 予測に役立たない」ではないことがわかります。
予測精度を確認する
左(決定木)は予測値が数種類の離散値に集中しています——深さ3の木なので葉ノードが最大8個しかなく、同じグループに属するラップには同じ値が返されます。
右(RF)は300本の木の平均を取るため予測値が連続的に分布し、対角線に近い点が増えています。しかし対角線から大きく外れた点も多く、精度は限定的です。
交差検証の結果:
- 決定木:CV R² = -1.752
- Random Forest:CV R² = -1.150
どちらも CV R² が負——平均値を予測するだけより悪い結果です。R²は「全ラップの平均値をそのまま返すだけのモデル」と比べて、どれだけ良く予測できたかを表す指標です。CV R²が負ということは、未知データに対しては平均値予測よりも外れていたことを示します。
つまり、今回の4指標だけでは T1タイムの変動を説明しきれません。T1タイムには今回含めなかった要因(ライン取り、重量移動のタイミング、車体姿勢など)も影響していると考えられます。
特徴量重要度と予測精度は別の話
RF の重要度ランキングは「この変数が相対的にどれだけ使われたか」を示すものであり、「モデルが精度よく予測できているか」とは独立しています。今回は「スロットル全開距離が最も重要」という知見は得られましたが、4指標で T1タイムをピンポイントに予測する精度は出ませんでした。特徴量重要度を読むときは、モデル全体の精度(R²やCV R²)を必ずセットで確認する必要があります。
まとめ
| 指標 | RF重要度 | 相関係数の絶対値 | 相関の有意性 |
|---|---|---|---|
| スロットル全開距離 | 43.5%(1位) | 0.463(1位) | *** |
| 最大制動G | 24.6%(2位) | 0.131(3位) | n.s. |
| 最大横G | 17.0%(3位) | 0.245(2位) | * |
| 入口速度 | 14.9%(4位) | 0.129(4位) | n.s. |
決定木は「変数の閾値で分割」という直感的な構造を持ちますが、1本では過学習します。Random Forest は多数の木の平均を取ることで安定しますが、今回のように特徴量の数が少ない場合は交差検証での精度が低くなることもあります。
特徴量重要度は「どの変数が予測に貢献したか」のランキングとして有効ですが、R²などのモデル精度と切り離しては読めません。重要度が高くても、モデル全体の精度が低ければその解釈は限定的です。
この手法が使える場面
「どの変数が予測に貢献しているか」を順位付けしたい場面に広く使えます。
| 領域 | 特徴量(入力変数) | 目的変数 |
|---|---|---|
| モータースポーツ | スロットル・ブレーキ・横G | セクタータイム |
| 製造業 | 温度・圧力・回転数 | 製品品質・不良率 |
| EC・マーケティング | 広告費・配信時間・CTR | CVR・売上 |
| 設備保全 | 振動・温度・稼働時間 | 故障リスク |
Random Forest の特徴量重要度は 線形・非線形を問わず 変数の貢献度を測れます。ただし今回のように CV R² を必ずセットで確認 し、「重要度が高い = 精度が高い」ではないことを念頭に置いて使います。
参考
- データ:GT7テレメトリ(富士スピードウェイ、Supra18、RM、Dry、95ラップ)
- ライブラリ:numpy、pandas、scipy、scikit-learn、matplotlib
- T1区間の紹介(note)
- データスキーマ詳細(note)
- 前記事:外れ値・標準偏差


