Python Scikit-learnによる機械学習の入門(Irisデータセット分類)

Scikit-learn は、Python機械学習を行うためのオープンソースライブラリです。分類、回帰、クラスタリング、次元削減、モデル選択、前処理など、機械学習に必要な多くの機能を提供しています。

ここでは、Irisデータセットを題材に、機械学習による基本的な分類の処理を行います。Irisデータセットは、機械学習の分野でよく利用されるサンプルデータセットです。3種類のアヤメ(Setosa, Versicolor, Virginica)について、それぞれ50サンプル、合計150サンプルのデータが含まれています。各サンプルには、がく片(sepal)の長さと幅、花弁(petal)の長さと幅の4つの特徴量があります。

目標

Irisデータセットに含まれる4つの特徴量(がく片の長さと幅、花弁の長さと幅)を基に、アヤメの種類を分類するモデルを構築し、その性能を評価します。

手順

1. データセットの読み込み

まず、Scikit-learnからIrisデータセットを読み込みます。load_iris()関数を使用します。

from sklearn.datasets import load_iris

iris = load_iris()

load_iris()関数は、特徴量データ (iris.data)、ターゲットデータ (iris.target)、特徴量名 (iris.feature_names)、ターゲット名 (iris.target_names) などを含む辞書形式のオブジェクトを返します。

2. データの確認

データの中身を確認します。

print("特徴量名:", iris.feature_names)
print("ターゲット名:", iris.target_names)
print("データの形状:", iris.data.shape)

出力例

特徴量名: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
ターゲット名: ['setosa' 'versicolor' 'virginica']
データの形状: (150, 4)

特徴量は4つ、データ数は150個であることがわかります。

3. データの前処理

データを特徴量データ(説明変数)X とターゲットデータ(目的変数)y に分割します。

X = iris.data  # 特徴量データ
y = iris.target  # ターゲットデータ(アヤメの種類:0, 1, 2)

4. データの分割

データをモデルの学習に使用するトレーニングデータと、モデルの評価に使用するテストデータに分割します。train_test_split()関数を使用します。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • test_size=0.2: テストデータの割合を20%に設定します。
  • random_state=42: 乱数シードを固定し、結果の再現性を保証します。(数値は任意)

5. モデルの構築

今回は分類問題なので、ロジスティック回帰モデルを使用します。LogisticRegressionクラスをインポートしてモデルをインスタンス化し、fit()メソッドでトレーニングデータに適合させます。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(random_state=42, max_iter=1000)  # モデルのインスタンス化
model.fit(X_train, y_train)  # モデルの学習
  • max_iter: 最大反復回数を指定し、収束しない場合の警告を抑制

6. モデルの評価

predict()メソッドでテストデータに対する予測を行い、accuracy_score()関数で正解率を計算してモデルを評価します。

from sklearn.metrics import accuracy_score

y_pred = model.predict(X_test)  # テストデータに対する予測
accuracy = accuracy_score(y_test, y_pred)  # 正解率の計算

print(f"正解率: {accuracy:.2f}")

正解率は0.00–1.00の範囲で、1.00に近いほど良いモデルです。

7.モデルのチューニング(必要に応じて)

分類の精度が低い場合は分類モデルのパラメータを調整します。 今回はLogisticRegressionクラスのパラメータsolver(最適化に使用するアルゴリズム)とC正則化の強さの逆数)を変更して精度が改善されるか確認します。

model = LogisticRegression(solver='liblinear', C=10.0, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"チューニング後の正解率: {accuracy:.2f}")

8. 全コード

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 1. データセットの読み込み
iris = load_iris()

# 2. データの確認
print("特徴量名:", iris.feature_names)
print("ターゲット名:", iris.target_names)
print("データの形状:", iris.data.shape)

# 3. データの前処理
X = iris.data
y = iris.target

# 4. データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 5. モデルの構築(パラメータ調整あり)
model = LogisticRegression(solver='liblinear', C=10.0, random_state=42)
model.fit(X_train, y_train)

# 6. モデルの評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"正解率: {accuracy:.2f}")

まとめ

本記事では、Scikit-learnを用いてIrisデータセットを分類する基本的な手順を解説しました。

  1. データセットの読み込みと確認
  2. データの前処理と分割
  3. モデルの構築(ロジスティック回帰)
  4. モデルの学習と評価(正解率)

pydocument.hatenablog.com

この基本的な流れは、他の分類問題や、異なるアルゴリズムを使用する場合にも応用できます。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com