📝

SageMaker ノートブックインスタンスで花の分類をやってみた

に公開

Iris データセットで試してみました。

01. ノートブックインスタンスの作成

Amazon SageMaker notebook instances - Amazon SageMaker AI

An Amazon SageMaker notebook instance is a machine learning (ML) compute instance running the Jupyter Notebook application.

  • Jupyter Notebook が動作する仮想マシン
  • 必要な機械学習ライブラリが事前にインストールされている
  • コーディングや分析が可能

Project Jupyter Documentation — Jupyter Documentation 4.1.1 alpha documentation

  • Jupyter Notebook は機械学習でよく使用される対話側の開発環境
  • コードをセルに分けて実行できる
  • グラフなどの視覚化機能もある

ノートブックインスタンスは以下の設定で作成します。

  • ノートブックインスタンス名: 任意の名称
  • ノートブックインスタンスのタイプ: ml.t3.medium
  • プラットフォーム識別子: Amazon Linux2, Jupyter Lab 4
  • IAM ロール: 新しいロールの作成
    • 指定する S3 バケット: 任意の S3 バケット

02. Jupyter Notebook を開く

ノートブックインスタンスのステータスが InService になったら、「Jupyter を開く」をクリックします。

初回はファイルなどが存在しないため以下のような画面が表示されます。

「New」>「conda_python3」を選択します。
conda_python3 には機械学習に必要なライブラリが事前にインストールされています。

以下のような画面が表示されます。

03. コードを実行してみる

簡単なコードで動作確認します。
以下のコードをセルに入力し、Shift + Enter キーを押してみます。

print("Hello, SageMaker!")
print("Python環境が正常に動作しています")

実行結果が表示されれば OK です。

次に、機械学習ライブラリが使用できることを確認します。
以下のコードを入力して実行します。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import boto3

print("すべてのライブラリが正常にインポートされました!")
print("機械学習の準備が整いました。")

インポートのみでライブラリが使用されていない旨の警告は発生しますが、エラーがなければ OK です。

04. 機械学習をやってみる

Iris データセットという花の分類問題で試してみます。
まずは以下のコードでデータセットを読み込みます。

# アイリスデータセットを読み込み
iris = datasets.load_iris()

# データの概要を確認
print("=== アイリスデータセットの情報 ===")
print(f"データ数: {len(iris.data)}")
print(f"特徴量の数: {len(iris.feature_names)}")
print(f"特徴量の名前: {iris.feature_names}")
print(f"分類する花の種類: {iris.target_names}")

# 最初の5件のデータを表示
print("\n=== 最初の5件のデータ ===")
for i in range(5):
    print(f"データ{i+1}: {iris.data[i]} → 花の種類: {iris.target_names[iris.target[i]]}")

次に、以下のコードでデータをグラフ化します。

# データを可視化
plt.figure(figsize=(12, 4))

# 1つ目のグラフ:萼片の長さ vs 幅
plt.subplot(1, 2, 1)
colors = ['red', 'green', 'blue']
for i, species in enumerate(iris.target_names):
    mask = iris.target == i
    plt.scatter(iris.data[mask, 0], iris.data[mask, 1], 
               c=colors[i], label=species, alpha=0.7)
plt.xlabel('萼片の長さ (cm)')
plt.ylabel('萼片の幅 (cm)')
plt.title('萼片のサイズによる花の分類')
plt.legend()

# 2つ目のグラフ:花びらの長さ vs 幅
plt.subplot(1, 2, 2)
for i, species in enumerate(iris.target_names):
    mask = iris.target == i
    plt.scatter(iris.data[mask, 2], iris.data[mask, 3], 
               c=colors[i], label=species, alpha=0.7)
plt.xlabel('花びらの長さ (cm)')
plt.ylabel('花びらの幅 (cm)')
plt.title('花びらのサイズによる花の分類')
plt.legend()

plt.tight_layout()
plt.show()

print("グラフから、花の種類ごとに測定値に違いがあることがわかります!")

UserWarning が発生しますが、下部にグラフが表示されていれば OK です。

このパターンを学習し、新しい花のデータの種類を予測できるようにします。

05. 機械学習モデルの訓練

決定木というアルゴリズムでモデルを訓練します。

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report

# データを訓練用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42
)

print("=== データの分割 ===")
print(f"訓練用データ: {len(X_train)}件")
print(f"テスト用データ: {len(X_test)}件")

# 機械学習モデルを作成・訓練
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

print("\n=== モデルの訓練完了 ===")
print("決定木モデルが花の分類方法を学習しました!")

ここでは訓練用のデータでモデルを学習しています。
テスト用データはモデルの性能評価で使用します。

06. モデルの性能評価

以下のコードでモデルの性能を評価します。

# テストデータで予測を実行
y_pred = model.predict(X_test)

# 予測精度を計算
accuracy = accuracy_score(y_test, y_pred)

print("=== モデルの性能評価 ===")
print(f"予測精度: {accuracy:.2%}")

# 詳細な結果を表示
print("\n=== 詳細な評価結果 ===")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 実際の予測例を表示
print("\n=== 予測例(最初の10件) ===")
for i in range(10):
    actual = iris.target_names[y_test[i]]
    predicted = iris.target_names[y_pred[i]]
    match = "✓" if actual == predicted else "✗"
    print(f"{i+1}. 実際: {actual:12} → 予測: {predicted:12} {match}")

予測精度が 100% なので、すべての花の種類を正確に予測しています。

未知のデータで予測

新しい花のデータで予測してみます。

# 新しい花のデータを作成(仮想的なデータ)
new_flowers = np.array([
    [5.1, 3.5, 1.4, 0.2],  # setosaに似たデータ
    [6.2, 2.8, 4.8, 1.8],  # virginicaに似たデータ
    [5.9, 3.0, 4.2, 1.5]   # versicolorに似たデータ
])

# 予測を実行
predictions = model.predict(new_flowers)
probabilities = model.predict_proba(new_flowers)

print("=== 新しい花のデータで予測 ===")
print("特徴量: [萼片長, 萼片幅, 花びら長, 花びら幅]")
print()

for i, (flower_data, pred, prob) in enumerate(zip(new_flowers, predictions, probabilities)):
    predicted_species = iris.target_names[pred]
    confidence = prob[pred] * 100
    
    print(f"花 {i+1}: {flower_data}")
    print(f"  → 予測結果: {predicted_species}")
    print(f"  → 信頼度: {confidence:.1f}%")
    print(f"  → 各種類の確率: setosa={prob[0]:.2f}, versicolor={prob[1]:.2f}, virginica={prob[2]:.2f}")
    print()

print("🎉 機械学習による花の分類が完成しました!")

未知のデータに対しても正確な予測ができました。

まとめ

今回は SageMaker ノートブックインスタンスで花の分類をやってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion