タイトルのテキスト
タイトルのテキスト
タイトルのテキスト
タイトルのテキスト

決定木 (Decision Tree) の回帰と分類における使い方

AI Python

t f B! P L

 

ブッダと木

決定木は、回帰や分類問題に広く使われる機械学習のモデルです。直感的で解釈しやすく、特にデータが複雑でない場合やデータの前処理を最小限にしたいときに効果的です。この記事では、決定木の仕組みを簡単に説明し、それぞれの問題(回帰と分類)における決定木の使い方について、Pythonのコード例を用いながら解説します。

1. 決定木の概要

決定木は、木構造に基づいたアルゴリズムで、データを条件に基づいて分割していくことで予測を行います。木の各「ノード」は、データを条件によって分割し、最終的に「葉」に到達したときに予測値を出力します。

分類問題 (Classification): 目的はデータをカテゴリーに分けることです。例えば、犬か猫かを判別するなど。

回帰問題 (Regression): 目的は連続値を予測することです。例えば、家の価格を予測するなど。

2. 決定木の仕組み

決定木は、次のステップで構築されます。

特徴量の選択: すべての特徴量について、データを分割する条件(しきい値)を試し、最も分割が有効な特徴量を選びます。

データの分割: 選ばれた特徴量に基づいてデータを2つ以上の部分に分割します。

再帰的分割: 各分割されたデータについて、さらに同じ手順で再帰的にデータを分割していきます。分割は、一定の深さに達するか、分割が有効でなくなるまで続けられます。

3. Pythonでの決定木の使い方

決定木は、Pythonの代表的な機械学習ライブラリであるscikit-learnを使って簡単に実装できます。次に、回帰と分類に分けて具体的な実装を見ていきます。

3.1. 決定木による分類

ここでは、アイリスデータセットを使って、花の種類を分類する例を紹介します。

1. 必要なライブラリのインストール

pip install scikit-learn

2. 決定木による分類の実装

# 必要なライブラリのインポート

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

# アイリスデータセットのロード

iris = load_iris()

X = iris.data

y = iris.target

# データを学習用とテスト用に分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 決定木モデルの作成

clf = DecisionTreeClassifier()

# モデルの学習

clf.fit(X_train, y_train)

# 予測

y_pred = clf.predict(X_test)

# 精度の評価

accuracy = accuracy_score(y_test, y_pred)

print(f'Accuracy: {accuracy:.2f}')

3. 結果の解釈

上記のコードでは、DecisionTreeClassifierを使用して決定木による分類を行いました。アイリスデータセットの特徴量(花びらやガク片の長さと幅)を使い、3種類の花(setosa, versicolor, virginica)に分類しています。

accuracy_scoreによって、モデルの分類精度が評価されます。

3.2. 決定木による回帰

次に、ボストン住宅価格データセットを使って、家の価格を予測する回帰の例を紹介します。

1. 決定木による回帰の実装

# 必要なライブラリのインポート

from sklearn.datasets import fetch_california_housing

from sklearn.tree import DecisionTreeRegressor

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

# ボストン住宅価格データセットのロード

data = fetch_california_housing()

X = data.data

y = data.target

# データを学習用とテスト用に分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 決定木回帰モデルの作成

regressor = DecisionTreeRegressor()

# モデルの学習

regressor.fit(X_train, y_train)

 # 予測

y_pred = regressor.predict(X_test)

# 平均二乗誤差の計算

mse = mean_squared_error(y_test, y_pred)

print(f'Mean Squared Error: {mse:.2f}')

2. 結果の解釈

このコードでは、DecisionTreeRegressorを使用して回帰モデルを作成しています。fetch_california_housingデータセットには、カリフォルニアの住宅の様々な特徴(部屋数、地域の人口など)が含まれています。

mean_squared_errorによって、モデルの予測と実際の住宅価格との差(誤差)を評価しています。値が小さいほど、モデルの性能が良いと評価できます。

4. 決定木のハイパーパラメータ調整

決定木にはいくつかのハイパーパラメータがあり、これらを調整することでモデルの性能を向上させることができます。

4.1. 代表的なハイパーパラメータ

max_depth: 木の最大深さ。これを設定することで、過学習を防ぐことができます。

min_samples_split: ノードを分割するために必要なサンプルの最小数。

min_samples_leaf: 葉ノードに必要なサンプルの最小数。

4.2. ハイパーパラメータ調整の例

# 決定木モデルの作成(最大深さを設定)

clf = DecisionTreeClassifier(max_depth=3)

 # モデルの学習と予測は前述と同様

4.3. グリッドサーチを使用したハイパーパラメータの最適化

GridSearchCVを使って、最適なハイパーパラメータを自動的に探索することができます。

from sklearn.model_selection import GridSearchCV

 # ハイパーパラメータの候補

param_grid = {

    'max_depth': [3, 5, 10],

    'min_samples_split': [2, 10, 20]

}

 

# グリッドサーチの設定

grid_search = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=5)

 

# グリッドサーチの実行

grid_search.fit(X_train, y_train)

 

# 最適なハイパーパラメータ

print(f'Best Parameters: {grid_search.best_params_}')

5. 決定木の利点と欠点

利点

解釈性: 決定木はその構造が可視化できるため、どの特徴が予測に重要かが分かりやすいです。

データ前処理が少ない: 数値データでもカテゴリデータでもそのまま使用できるため、データ前処理が最小限で済みます。

非線形問題に強い: 線形でない複雑なデータにも対応できます。

欠点

過学習のリスク: 木が深くなりすぎると、トレーニングデータに過剰にフィットし、テストデータでの性能が低下することがあります。

ノイズに敏感: データにノイズが含まれる場合、そのノイズに過度に反応してしまう可能性があります。

6. まとめ

決定木は、回帰と分類の両方に利用できる強力なモデルです。分類問題ではカテゴリーラベルの予測に、回帰問題では連続値の予測に使われます。Pythonscikit-learnライブラリを使うことで、決定木モデルを簡単に実装できます

koneka1208

koneka1208

自己紹介

自分の写真
エクセル好きの窓際会社員です。 エクセルの操作法や日々の会社で得た知見などを発信していきます。 よろしくお願いします。

ブログ アーカイブ

連絡フォーム

名前

メール *

メッセージ *

QooQ