Pythonと決定木 – 初心者でも簡単に理解できる10のステップ

Pythonと決定木を用いたデータ分析のイラストPython

 

【当サイトはコードのコピペ・商用利用OKです】

このサービスはASPや、個別のマーチャント(企業)による協力の下、運営されています。

記事内のコードは基本的に動きますが、稀に動かないことや、読者のミスで動かない時がありますので、お問い合わせいただければ個別に対応いたします。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10000時間以上』を満たすプログラマ集団によって監修されています。

はじめに

この記事では、初心者でもPythonで決定木を実装できるようになる具体的なステップとサンプルコードを通じて、決定木の作り方から応用例までを理解することができます。

この情報はPython、決定木、データ分析、機械学習、データサイエンス、プログラミング、コーディングに興味がある方々に向けたものです。

●Pythonとは

Pythonは、コードが読みやすく、明確で、使いやすいことを重視したプログラミング言語です。

Pythonはその名が示す通り、一部の高度な機能を提供する一方で、初心者が使い始めるのに最適なプログラミング言語とされています。

○Pythonの基本

Pythonはインデントによってコードブロックを定義するという独特な構文を持つ言語で、これによってコードは視覚的に理解しやすくなっています。

また、Pythonは「バッテリー同梱」哲学を掲げ、標準ライブラリが充実しているため、多くのタスクをPythonだけで実現できます。

○Pythonの特徴

Pythonの特徴としては、読みやすさ、学習のしやすさがあります。

また、Pythonはデータサイエンスや機械学習分野で非常に人気があり、NumPyやPandas、scikit-learnなどの強力なライブラリが提供されています。

●決定木とは

決定木は、データを分類または回帰するための機械学習のアルゴリズムの一つです。

○決定木の基本

決定木は、木構造のグラフを作成し、各ノードで特徴量に基づいてデータを分割します。

このプロセスをデータが十分に分割されるか、指定した停止条件が満たされるまで再帰的に繰り返します。

○決定木の利点と欠点

決定木の主な利点は、可視化が容易で解釈しやすいこと、前処理が少なくて済むこと、カテゴリー変数と連続変数を混在させることができることなどが挙げられます。

一方、欠点としては、決定木が作成するモデルが複雑になりすぎると過学習しやすいという点があります。

●Pythonで決定木を扱うための準備

Pythonで決定木を扱うためには、まずPython環境を整える必要があります。

また、必要なライブラリもインストールしておく必要があります。

○Python環境の準備

Pythonの開発環境としては、Jupyter NotebookやGoogle Colabなどがあります。

Jupyter Notebookはローカル環境で利用できる一方、Google Colabはブラウザ上で利用できるのが特徴です。

○ライブラリのインストール

Pythonで決定木を扱うには、scikit-learnというライブラリが必要です。

scikit-learnはPythonの機械学習ライブラリで、多くのアルゴリズムが実装されています。

下記のコマンドでscikit-learnをインストールできます。

!pip install scikit-learn

このコードでは、Pythonのパッケージ管理ツールであるpipを使ってscikit-learnをインストールするコードを紹介しています。

この例では、”!”を先頭につけることでシェルコマンドを実行し、”pip install scikit-learn”というコマンドを使ってscikit-learnをインストールしています。

このコードを実行すると、scikit-learnがPython環境にインストールされ、決定木などの機械学習アルゴリズムを利用することが可能になります。

●Pythonによる決定木の実装手順

Pythonと決定木を組み合わせることで、データ分析や機械学習において高度な予測モデルを構築することができます。

ここでは、Pythonを用いて決定木の実装を行う具体的な手順について解説します。

○サンプルデータの準備

Pythonで決定木を作成するためには、まず適切なサンプルデータの準備が必要です。

Pythonの機械学習ライブラリであるscikit-learnでは、Iris(アイリス)データセットを無料で利用することができます。

アイリスデータセットは花の種類(クラス)を予測するための特徴量(花弁やがくの長さと幅)を持つデータセットです。

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target

このコードでは、まずsklearnライブラリからdatasetsをインポートしています。

次に、load_iris()関数を使ってアイリスデータセットをロードし、特徴量データをX、ターゲットデータ(予測するクラス)をyに代入しています。

○データの前処理

データを学習用とテスト用に分割します。

学習用データでモデルを訓練し、そのモデルが未知のデータに対してどれほどの性能を発揮するかをテストデータで評価します。

from sklearn.model_selection import train_test_split

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

このコードでは、train_test_split関数を使ってデータを学習用とテスト用に分割しています。

test_size=0.2とすることで、全体の20%をテストデータに、残りの80%を学習データに割り当てています。

random_stateパラメータは分割の再現性を保証するためのもので、任意の数値を設定できます。

○決定木モデルの作成

次に、決定木モデルのインスタンスを作成します。

ここではscikit-learnのDecisionTreeClassifierクラスを使用します。

from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(random_state=42)

このコードでは、DecisionTreeClassifierクラスのインスタンスを作成し、変数modelに代入しています。

引数にrandom_stateを設定することで、モデルの再現性を保証しています。

○モデルの学習

作成した決定木モデルに対して、fitメソッドを用いて学習データをフィットさせます。

これにより、データから決定木のルールを学習します。

model.fit(X_train, y_train)

このコードでは、fitメソッドを用いて学習データ(X_train, y_train)をモデルにフィットさせ、決定木のルールを学習しています。

○モデルの評価

学習が完了したら、テストデータを使ってモデルの性能を評価します。

ここでは、scoreメソッドを用いて、モデルの正解率(Accuracy)を計算します。

accuracy = model.score(X_test, y_test)
print(f'Accuracy: {accuracy}')

このコードでは、scoreメソッドを使ってモデルの正解率を計算し、その結果を表示しています。

正解率は0から1の値を取り、1に近いほどモデルの予測精度が高いことを示します。

●Pythonによる決定木の具体的なコード例

さて、決定木の理論的な知識が身についたところで、Pythonでの具体的な実装に移りましょう。

今回は、次の2つのコード例を通じて、決定木のモデル作成、学習、評価、そして可視化について解説します。

○サンプルコード1:決定木モデルの作成と学習

このコードではPythonの機械学習ライブラリである「scikit-learn」を使って決定木のモデルを作成し、学習させる方法を紹介しています。

下記の例では、「DecisionTreeClassifier」クラスを用いて、決定木モデルのインスタンスを生成しています。

そして、それを「fit」メソッドにより学習させています。

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# データを学習用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 決定木モデルの作成と学習
tree_model = DecisionTreeClassifier(random_state=42)
tree_model.fit(X_train, y_train)

このコードではまず、データセットを学習用データとテスト用データに分割しています。

その比率は7:3で、分割の際の乱数シードを42に設定しています。

このことで、再現性を確保しています。

次に、「DecisionTreeClassifier」をインスタンス化し、その後、「fit」メソッドを使って学習データを元にモデルを学習させています。

○サンプルコード2:モデルの評価と可視化

次に、決定木モデルの評価と、学習結果の可視化方法を解説します。

まず、作成したモデルの評価を行い、次に学習させた決定木を可視化します。

可視化には「plot_tree」関数を使用しています。

from sklearn.metrics import accuracy_score
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

# モデルの評価
y_pred = tree_model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

# 決定木の可視化
plt.figure(figsize=(12, 8))
plot_tree(tree_model, filled=True, feature_names=feature_names, class_names=class_names)
plt.show()

このコードでは、まず「predict」メソッドを使ってテストデータを元に予測を行います。

そして、予測結果と実際のラベルとの一致率(Accuracy)を計算して評価します。

「accuracy_score」関数は、予測結果と実際のラベルがどれだけ一致しているかを表す指標で、1に近いほど良いモデルと言えます。

●決定木の応用例

ここまでの内容で、決定木の基本的な利用方法については理解できたことでしょう。

しかし、決定木の真価は、その単純な構造からくる解釈性と柔軟性にあります。

それでは次に、その強みを活かした応用例をいくつか見ていきましょう。

○サンプルコード3:特徴量の重要度の確認

このコードでは、決定木モデルがどの特徴量を重視して分類を行ったのか、その度合いを調べる方法を紹介します。

決定木のモデルは、特徴量の重要度(feature importance)を計算できる機能があります。

これを利用して特徴量ごとの重要度を確認し、それを棒グラフで可視化します。

import pandas as pd
import numpy as np

# 特徴量の重要度を取得
importances = tree_model.feature_importances_

# 特徴量の名前と重要度をDataFrameにまとめる
importances_df = pd.DataFrame({'feature': feature_names, 'importance': importances})

# 重要度の順にソートしてプロット
importances_df = importances_df.sort_values('importance', ascending=False)
importances_df.plot.bar(x='feature', y='importance')
plt.title("Feature importances")
plt.show()

このコードを実行すると、各特徴量の重要度を可視化した棒グラフが表示されます。

これにより、どの特徴量がモデルにとって重要であったのか、また、それぞれがどれくらいの割合で影響を与えたのかが一目でわかります。

これにより、モデルがどのような基準で予測を行ったのか、さらなる洞察を得ることが可能となります。

○サンプルコード4:ハイパーパラメータの調整

次に、決定木の精度を更に高めるための方法として、ハイパーパラメータの調整を行う方法を紹介します。

ハイパーパラメータは、学習前に設定するパラメータで、これを変更することによって、モデルの学習や予測に影響を与えます。

ここでは、「GridSearchCV」を使って、最適なハイパーパラメータを探す例を紹介します。

from sklearn.model_selection import GridSearchCV

# ハイパーパラメータの候補を指定
param_grid = {'max_depth': list(range(1, 11)), 'min_samples_split': list(range(2, 11))}

# グリッドサーチの実行
grid_search = GridSearchCV(DecisionTreeClassifier(random_state=42), param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 最適なパラメータの表示
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")

このコードでは、まず、「max_depth」(木の深さ)と「min_samples_split」(ノードを分割するために必要な最小サンプル数)の候補を指定しています。

その後、「GridSearchCV」を用いて、すべての組み合わせについてクロスバリデーションを行い、最適なパラメータを探しています。

最後に、最適なパラメータとそのときのスコアを表示しています。

これにより、デフォルトのパラメータだけでなく、様々なハイパーパラメータを試し、モデルの精度を最大化することが可能となります。

●Pythonと決定木の注意点と対処法

決定木はその利便性と直感性から、初心者でも扱いやすい機械学習手法の一つと言えます。

しかし、その特性上、いくつか留意すべきポイントが存在します。

○過学習とその対処法

決定木の大きな課題の一つが過学習です。

決定木は学習データに対して深く分岐しすぎると、新しいデータに対してはうまく予測できないという状態に陥る可能性があります。

これは過学習(overfitting)と呼ばれる現象で、モデルが学習データに対しては高い精度を示す一方で、未知のデータに対しては予測精度が落ちるという問題を引き起こします。

過学習を防ぐ方法の一つに、先程の「ハイパーパラメータの調整」があります。

特に「max_depth」を設定することで、木の深さを制限し、モデルの複雑さを抑えることができます。

これにより、過学習を防ぎ、未知のデータに対する予測性能を向上させることが可能です。

○特徴量選択の重要性

また、決定木では、どの特徴量を使用するかがモデルの性能に大きな影響を与えます。

すべての特徴量を用いても良いですが、関連性の低い特徴量やノイズとなる特徴量が含まれていると、モデルの予測性能を下げる原因となり得ます。

そのため、重要な特徴量を選択することが重要となります。

特徴量選択には、「特徴量の重要度」を利用する方法があり、この方法で不要な特従量を削減し、モデルの性能を最適化することができます。

●決定木のカスタマイズ方法

決定木のもう一つの魅力は、その可視化のしやすさと、その結果を自由にカスタマイズできることです。

次のコードでは、決定木の可視化をカスタマイズする例を見てみましょう。

○サンプルコード5:決定木の可視化のカスタマイズ

このコードでは、先程の決定木を可視化する際に、各ノードの色を変更したり、エッジのスタイルを変更したりと、見た目をカスタマイズしています。

import matplotlib.pyplot as plt
from sklearn import tree

# モデルの学習
tree_model.fit(X_train, y_train)

# 決定木の描画
fig, ax = plt.subplots(figsize=(12, 8))
tree.plot_tree(tree_model, 
               feature_names=feature_names, 
               class_names=class_names,
               filled=True,
               rounded=True,
               fontsize=12)
plt.show()

このコードでは、「filled」を「True」に設定することで、各ノードの色を変更し、「rounded」を「True」に設定することで、各ノードの形状を丸くしています。

このように、可視化の設定を変更することで、より見やすい決定木を描画することができます。

まとめ

決定木はその直感的な解釈性とカスタマイズ性から、初心者にも扱いやすい機械学習の手法と言えます。

今回学んだ知識とコードを活用し、Pythonでの決定木の利用をぜひ楽しんでみてください。

最後までお読みいただき、ありがとうございました。