1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロから始めるDecision Tree入門⓵:身近な例で機械学習モデルを作ってみよう

Last updated at Posted at 2025-08-16

ゼロから始める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)
.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)に近いほど精度が良いことを意味します。
.python
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()

matplotlib01.png

  • 特徴量の重要度を可視化
    決定木では「どの特徴量が予測にどれだけ寄与したか」を確認できます。
.python
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()

matplotlib02.png


まとめ

  • Decision Treeは、条件分岐で予測を行うシンプルなモデル
  • Pandasでデータを整形 → scikit-learnでモデル構築 → 予測・評価の流れが基本
  • random_stateは再現性を確保する重要なパラメータ

関連リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?