Pythonを使ったデータサイエンスの世界に足を踏み入れるとき、必ずといっていいほど登場するのが scikit-learnです。
シンプルなAPI設計と豊富な機能で、初心者から上級者まで幅広く支持されています。
本記事では、scikit-learnを活用してデータサイエンスを効率的に進めるためのポイントを整理します。
scikit-learnとは?
- 機械学習ライブラリ:分類、回帰、クラスタリング、次元削減など幅広いアルゴリズムを提供
- 統一されたAPI:
fit→predictの流れで直感的にモデルを扱える - 豊富なツール群:前処理、モデル選択、評価指標など、データ分析に必要な機能が一通り揃っている
基本的な使い方
データの準備
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: Setosa1: Versicolor2: 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になるよう変換されています。
異なるスケールを持つデータを統一することで、機械学習アルゴリズムの性能を安定させる効果があります。
上記の例では、スケーリング前のデータに対して、スケーリング後の各列(特徴量)が平均が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 に収まるよう変換されています。
前述の「標準化」と同様に、各特徴量を同じスケールに揃えることができます。
上記の例では、スケーリング前のデータに対して、スケーリング後の各列(特徴量)が 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クラスを使うと、以下の値で補完することができ、上記の例では平均値で補完しています。
欠損値があると、分析や機械学習モデルの制度が低下したり、誤った結論が導かれる可能性があります。
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は「データサイエンスの標準ツール」といっても過言ではありません。
シンプルな構造ながら、実務でも十分に通用する強力な機能を備えています。
まずは小さなデータセットでいろいろ試してみて、徐々に応用範囲を広げていきましょう!

