レッスン9:Pythonによる機械学習入門:Scikit-learn

このレッスンでは、Pythonの機械学習ライブラリであるScikit-learnについて学びます。Scikit-learnは、分類、回帰、クラスタリング、次元削減、モデル選択など、さまざまな機械学習タスクを行うためのツールを提供しています。

目次

  1. Scikit-learnの紹介

  2. Scikit-learnでのデータの準備

  3. Scikit-learnでのモデルの訓練

  4. Scikit-learnでのモデルの評価

  5. Scikit-learnでのモデルの改良

  6. 演習問題

1. Scikit-learnの紹介

Scikit-learnは、Pythonの機械学習ライブラリで、分類、回帰、クラスタリング、次元削減、モデル選択など、さまざまな機械学習タスクを行うためのツールを提供しています。Scikit-learnは、NumPyやSciPyと密接に統合されており、これらのライブラリの機能を活用しています。 具体的にどのような機械学習のモデルが利用可能かはユーザーガイドを参照してください。

Scikit-learnの主な特徴は次のとおりです。

  • シンプルで一貫したAPI

  • 有用なデータセットのサンプル

  • ベンチマーク用の評価関数

  • データの前処理とパラメータのチューニングのためのユーティリティ

  • 豊富なドキュメンテーション

Scikit-learnを使用するには、まずライブラリをインポートする必要があります。

import sklearn
from sklearn import datasets
from sklearn import svm

このコードは、Scikit-learnライブラリからdatasetsとsvmモジュールをインポートします。

2. Scikit-learnでのデータの準備

Scikit-learnで機械学習モデルを訓練する前に、データを適切な形式に準備する必要があります。Scikit-learnでは、データは通常、2次元のデータ配列(またはリストのリスト)として表されます。各行はサンプル(またはインスタンス)を表し、各列は特徴(または属性、次元)を表します。

Scikit-learnには、機械学習のアルゴリズムを試すためのいくつかのトイデータセットが含まれています。これらのデータセットは、sklearn.datasetsモジュールを通じて利用できます。

以下に、Irisデータセットをロードして表示する例を示します。 このコードは、Irisデータセットをロードし、特徴データとターゲットデータ(ラベル)を表示します。特徴データは具体的には花びらやがくの長さなど4種類の測定値、ラベルは花の種類(3種類のどれか1つ)を表します。

(参考:https://atmarkit.itmedia.co.jp/ait/articles/2206/13/news032.html )

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

# 特徴データとラベルデータ
print(iris.data)
print(iris.target)
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]
 [5.4 3.7 1.5 0.2]
 [4.8 3.4 1.6 0.2]
 [4.8 3.  1.4 0.1]
 [4.3 3.  1.1 0.1]
 [5.8 4.  1.2 0.2]
 [5.7 4.4 1.5 0.4]
 [5.4 3.9 1.3 0.4]
 [5.1 3.5 1.4 0.3]
 [5.7 3.8 1.7 0.3]
 [5.1 3.8 1.5 0.3]
 [5.4 3.4 1.7 0.2]
 [5.1 3.7 1.5 0.4]
 [4.6 3.6 1.  0.2]
 [5.1 3.3 1.7 0.5]
 [4.8 3.4 1.9 0.2]
 [5.  3.  1.6 0.2]
 [5.  3.4 1.6 0.4]
 [5.2 3.5 1.5 0.2]
 [5.2 3.4 1.4 0.2]
 [4.7 3.2 1.6 0.2]
 [4.8 3.1 1.6 0.2]
 [5.4 3.4 1.5 0.4]
 [5.2 4.1 1.5 0.1]
 [5.5 4.2 1.4 0.2]
 [4.9 3.1 1.5 0.2]
 [5.  3.2 1.2 0.2]
 [5.5 3.5 1.3 0.2]
 [4.9 3.6 1.4 0.1]
 [4.4 3.  1.3 0.2]
 [5.1 3.4 1.5 0.2]
 [5.  3.5 1.3 0.3]
 [4.5 2.3 1.3 0.3]
 [4.4 3.2 1.3 0.2]
 [5.  3.5 1.6 0.6]
 [5.1 3.8 1.9 0.4]
 [4.8 3.  1.4 0.3]
 [5.1 3.8 1.6 0.2]
 [4.6 3.2 1.4 0.2]
 [5.3 3.7 1.5 0.2]
 [5.  3.3 1.4 0.2]
 [7.  3.2 4.7 1.4]
 [6.4 3.2 4.5 1.5]
 [6.9 3.1 4.9 1.5]
 [5.5 2.3 4.  1.3]
 [6.5 2.8 4.6 1.5]
 [5.7 2.8 4.5 1.3]
 [6.3 3.3 4.7 1.6]
 [4.9 2.4 3.3 1. ]
 [6.6 2.9 4.6 1.3]
 [5.2 2.7 3.9 1.4]
 [5.  2.  3.5 1. ]
 [5.9 3.  4.2 1.5]
 [6.  2.2 4.  1. ]
 [6.1 2.9 4.7 1.4]
 [5.6 2.9 3.6 1.3]
 [6.7 3.1 4.4 1.4]
 [5.6 3.  4.5 1.5]
 [5.8 2.7 4.1 1. ]
 [6.2 2.2 4.5 1.5]
 [5.6 2.5 3.9 1.1]
 [5.9 3.2 4.8 1.8]
 [6.1 2.8 4.  1.3]
 [6.3 2.5 4.9 1.5]
 [6.1 2.8 4.7 1.2]
 [6.4 2.9 4.3 1.3]
 [6.6 3.  4.4 1.4]
 [6.8 2.8 4.8 1.4]
 [6.7 3.  5.  1.7]
 [6.  2.9 4.5 1.5]
 [5.7 2.6 3.5 1. ]
 [5.5 2.4 3.8 1.1]
 [5.5 2.4 3.7 1. ]
 [5.8 2.7 3.9 1.2]
 [6.  2.7 5.1 1.6]
 [5.4 3.  4.5 1.5]
 [6.  3.4 4.5 1.6]
 [6.7 3.1 4.7 1.5]
 [6.3 2.3 4.4 1.3]
 [5.6 3.  4.1 1.3]
 [5.5 2.5 4.  1.3]
 [5.5 2.6 4.4 1.2]
 [6.1 3.  4.6 1.4]
 [5.8 2.6 4.  1.2]
 [5.  2.3 3.3 1. ]
 [5.6 2.7 4.2 1.3]
 [5.7 3.  4.2 1.2]
 [5.7 2.9 4.2 1.3]
 [6.2 2.9 4.3 1.3]
 [5.1 2.5 3.  1.1]
 [5.7 2.8 4.1 1.3]
 [6.3 3.3 6.  2.5]
 [5.8 2.7 5.1 1.9]
 [7.1 3.  5.9 2.1]
 [6.3 2.9 5.6 1.8]
 [6.5 3.  5.8 2.2]
 [7.6 3.  6.6 2.1]
 [4.9 2.5 4.5 1.7]
 [7.3 2.9 6.3 1.8]
 [6.7 2.5 5.8 1.8]
 [7.2 3.6 6.1 2.5]
 [6.5 3.2 5.1 2. ]
 [6.4 2.7 5.3 1.9]
 [6.8 3.  5.5 2.1]
 [5.7 2.5 5.  2. ]
 [5.8 2.8 5.1 2.4]
 [6.4 3.2 5.3 2.3]
 [6.5 3.  5.5 1.8]
 [7.7 3.8 6.7 2.2]
 [7.7 2.6 6.9 2.3]
 [6.  2.2 5.  1.5]
 [6.9 3.2 5.7 2.3]
 [5.6 2.8 4.9 2. ]
 [7.7 2.8 6.7 2. ]
 [6.3 2.7 4.9 1.8]
 [6.7 3.3 5.7 2.1]
 [7.2 3.2 6.  1.8]
 [6.2 2.8 4.8 1.8]
 [6.1 3.  4.9 1.8]
 [6.4 2.8 5.6 2.1]
 [7.2 3.  5.8 1.6]
 [7.4 2.8 6.1 1.9]
 [7.9 3.8 6.4 2. ]
 [6.4 2.8 5.6 2.2]
 [6.3 2.8 5.1 1.5]
 [6.1 2.6 5.6 1.4]
 [7.7 3.  6.1 2.3]
 [6.3 3.4 5.6 2.4]
 [6.4 3.1 5.5 1.8]
 [6.  3.  4.8 1.8]
 [6.9 3.1 5.4 2.1]
 [6.7 3.1 5.6 2.4]
 [6.9 3.1 5.1 2.3]
 [5.8 2.7 5.1 1.9]
 [6.8 3.2 5.9 2.3]
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]

3. Scikit-learnでのモデルの訓練

下に、サポートベクターマシン(SVM)を使用してIrisデータセットのモデルを訓練する例を示します。 このコードは、SVC(Support Vector Classification)モデルを訓練します。gammaパラメータは、モデルの複雑さを制御します(値が大きいほど複雑なモデルになります)。

# SVMモデルの訓練
clf = svm.SVC(gamma='scale')
clf.fit(iris.data, iris.target)
SVC()

最後に、fit()メソッドを使用してモデルを訓練します。fit(X, y)では、特徴量Xと対応するクラスラベルyを使ってモデルを訓練します。

このコードを実行すると、clfオブジェクトが訓練され、Irisデータセットの分類モデルが作成されます。このモデルは、与えられた特徴量に基づいてアヤメの品種を予測することができます。

また、ここではデータの全てを訓練用のデータ(Training data)に用いていますが、実際にはデータは訓練データとテストデータに分割して使用される場合が多いです。

  • 訓練データ(Training Data):モデルの学習(訓練)に使用されるデータセットです。モデルは、訓練データの特徴量とそれに対応する正解ラベル(または目標値)の関係を学習します。訓練データは、モデルのパラメータを調整し、最適な予測モデルを構築するために使用されます。モデルが訓練データにうまく適合するように学習することが目標です。

  • テストデータ(Test Data):モデルの訓練後にその性能を評価するために使用されるデータセットです。テストデータは、モデルが未知のデータにどれだけうまく汎化できるかを評価するために使用されます。モデルがテストデータに対してどれくらい正確に予測できるかは、モデルの性能の指標となります。

一般的には、与えられたデータセットを訓練データとテストデータにランダムに分割することです。一般的な割合は、訓練データが70-80%、テストデータが20-30%となるようにします。ただし、データセットのサイズや特定のタスクによって最適な分割方法は異なる場合があります。

4. Scikit-learnでのモデルの評価

モデルが訓練されたら、その性能を評価する必要があります。Scikit-learnでは、モデルのpredictメソッドを使用して新しいデータの予測を行い、これを真のターゲットデータと比較することでモデルの性能を評価できます。

以下に、訓練済みのSVCモデルを使用して新しいデータの予測を行い、その結果を表示する例を示します。今回はテストデータの分割を行わなかったため、完全に新しいデータの予測を行い、その結果(予測されたラベル、0、1、2のどれか)を表示します。

new_data = [[5.1, 3.5, 1.4, 0.2],
            [7.0, 3.2, 4.7, 1.4],
            [6.3, 3.3, 6.0, 2.5]]
predictions = clf.predict(new_data)
print(predictions)
[0 1 2]

5. Scikit-learnでのモデルの改良

モデルの性能が不十分な場合、モデルを改良するためのいくつかの方法があります。以下に、いくつかの一般的なアプローチを示します:

  • パラメータチューニング:ほとんどの機械学習アルゴリズムには、モデルの複雑さや学習率など、モデルの性能に影響を与えるパラメータがあります。これらのパラメータを調整することで、モデルの性能を改善できる可能性があります。

  • 特徴選択:使用する特徴を選択することで、モデルの性能を改善できる可能性があります。不要な特徴を削除することで、モデルが重要なパターンに焦点を当てることができます。

  • 別のモデルの使用:異なる機械学習アルゴリズムは、異なるタイプのデータやタスクに対して異なる性能を発揮します。したがって、別のモデルを試すことで、モデルの性能を改善できる可能性があります。

Scikit-learnには、これらのタスクを支援するための多くのユーティリティが含まれています。例えば、GridSearchCVはパラメータチューニングを自動化し、SelectKBestは特徴選択を支援します。

6. 演習問題

以下の演習問題を解いて、Scikit-learnの基本的な使用方法を理解しましょう。

  1. Scikit-learnのIrisデータセットをロードしてください。

  2. データセットの特徴データとターゲットデータを表示してください。

  3. SVC(Support Vector Classification)モデルを訓練してください。

  4. 新しいデータ(例:[4.0, 3.0, 2.1, 1.8])の予測を行い、その結果を表示してください。

  5. モデルのパラメータgammascaleから具体的な数字に変更して(例えば、0, 0.1, 1, 10など)、それがモデルの性能(出力)にどのように影響するかを観察してください。

ヒント:

  • データセットのロード:datasets.load_iris()

  • モデルの訓練:clf.fit(X, y)

  • データの予測:clf.predict(new_data)

  • パラメータの変更:clf = svm.SVC(gamma=new_value)

# 演習問題1, 2
# 以下にコードを書いてみましょう
# 演習問題3, 4, 5
# 以下にコードを書いてみましょう