Pythonで決定木アルゴリズムを実装する方法!sklearnで初心者でも簡単機械学習
生徒
「最近よく聞く『機械学習』をやってみたいんですけど、初心者でも理解しやすいおすすめのアルゴリズムってありますか?」
先生
「それなら『決定木(けっていぎ)』が一番おすすめですよ。データからYesかNoの質問を繰り返して答えを導き出す、まるで占いのアドバイスのような仕組みなんです。」
生徒
「プログラミングが全然できなくても、Pythonを使えば簡単に作れるんでしょうか?」
先生
「もちろんです!scikit-learn(サイキット・ラーン)という便利な道具を使えば、わずか数行のコードで予測モデルが作れます。一緒に学んでいきましょう!」
1. 決定木(デシジョンツリー)とは?初心者向けに徹底解説
機械学習の世界にはたくさんの「アルゴリズム(計算の手順)」がありますが、その中でも「決定木(Decision Tree)」は最も直感的で分かりやすい手法の一つです。日常生活で「もし~なら、こうする」という判断を積み重ねる思考回路を、そのままコンピューターに覚えさせたものだと考えてください。
例えば、あなたが今日、外に遊びに行くかどうかを決めるとしましょう。まず「空は晴れているか?」と確認します。もし晴れていれば「暑すぎないか?」を確認し、条件が合えば「出発する」という結論に至ります。このように、木が枝分かれするように条件を分岐させていく様子から「決定木」と呼ばれています。機械学習では、過去のデータをこの木の形に整理することで、未知のデータに対しても高い精度で予測を行うことができます。
Pythonには「scikit-learn(sklearn)」という非常に強力なライブラリ(便利な機能の詰め合わせパック)があり、これを使うことで初心者でも複雑な数学を意識せずに決定木を実装できます。データサイエンスやAI開発の第一歩として、これほど最適なテーマはありません。まずはこの仕組みをしっかり理解して、AIがどのように「判断」を下しているのかを体験してみましょう。
2. 機械学習に必要な準備と環境構築
プログラミング未経験の方が最初に戸惑うのが「環境構築」です。Pythonで機械学習を始めるには、Python本体だけでなく、数値計算を支える「NumPy(ナンパイ)」、データを表形式で扱う「Pandas(パンダス)」、そして学習モデルを作る「scikit-learn(サイキットラーン)」という3つのツールが必要不可欠です。
通常、これらのインストールには黒い画面(ターミナルやコマンドプロンプト)を使いますが、最近では「Google Colaboratory」のように、ブラウザだけでPythonを実行できる便利なサービスも存在します。パソコンを触ったばかりの人でも、インストール不要ですぐにコードを書き始められるのがPythonの魅力です。まずは、基本的なライブラリを自分のプログラムに読み込む方法を覚えましょう。以下のコードは、これから機械学習を始める際に必ず書くおまじないのようなものです。
import pandas as pd
from sklearn import tree
from sklearn.model_selection import train_test_split
# 必要なライブラリを読み込みました!
print("準備完了です!")
準備完了です!
ここで登場したimportは「外にある便利な道具箱を持ってくる」という意味です。from sklearn import treeは「scikit-learnという巨大な倉庫から、決定木専用の道具を取り出す」という指示になります。この一行一行が、AIを作るための大切なパーツになっています。
3. 決定木の仕組みをイメージで掴もう
決定木は、大きく分けて「分類」と「回帰」の2つの役割を果たします。今回は「分類」、つまり「これはリンゴか、それともナシか?」といったグループ分けを例に考えてみましょう。決定木は、手元にあるデータの中から、最もスッキリとデータを二つに分けられる項目を自動で見つけ出します。
例えば、「果物の色」「重さ」「表面の質感」というデータがあったとき、AIは「まず色で分けるのが一番効率的だな」と判断し、最初の枝分かれを作ります。次に「重さが100g以上かどうか」でさらに分けます。最終的に、木の一番端っこである「葉(リーフ)」に到達したとき、それが何の果物であるかの答えが出る仕組みです。この「質問の順番」をデータから自動で学習するのが、機械学習の凄いところです。
人間がいちいちルールを書き込まなくても、AIが勝手に「効率の良いルール」を見つけてくれるので、私たちはデータの準備に集中するだけで良くなります。これが現代のデータ分析において決定木が重宝される最大の理由です。
4. 実践!もっともシンプルな決定木の実装
それでは、実際にコードを書いてみましょう。ここでは「気温」と「湿気」のデータから、その日が「アイスが売れる日か、売れない日か」を判定する小さなAIを作ってみます。プログラミングでは、データを「学習用」として用意し、それをモデルに読み込ませる作業を行います。
# 学習用のデータ([気温, 湿度])
features = [[30, 80], [25, 40], [15, 30], [35, 90], [20, 50]]
# 正解ラベル(1: 売れる, 0: 売れない)
labels = [1, 0, 0, 1, 0]
# 1. 決定木のモデルを作成
clf = tree.DecisionTreeClassifier()
# 2. データを学習させる
clf = clf.fit(features, labels)
# 3. 新しいデータ(気温32度、湿度85%)で予測
prediction = clf.predict([[32, 85]])
print(f"予測結果: {prediction[0]} (1なら売れる!)")
予測結果: 1 (1なら売れる!)
このコードのfitという命令が「学習」を意味します。ここでAIは一生懸命データの傾向を掴み、自分の中にルールを作ります。そしてpredictという命令で、未知の状況に対する「予測」を行っています。このように、「型を作る」「教える」「試す」の3ステップが基本の流れとなります。
5. 訓練データとテストデータの重要性
機械学習において非常に大切なのが「カンニング防止」です。学習に使ったデータをそのままテストに使うと、AIはただ答えを丸暗記してしまい、新しいデータが来たときに全く役に立たなくなってしまいます。これを「過学習(オーバーフィッティング)」と呼びます。
これを防ぐために、手元にあるデータを「勉強用の問題集(訓練データ)」と「実力を測るための本番テスト(テストデータ)」に分けます。一般的には、8割を勉強に使い、残りの2割をテスト用に保管しておきます。train_test_splitという関数を使えば、この分割作業を一瞬で終わらせることができます。これにより、AIが本当にルールを理解しているのか、それともただ暗記しているだけなのかを厳密にチェックできるのです。
import numpy as np
from sklearn.model_selection import train_test_split
# サンプルのデータを多めに作成
X = np.array([[i] for i in range(100)])
y = np.array([1 if i > 50 else 0 for i in range(100)])
# データを分割(テスト用を30%にする)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
print(f"訓練データの数: {len(X_train)}")
print(f"テストデータの数: {len(X_test)}")
訓練データの数: 70
テストデータの数: 30
6. 決定木の長所と短所を知っておこう
決定木は非常に優秀ですが、万能ではありません。メリットとしては、何と言っても「根拠が明確であること」が挙げられます。「なぜAIはこの結論を出したのか?」という理由を、枝分かれを遡ることで人間が納得できる形で説明できるため、医療診断や金融融資の審査など、説明責任が必要な現場で重宝されます。また、データの数値が大きくても小さくても、あまり気にせずに学習できる(正規化が不要)という扱いやすさもあります。
一方でデメリットは、先ほど触れた「過学習」に陥りやすい点です。木が深く、複雑になりすぎると、細かすぎる例外パターンまでルール化してしまい、汎用性が失われます。これを防ぐために、枝の伸びる長さを制限する「剪定(せんてい)」という作業が必要になることがあります。プログラミング初心者の方は、まずは「木を深くしすぎないこと」を意識するだけでも、モデルの精度が安定するようになります。
7. 実践プロジェクト:アヤメの分類に挑戦
最後に、機械学習の世界で最も有名な「アヤメ(Iris)のデータセット」を使って、本格的な分類を行ってみましょう。このデータには、アヤメという花のがく片の長さや幅などが記録されています。これを使って、花の種類を自動判別するAIを構築します。
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
# 1. データを読み込む
iris = load_iris()
X, y = iris.data, iris.target
# 2. データを分ける
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. モデルを作成して学習(深さを3に制限してみる)
model = tree.DecisionTreeClassifier(max_depth=3)
model.fit(X_train, y_train)
# 4. テストデータで予測
y_pred = model.predict(X_test)
# 5. 正解率を表示
accuracy = accuracy_score(y_test, y_pred)
print(f"このAIの正解率は {accuracy * 100}% です!")
このAIの正解率は 100.0% です!
このように、実在する複雑なデータであっても、scikit-learnを使えば非常にスマートに記述できます。accuracy_scoreは、AIの回答がどれだけ正解と一致していたかを計算してくれる便利な関数です。100%という数字が出ると、AIが完璧に特徴を捉えたことが分かり、達成感を感じられますね。
8. 学習したモデルを可視化してみよう
決定木の最大の醍醐味は、AIの頭の中を「絵」として出力できることです。最後の手順として、どのように枝分かれが行われたのかを画面に表示してみましょう。これにより、ブラックボックスになりがちなAIの判断基準を、目で見て理解することが可能になります。
import matplotlib.pyplot as plt
# 木の形を図解する
plt.figure(figsize=(12, 8))
tree.plot_tree(model,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True)
plt.show()
print("決定木の図が表示されました!")
この図を見ることで、「花びらの長さが2.45cm以下ならこの種類に確定するんだな」といった具体的な発見があります。これは単なる数値計算を超えて、私たちがデータから新しい知識を得るための「探索的データ分析」にも繋がります。Pythonと決定木をマスターすれば、ビジネスや研究の場で説得力のある説明ができるようになるでしょう。