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データセットを分類する基本的な手順を解説しました。
- データセットの読み込みと確認
- データの前処理と分割
- モデルの構築(ロジスティック回帰)
- モデルの学習と評価(正解率)
この基本的な流れは、他の分類問題や、異なるアルゴリズムを使用する場合にも応用できます。
[PR]