機械学習モデルの作成 | Scikit-learnの利用 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
~
ad. 価格範囲を指定して商品を探せます

機械学習モデルの作成 - Scikit-learnの利用

Pythonで機械学習(Machine Learning)を実装する際、最も強力で広く使われているライブラリがScikit-learn(サイキット・ラーン)です。

Scikit-learnは、分類(Classification)、回帰(Regression)、クラスタリング(Clustering)といった数多くの代表的な機械学習アルゴリズムを統一されたシンプルな記述方法で利用できるため、初心者から実務のデータサイエンティストまで必須のツールとなっています。本記事では、Scikit-learnを用いた基本的な機械学習モデルの作成プロセスを分かりやすく解説します。

Scikit-learnのインストール

Scikit-learnを使用するには、コマンドライン(ターミナルやコマンドプロンプト)で以下のコマンドを実行してインストールします。

# pipコマンドを使ってライブラリをインストール
pip install scikit-learn

機械学習モデルを作成する4つの基本手順

どのような複雑な機械学習アルゴリズムを使う場合でも、Scikit-learnでの実装プロセスは基本的に以下の4つのステップに沿って進行します。

  1. データセットの準備:予測の手がかりとなる「特徴量($X$)」と、予測の答えとなる「目的変数($y$)」を切り分けます。
  2. データの分割:学習用の「トレーニングデータ」と、モデルの実力を測るための「テストデータ」にデータを分離します。
  3. モデルの選択と学習:アルゴリズムを選んでオブジェクトを作り、fit() メソッドでデータを学習させます。
  4. モデルの評価:未知のデータ(テストデータ)に対して predict() で予測を行い、その正解率などを算出します。

サンプルコード:Iris(アヤメ)データセットでの分類モデル

以下のコードは、花の「がく」や「花弁」のサイズ(特徴量)から、アヤメの品種(目的変数)を予測する分類モデルの構築例です。ここでは高い予測精度を誇る「ランダムフォレスト」というアルゴリズムを使用しています。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 1. データセットの読み込み
iris = load_iris()
X = iris.data    # 特徴量(4つの計測値が入った2次元配列)
y = iris.target  # 目的変数(0, 1, 2 の品種ラベルが入った1次元配列)

# 2. データをトレーニングデータとテストデータに分割
# test_size=0.2 で全体の20%をテスト用に確保。random_stateは乱数のシード(再現性担保)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. モデルの選択と学習
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)  # トレーニングデータを使って学習を実行

# 4. テストデータを用いた予測と評価
y_pred = model.predict(X_test)  # 未知の特徴量を渡して予測値を出す

# 実際の答え(y_test)と予測結果(y_pred)を比較して正解率を算出
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率: {accuracy * 100:.2f}%")

コードの詳細な解説

  1. load_iris():Scikit-learnに最初から内蔵されている練習用の高精度なデータセットです。
  2. train_test_split(...):【超重要】機械学習では、学習に使ったデータそのもので評価を行うと、そのデータだけに過剰に適合してしまう「過学習(過剰適合 / Overfitting)」という状態に陥り、実戦で使えないモデルになってしまいます。これを防ぐために、データを事前に分割しておくことが実務上必須の作法です。
  3. RandomForestClassifier():複数の決定木(Decision Tree)を組み合わせて多数決で予測を行う強力なアルゴリズムです。
  4. model.fit(X_train, y_train):Scikit-learn共通の学習コマンドです。特徴量と答えのパターンをモデルに叩き込みます。
  5. model.predict(X_test):学習を終えたモデルにテストデータの特徴量だけを入力し、予測結果のリストを出力させます。

機械学習モデルの様々な評価方法(混同行列の視点)

解説コードの中では「正解率(Accuracy)」を用いて評価をしましたが、実務のデータ分析では、正解率だけでモデルの良し悪しを判断すると危険な場合があります。

例えば、「1000人に1人が発症する希少な病気の陽性・陰性を判定するモデル」があったとします。この場合、モデルが何も考えずに全員を一律で「陰性(健康)」と予測するだけの欠陥モデルだったとしても、計算上の正解率は 99.9% になってしまいます。これでは病気の陽性患者を見つけるという本来の目的を果たせません。

そのため、評価の目的に応じて以下のような複数の指標(混同行列 / Confusion Matrix から算出される指標)を適切に使い分ける必要があります。

評価指標 数式としての意味 重視すべき具体的なユースケース
Accuracy(正解率) $\frac{\text{正しく予測できた数}}{\text{すべてのデータ数}}$ データ全体の「陽性」と「陰性」の比率に偏りがない、一般的なバランスの良いデータを総合的に評価したいとき。
Precision(適合率) $\frac{\text{本当に陽性だった数}}{\text{モデルが陽性と予測した数}}$ 「見逃し」よりも「誤検知(誤報)」を減らしたいとき。(例:優良顧客へのスパム誤判定を避けたいメールフィルターなど)
Recall(再現率) $\frac{\text{モデルが陽性と予測できた数}}{\text{実際のすべての陽性数}}$ 「誤検知」が多少増えても、絶対に「見逃し」をゼロにしたいとき。(例:がん検診の自動スクリーニングや、工場の重大欠陥品の検出など)
F1スコア $\frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$ 適合率と再現率のトレードオフのバランスを両立させ、総合的な戦闘力を1つの数値で測りたいとき。

異なるアルゴリズム(決定木)への切り替えの容易さ

Scikit-learnの最大の強みは、別のアルゴリズムを試したいときにコードをほとんど書き換える必要がないという一貫性にあります。以下は、モデルをランダムフォレストから「決定木」に変更した例です。

from sklearn.tree import DecisionTreeClassifier

# インポート元とオブジェクト生成部分を入れ替えるだけで、あとの流れは全く同じ
model = DecisionTreeClassifier(random_state=42)

# fit, predict, accuracy_scoreの使い方はすべてのアルゴリズムで完全共通
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print(f"決定木モデルの正解率: {accuracy * 100:.2f}%")

このように、fit() や predict() という共通インターフェースが徹底されているため、ロジックを保ったまま様々なアルゴリズム(サポートベクターマシンやロジスティック回帰など)を次々と切り替えて精度を比較検証することができます。

まとめ

  • fit で学習し、predict で予測する:Scikit-learnのあらゆる機械学習アルゴリズムは、この共通のメソッド名を使って統一された操作で扱えます。
  • データの分割( train_test_split )は必須:カンニングによる過学習を防ぎ、実戦での本当の実力を測定するために、学習用とテスト用のデータを明確に分ける設計が欠かせません。
  • 正解率だけで満足しない:データの偏りに騙されないよう、実務の目的に応じて適合率(Precision)や再現率(Recall)、F1スコアなどの多角的な評価指標を意識しましょう。

Scikit-learnによるこの一連のパイプライン(パイプライン処理の基本形)を理解すれば、実社会の様々な予測問題(売上予測、顧客離脱検知、画像分類のベースラインなど)に即座に応用可能な、標準的な機械学習エンジニアリングの基礎が身につきます。