機械学習の学びのため簡単な決定木を実行してみる。
使うもの
matplotlib(グラフ描画のためのライブラリ)
scikit-learn(データ分析や機械学習のためのライブラリ)
Iris Dataset(アイリスデータセット)
→150件のあやめ(花)のデータ。
中身は以下である。
・「花びら(petal)/がく片(sepal)の長さと幅(cm)」という4つの特徴や属性。
・あやめの種類である「setosa(セトサ)/versicolor(バージカラー)/virginica(バージニカ)」という3つのラベル。
データ処理のざっくりとした流れ
①必要なライブラリのインポート:データ操作、可視化、機械学習などに必要なライブラリをインポート。
②Irisデータセットのロード:Scikit-learnのデータセットからIrisデータセットをロードし、特徴量データ X とターゲットデータ y に分ける。
③データの分割:データをトレーニングセットとテストセットに分割する。トレーニングセットが70%、テストセットが30%。
※訓練データとテストデータが分かれている理由は、まずは訓練データだけで学習を行い、データの特徴を理解する。その後、テストデータを使って、未知のデータに対しても正しく判断できるかをチェックする。
④モデルのトレーニング:トレーニングデータを使用してモデルを訓練する。
⑤テストデータに対する予測:テストデータに対して予測を行う。
⑥正確度の評価:予測結果と実際のラベルを比較してモデルの正確度を算出し、表示する。
⑦決定木の可視化:訓練された決定木モデルを視覚化する。特徴量名とクラス名を表示し、ツリーの各ノードを色付けする。
# 必要なライブラリをインポート
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import plot_tree
# Irisデータセットをロード
iris = datasets.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(random_state=42)
# モデルのトレーニング
clf.fit(X_train, y_train)
# テストデータに対する予測
y_pred = clf.predict(X_test)
# 正確度の評価
accuracy = accuracy_score(y_test, y_pred)
print(f'モデルの正確度: {accuracy * 100:.2f}%')
# 決定木の可視化
plt.figure(figsize=(20, 10))
plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names, rounded=True)
plt.show()
決定木の見え方
条件分岐:条件が満たされている場合は左へ、満たされない場合は右へ分岐。
gini:データが異なるクラスに属する程度を示す指標。(数値を最小化するように分割することで、より精度の高いモデルを構築できる)
samples:データに含まれるサンプルがそのノードに何個行き着いたか。
value:そのノードに行き着いた学習サンプルがどのクラスに属しているか。