scikit-learnで機械学習入門

Pythonを使ったデータサイエンスの世界に足を踏み入れるとき、必ずといっていいほど登場するのが scikit-learnです。
シンプルなAPI設計と豊富な機能で、初心者から上級者まで幅広く支持されています。
本記事では、scikit-learnを活用してデータサイエンスを効率的に進めるためのポイントを整理します。

scikit-learnとは?

  • 機械学習ライブラリ:分類、回帰、クラスタリング、次元削減など幅広いアルゴリズムを提供
  • 統一されたAPIfitpredict の流れで直感的にモデルを扱える
  • 豊富なツール群:前処理、モデル選択、評価指標など、データ分析に必要な機能が一通り揃っている

基本的な使い方

データの準備

from sklearn.datasets import load_iris
data = load_iris()
X, y = data.data, data.target

print("X:") 
print(X[:5, :]) 
print("y:") 
print(y[:5])
出力:
X:
[[5.1 3.5 1.4 0.2]
 [4.9 3.0 1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.0 3.6 1.4 0.2]]
y:
[0 0 0 0 0]
このコードでは Irisデータセット(アヤメの花の有名なデータセット)を読み込み、特徴量とラベルの最初の5件を表示しています。
  • Xは以下の花の特徴量を表します。
    • 1列目: がくの長さ (sepal length)
    • 2列目: がくの幅 (sepal width)
    • 3列目: 花びらの長さ (petal length)
    • 4列目: 花びらの幅 (petal width)
  • yはアヤメの種類を表すラベルです。
    • 0: Setosa
    • 1: Versicolor
    • 2: Virginica

データの前処理

  • 標準化: StandardScaler
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# データの読み込み
data = load_iris()
X = data.data

print("スケーリング前のデータ(先頭5行):")
print(X[:5])

# StandardScalerのインスタンスを作成
scaler = StandardScaler()

# fitで平均と標準偏差を計算し、transformで変換
X_scaled = scaler.fit_transform(X)

print("スケーリング後のデータ(先頭5行):")
print(X_scaled[:5])
出力:
スケーリング前のデータ(先頭5行):
[[5.1 3.5 1.4 0.2]
 [4.9 3.0 1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.0 3.6 1.4 0.2]]

スケーリング後のデータ(先頭5行):
[[ 0.56694671  0.82727866 -0.56694671  0.        ]
 [ 0.05669467 -0.82727866 -0.56694671  0.        ]
 [-0.45355737 -0.23636533 -1.70084012  0.        ]
 [-0.70869405 -0.531822    0.56694671  0.        ]
 [ 0.53961005  0.76818733  2.26758083  0.        ]]
標準化とは、特徴量の平均を0、標準偏差を1となるように変換する処理です。
異なるスケールを持つデータを統一することで、機械学習アルゴリズムの性能を安定させる効果があります。
上記の例では、スケーリング前のデータに対して、スケーリング後の各列(特徴量)が平均が0、標準偏差が1になるよう変換されています。

  • 最小最大正規化: MinMaxScaler
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_iris

# データの読み込み
data = load_iris()
X = data.data

print("スケーリング前のデータ(先頭5行):")
print(X[:5])

# MinMaxScalerのインスタンスを作成(デフォルトは0〜1にスケーリング)
scaler = MinMaxScaler()

# fitで最小値・最大値を計算し、transformで変換
X_scaled = scaler.fit_transform(X[:5])

print("スケーリング後のデータ(先頭5行):")
print(X_scaled)
出力:
スケーリング前のデータ(先頭5行):
[[5.1 3.5 1.4 0.2]
 [4.9 3.0 1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.0 3.6 1.4 0.2]]

スケーリング後のデータ(先頭5行):
[[0.625      0.71428571 0.33333333 0.        ]
 [0.375      0.         0.33333333 0.        ]
 [0.125      0.4        0.         0.        ]
 [0.         0.2        1.         0.        ]
 [0.5        1.         0.33333333 0.        ]]
最小最大正規化とは、特徴量の最小値を0、最大値を1となるように変換する処理です。
前述の「標準化」と同様に、各特徴量を同じスケールに揃えることができます。
上記の例では、スケーリング前のデータに対して、スケーリング後の各列(特徴量)が 0~1 に収まるよう変換されています。

  • 欠損値処理: SimpleImputer
import numpy as np
from sklearn.impute import SimpleImputer

# サンプルデータ(欠損値を含む)
X = np.array([
    [1, 2, np.nan],
    [3, np.nan, 6],
    [7, 8, 9]
])

print("欠損値を含むデータ:")
print(X)

# SimpleImputerのインスタンスを作成(平均値で補完)
imputer = SimpleImputer(strategy="mean")

# fitで補完値を計算し、transformで変換
X_imputed = imputer.fit_transform(X)

print("欠損値を補完した後のデータ:")
print(X_imputed)
出力:
欠損値を含むデータ:
[[ 1.  2. nan]
 [ 3. nan  6.]
 [ 7.  8.  9.]]

欠損値を補完した後のデータ:
[[1.  2.  7.5]
 [3.  5.  6. ]
 [7.  8.  9. ]]
欠損値とは、値が欠落しているデータです。上記の出力データでは「nan」と表示されています。
欠損値があると、分析や機械学習モデルの制度が低下したり、誤った結論が導かれる可能性があります。
SimpleImputerクラスを使うと、以下の値で補完することができ、上記の例では平均値で補完しています。
  • strategy="mean" → 平均値で補完
  • strategy="median" → 中央値で補完
  • strategy="most_frequent" → 最頻値で補完
  • strategy="constant" → 任意の定数で補完(fill_value を指定)

モデルの選択と学習

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier()
model.fit(X_train, y_train)
このコードは、機械学習モデル(ランダムフォレスト分類器)を使ってデータを分割、学習する処理です。
機械学習モデルを構築する際、データを「訓練用」と「テスト用」に分割します。

  • 訓練用データ:モデルの学習させるために使用するデータ
  • テスト用データ:学習したモデルの性能を評価するために使用するデータ
という意味合いで、訓練用データで学習したモデルを、テストデータを使って予測させることで、モデルの評価を行うことができます。
上記の例では、train_test_splitメソッドに対して、test_size=0.2と指定していますが、これは「データの20%をテスト用、残りの80%を訓練用に分割する」という意味合いです。Irisデータセットを使っている場合、

  • X: 特徴量(例: 花の長さや幅など)
  • y: ラベル(例: 花の種類)

となり、X_train, y_trainが訓練用データ、X_test, y_testがテスト用データとなります。

データの分割ができたらRandomForestClassifierクラス=ランダムフォレスト分類器(複数の決定木を組み合わせたモデル)に対して、訓練用データ (X_train, y_train)を使って学習を行います。

予測と評価

from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
このコードは、前項の「モデルの選択と学習」で作ったテストデータに対して、予測の精度を評価する処理です。
出力は例えば以下のようになります:

Accuracy: 0.9666666666666667

※実行ごとに分割や乱数の影響で結果は変わりますが、Irisデータセットでは 0.93〜1.0程度 の高い精度が出ることが多いと言われています。

まとめ

scikit-learnは「データサイエンスの標準ツール」といっても過言ではありません。
シンプルな構造ながら、実務でも十分に通用する強力な機能を備えています。
まずは小さなデータセットでいろいろ試してみて、徐々に応用範囲を広げていきましょう!

タイトルとURLをコピーしました