ななぶろ

-お役立ち情報を気楽に紹介するブログ-

初心者から中級者の機械学習プログラム例:Scikit-learnの活用 - 詳細解説版

www.amazon.co.jp

初心者から中級者の機械学習プログラム例:Scikit-learn を活用する

機械学習は、データからパターンを学習し、予測や意思決定を行うための強力なツールです。近年、その重要性はますます高まっており、様々な分野で応用されています。しかし、「機械学習」という言葉を聞いても、具体的なイメージが湧かない方も多いのではないでしょうか?

本記事では、PythonのライブラリであるScikit-learn(sklearn)を活用し、初心者から中級者レベルの読者を対象に、具体的な機械学習プログラム例を紹介します。Scikit-learnは、様々な機械学習アルゴリズムを簡単に利用できるため、機械学習の入門として最適です。

1. 機械学習とは?

まず、機械学習とは何かについて簡単に説明します。従来のプログラミングでは、人間が明確なルールを記述することでコンピュータに処理を行わせます。例えば、「もし雨が降れば傘を持っていく」というルールをプログラムに書けば、雨が降ったときに自動的に傘を持っていくように指示できます。一方、機械学習は、大量のデータを与え、そのデータからコンピュータ自身がルール(モデル)を学習します。この学習したモデルを用いて、未知のデータに対する予測や分類を行います。

例えば、過去の顧客データから、ある顧客が商品を購入するかどうかを予測する、あるいは、画像データから猫と犬を区別するなどが機械学習の応用例です。これらの例では、人間が明示的にルールを書く代わりに、コンピュータ自身がデータから最適なルールを見つけ出すのです。

機械学習の種類:

機械学習は大きく以下の3種類に分類されます。

  • 教師あり学習 (Supervised Learning): 正解ラベル付きのデータを用いてモデルを学習させます。例えば、過去の住宅価格データ(広さ、部屋数、価格)を使って、新しい住宅の価格を予測するようなケースです。
  • 教師なし学習 (Unsupervised Learning): 正解ラベルのないデータを用いて、データの構造やパターンを発見します。例えば、顧客データをクラスタリングして、似たような購買行動をするグループに分類するようなケースです。
  • 強化学習 (Reinforcement Learning): エージェントが環境と相互作用しながら、報酬を最大化するように学習します。例えば、ゲームAIがプレイを通して最適な戦略を学習するようなケースです。

2. Scikit-learn とは?

Scikit-learn は、Python で書かれたオープンソースの機械学習ライブラリです。様々な機械学習アルゴリズム(分類、回帰、クラスタリングなど)や、データの前処理、モデルの評価などの機能が揃っており、使いやすさが特徴です。特に、NumPy や Pandas などの Python ライブラリとの連携が容易であり、データ分析と機械学習をシームレスに組み合わせることができます。

Scikit-learn の主な特徴:

  • 豊富なアルゴリズム: 線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、SVM (サポートベクターマシン)、k-means クラスタリングなど、様々な機械学習アルゴリズムを簡単に利用できます。それぞれのアルゴリズムには、異なる特性があり、データの種類や問題の種類に応じて適切なものを選択する必要があります。
  • データ前処理機能: 欠損値の処理(SimpleImputer)、特徴量スケーリング(StandardScaler, MinMaxScaler)、次元削減(PCA)など、モデルの性能向上に不可欠なデータ前処理機能を備えています。これらの機能は、データの品質を向上させ、アルゴリズムがより効果的に学習できるようにするために重要です。
  • モデル評価機能: モデルの精度や汎化性能を評価するための様々な指標(正解率、適合率、再現率、F1スコア、RMSE (Root Mean Squared Error) など)を提供します。これらの指標を用いることで、モデルの性能を客観的に評価し、改善点を見つけることができます。
  • 使いやすさ: シンプルで直感的なAPI設計により、初心者でも比較的簡単に機械学習プログラムを作成できます。Scikit-learn は、Python の他のライブラリとの連携も容易であり、データ分析の流れの中で自然に機械学習を取り入れることができます。

Scikit-learn を使う上での前提知識:

Scikit-learn を効果的に活用するためには、以下の知識があると役立ちます。

  • Python プログラミングの基礎: 変数、関数、ループなどの基本的な構文を理解している必要があります。
  • NumPy の基礎: NumPy は、数値計算のためのライブラリであり、Scikit-learn で使用されるデータの表現や操作に不可欠です。配列 (ndarray) の作成、演算、インデックス参照などを理解しておきましょう。
  • Pandas の基礎: Pandas は、データ分析のためのライブラリであり、Scikit-learn で使用されるデータの読み込み、加工、整理に役立ちます。DataFrame の作成、操作、データ選択などを理解しておきましょう。

3. 機械学習プログラム例:住宅価格の予測(回帰)

ここでは、住宅の広さや部屋数などから住宅価格を予測する回帰問題を解くプログラム例を紹介します。回帰問題とは、入力変数と出力変数の関係性をモデル化し、未知の入力変数に対する出力変数を予測する問題です。

ステップ1: 必要なライブラリのインストールとインポート

まず、Scikit-learn を含む必要なライブラリをインストールし、Python スクリプトにインポートします。

pip install scikit-learn pandas numpy matplotlib seaborn
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns # ヒートマップを描画するために必要

ステップ2: データの準備

ここでは、住宅価格のデータセットを Pandas DataFrame として読み込みます。今回は、簡略化のため、以下の様なサンプルデータを使用します。より現実的なデータセットを使うことも可能です。例えば、Kaggle の "House Prices - Advanced Regression Techniques" コンペティションのデータセットなどが利用できます。

data = {'広さ': [100, 150, 200, 250, 300, 120, 180, 220, 270, 320],
        '部屋数': [2, 3, 4, 5, 6, 2, 3, 4, 5, 6],
        '価格': [2000, 3000, 4000, 5000, 6000, 2500, 3500, 4500, 5500, 6500]}

df = pd.DataFrame(data)

ステップ3: データの前処理

機械学習アルゴリズムは、数値データに対してのみ動作します。そのため、必要に応じてデータの変換やスケーリングを行います。今回は、特に必要な前処理はありませんが、特徴量スケーリングを行うことで、モデルの性能を向上させることができます。例えば、StandardScaler を使用して、各特徴量の平均値を0、標準偏差を1にすることができます。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X = df[['広さ', '部屋数']]  # 特徴量
y = df['価格']  # 目的変数

X_scaled = scaler.fit_transform(X) # 特徴量のスケーリング

ステップ4: データの分割

データを訓練用とテスト用に分割します。訓練用データでモデルを学習させ、テスト用データでモデルの性能を評価します。

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) # 訓練データとテストデータの分割

train_test_split 関数は、データをランダムに訓練用とテスト用に分割します。test_size 引数でテストデータの割合を指定し、random_state 引数で乱数のシード値を指定することで、再現性を確保できます。

ステップ5: モデルの学習

線形回帰モデルを訓練データを用いて学習させます。

model = LinearRegression()  # 線形回帰モデルの作成
model.fit(X_train, y_train)  # 訓練データでモデルを学習させる

LinearRegression() は、線形回帰モデルを作成するコンストラクタです。fit() メソッドは、訓練データを用いてモデルを学習させます。

ステップ6: モデルの評価

テストデータを用いてモデルの性能を評価します。ここでは、平均二乗誤差 (Mean Squared Error, MSE) と決定係数 (R-squared) を使用します。

y_pred = model.predict(X_test)  # テストデータに対する予測値の算出

mse = mean_squared_error(y_test, y_pred)  # 平均二乗誤差の計算
r2 = r2_score(y_test, y_pred)  # 決定係数の計算

print('平均二乗誤差 (MSE):', mse)
print('決定係数 (R-squared):', r2)

predict() メソッドは、テストデータに対する予測値を算出します。mean_squared_error() 関数と r2_score() 関数は、それぞれ平均二乗誤差と決定係数を計算します。

ステップ7: 結果の可視化

予測結果を可視化することで、モデルの性能をより直感的に理解できます。

plt.scatter(X_test[:, 0], y_test, label='Actual')  # 実際の値をプロット (スケーリングされた広さ)
plt.plot(X_test[:, 0], y_pred, color='red', label='Predicted')  # 予測値をプロット (スケーリングされた広さ)
plt.xlabel('広さ (Scaled)')
plt.ylabel('価格')
plt.title('住宅価格の予測結果')
plt.legend()
plt.show()

# 特徴量の重要度を可視化
coefficients = model.coef_
feature_names = ['広さ', '部屋数']

plt.bar(feature_names, coefficients)
plt.xlabel('特徴量')
plt.ylabel('係数')
plt.title('特徴量の重要度')
plt.show()

このコードは、実際の住宅価格と予測された住宅価格を散布図にプロットし、線形回帰モデルの予測ラインを表示します。また、特徴量の重要度を棒グラフで可視化します。

4. 機械学習プログラム例:手書き数字の認識(分類)

ここでは、MNIST データセットを用いて手書き数字を認識する分類問題を解くプログラム例を紹介します。

ステップ1: 必要なライブラリのインストールとインポート

pip install scikit-learn pandas numpy matplotlib
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC  # サポートベクターマシン (SVM)
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
from sklearn import datasets # MNISTデータセットを読み込むために必要

ステップ2: データの準備

MNIST データセットは、Scikit-learn に組み込まれています。

digits = datasets.load_digits()  # MNISTデータセットの読み込み
X = digits.data  # 特徴量 (手書き数字の画像)
y = digits.target  # 目的変数 (対応する数字)

ステップ3: データの前処理

MNIST データセットは、すでに数値データとして提供されています。特徴量のスケーリングも行われています。

ステップ4: データの分割

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 訓練データとテストデータの分割

ステップ5: モデルの学習

サポートベクターマシン (SVM) モデルを訓練データを用いて学習させます。

model = SVC(kernel='linear', C=1.0)  # SVMモデルの作成
model.fit(X_train, y_train)  # 訓練データでモデルを学習させる

SVC() は、SVM モデルを作成するコンストラクタです。kernel 引数でカーネル関数を指定し、C 引数で正則化パラメータを指定します。他のカーネル関数('rbf', 'poly', 'sigmoid' など)も試すことができます。

ステップ6: モデルの評価

テストデータを用いてモデルの性能を評価します。ここでは、正解率 (Accuracy) と混同行列 (Confusion Matrix) を使用します。

y_pred = model.predict(X_test)  # テストデータに対する予測値の算出

accuracy = accuracy_score(y_test, y_pred)  # 正解率の計算
confusion = confusion_matrix(y_test, y_pred)  # 混同行列の作成

print('正解率 (Accuracy):', accuracy)
print('混当行列:')
print(confusion)

accuracy_score() 関数は、正解率を計算します。confusion_matrix() 関数は、混同行列を作成します。混同行列は、各クラスの予測がどれだけ正確であったかを示す表です。

ステップ7: 結果の可視化

混同行列をヒートマップとして可視化することで、モデルの性能をより詳細に分析できます。また、誤分類された画像をいくつか表示することも有効です。

import seaborn as sns # ヒートマップを描画するために必要

plt.figure(figsize=(8, 6))
sns.heatmap(confusion, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('混同行列 (Heatmap)')
plt.show()

# 誤分類された画像の表示例
misclassified_indices = np.where(y_test != y_pred)[0]
num_to_display = min(10, len(misclassified_indices)) # 最大10個を表示

for i in range(num_to_display):
    index = misclassified_indices[i]
    image = digits.images[index]
    predicted_label = model.predict([digits.data[index]])[0]
    true_label = y_test[index]

    plt.figure(figsize=(4, 2))
    plt.imshow(image, cmap='gray')
    plt.title(f"True: {true_label}, Predicted: {predicted_label}")
    plt.show()

このコードは、混同行列をヒートマップとして可視化し、さらに誤分類された画像をいくつか表示します。これにより、モデルがどのような数字を間違えやすいかを把握できます。

6. 機械学習のワークフローとScikit-learnにおける役割

機械学習プロジェクトを進める上での一般的なワークフローは以下の通りです。

  1. 問題定義: 解決したい問題を明確に定義します。
  2. データ収集: 問題を解決するために必要なデータを収集します。
  3. データ前処理: 欠損値の処理、特徴量スケーリング、次元削減などを行い、データをモデルが学習しやすい形にします。Scikit-learnは、sklearn.preprocessingモジュールで様々な前処理機能を提供しています。
  4. 特徴量エンジニアリング: モデルの性能を向上させるために、既存の特徴量を組み合わせて新しい特徴量を作成します。
  5. モデル選択: 問題の種類(回帰、分類、クラスタリングなど)に応じて適切な機械学習アルゴリズムを選択します。Scikit-learnは、様々なアルゴリズムをsklearn.linear_model, sklearn.svm, sklearn.tree, sklearn.ensembleなどのモジュールで提供しています。
  6. モデル学習: 訓練データを用いてモデルを学習させます。
  7. モデル評価: テストデータを用いてモデルの性能を評価します。Scikit-learnは、sklearn.metricsモジュールで様々な評価指標を提供しています。
  8. ハイパーパラメータチューニング: モデルの性能を向上させるために、ハイパーパラメータを調整します。Scikit-learnは、sklearn.model_selectionモジュールでGrid SearchやRandom Searchなどの手法を提供しています。
  9. モデルデプロイメント: 学習済みモデルを実環境にデプロイし、予測を行います。

7. Scikit-learn の応用例

Scikit-learn は、様々な分野で応用されています。以下はその一例です。

  • 金融: クレジットカードの不正検知、株価予測
  • 医療: 病気の診断、患者のリスク評価
  • マーケティング: 顧客セグメンテーション、広告配信最適化
  • 自然言語処理: テキスト分類、感情分析
  • 画像認識: 画像分類、物体検出

8. 機械学習の注意点と倫理的課題

機械学習は強力なツールですが、以下の点に注意する必要があります。

  • 過学習: モデルが訓練データに過剰に適合し、未知のデータに対する汎化性能が低下する現象です。正則化や交差検証などの手法で対策します。
  • バイアス: 訓練データに偏りがある場合、モデルも偏った予測を行う可能性があります。データの収集方法や特徴量選択に注意が必要です。
  • 説明可能性: モデルの予測根拠が不明瞭な場合、その結果を信頼することができません。説明可能な機械学習 (Explainable AI, XAI) の手法を用いて、モデルの透明性を高める必要があります。
  • 倫理的課題: 機械学習の利用は、プライバシー侵害や差別などの倫理的な問題を引き起こす可能性があります。公平性、透明性、責任あるAIの開発が重要です。

9. まとめと今後の学習

本記事では、Scikit-learn を活用した機械学習プログラム例を紹介し、機械学習の基本的な流れや Scikit-learn の使い方を解説しました。また、機械学習のワークフロー、応用例、注意点についても触れました。

機械学習は、データから価値を引き出し、より良い意思決定を行うための強力なツールです。Scikit-learn は、その学習と実践に役立つ優れたライブラリです。本記事が、読者の機械学習学習の一助となれば幸いです。

今後の学習:

  • 深層学習 (Deep Learning): より複雑な問題を解決するために、深層学習を学ぶことを検討しましょう。TensorFlow や PyTorch などのフレームワークを使用します。
  • 自然言語処理 (Natural Language Processing, NLP): テキストデータを扱うために、NLP を学びましょう。NLTK や spaCy などのライブラリを使用します。
  • 強化学習 (Reinforcement Learning): エージェントが環境との相互作用を通じて学習する強化学習を学びましょう。OpenAI Gym などのツールを使用します。
  • 機械学習の最新動向: 機械学習は常に進化しています。最新の研究論文や技術ブログなどをチェックし、常に新しい知識を吸収しましょう。

このブログ記事が、機械学習の学習に役立つことを願っています。