この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: scikit-learn
SEOタイトル: scikit-learn (Python 機械学習) 完全ガイド

この記事の要点
  • scikit-learn は Python で最も広く使われる機械学習ライブラリ。NumPy / SciPy / pandas と組み合わせて使う
  • estimator API が統一: 全アルゴリズムに fit() / predict() / score() が用意され、入れ替えが容易
  • Pipeline で前処理 → モデル学習 → 評価をひとつのオブジェクトに連結。クロスバリデーションも安全に
  • メジャーアルゴリズム網羅: LR / SVM / RandomForest / GradientBoosting / KMeans / PCA / k-NN
  • 深層学習は対象外(DL は PyTorch / TensorFlow / Keras)。古典 ML の デファクトスタンダード

scikit-learn の概要

scikit-learn(しばしば sklearn と省略)は、Python における機械学習の事実上の標準ライブラリです。2007 年に David Cournapeau によって始められ、現在は INRIA を中心とした活発なコミュニティによってメンテナンスされています。NumPy / SciPy / matplotlib という Python 科学計算スタックの上に構築され、pandas DataFrame とも自然に連携します。

古典的な機械学習(線形回帰、SVM、ランダムフォレスト、k-means など)は scikit-learn で完結する一方、ディープラーニングは別ライブラリ(PyTorch / TensorFlow / Keras)が担当する、というのが業界の住み分けです。

scikit-learn ロゴ

インストールと基本構成

# pip インストール(依存も含めて自動)
pip install scikit-learn

# Anaconda 環境なら標準で入っている
conda install scikit-learn

# 最新 1.x の確認
python -c "import sklearn; print(sklearn.__version__)"
# → 1.5.x など

scikit-learn は次のライブラリに依存します:

  • NumPy — N 次元配列・行列演算
  • SciPy — 統計・線形代数・最適化
  • joblib — 並列処理・モデル永続化
  • threadpoolctl — BLAS スレッド制御

estimator API: fit / predict / score

scikit-learn の最大の魅力は全アルゴリズムに同じインターフェイスが用意されていることです。線形回帰でもランダムフォレストでも同じコード形になります:

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

# データロード
iris = load_iris()
X, y = iris.data, iris.target

# 訓練/テスト分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 学習
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)

# 予測
y_pred = clf.predict(X_test)

# スコア(精度)
print(clf.score(X_test, y_test))
# → 0.9777...

このパターンを覚えれば、アルゴリズムを差し替えるだけで他の手法も試せます:

from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier

for clf in [SVC(), LogisticRegression(max_iter=1000), KNeighborsClassifier()]:
    clf.fit(X_train, y_train)
    print(type(clf).__name__, clf.score(X_test, y_test))

主要アルゴリズム一覧

分類代表的なクラス用途
線形モデルLinearRegression / LogisticRegression / Ridge / Lasso回帰・分類の基礎
SVMSVC / SVR / LinearSVC高次元データの分類
木系DecisionTreeClassifier / RandomForestClassifier解釈性ある分類・回帰
勾配ブースティングGradientBoostingClassifier / HistGradientBoostingRegressor表形式データの王道
クラスタリングKMeans / DBSCAN / AgglomerativeClustering教師なしグルーピング
次元削減PCA / TruncatedSVD / TSNE可視化・特徴圧縮
近傍法KNeighborsClassifier / NearestNeighbors近傍ベース推論
ナイーブベイズGaussianNB / MultinomialNBテキスト分類
ニューラルMLPClassifier / MLPRegressor軽量 NN(本格 DL は別ライブラリ)

特徴量前処理(preprocessing)

多くのアルゴリズムは入力スケールに敏感です。sklearn.preprocessing が前処理ツールを提供します:

from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder

# 標準化(平均0・分散1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)  # ← test には fit しない

# 0-1 正規化
mm = MinMaxScaler()
X_norm = mm.fit_transform(X_train)

# カテゴリ → One-Hot
ohe = OneHotEncoder(sparse_output=False)
encoded = ohe.fit_transform([['red'], ['blue'], ['green']])

Pipeline と ColumnTransformer

前処理 + モデルをひとつのオブジェクトに連結することで、テストデータ漏れ(data leakage)を防ぎ、クロスバリデーションでも安全に使えます:

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier

# 数値列 / カテゴリ列を別処理
preprocessor = ColumnTransformer([
    ('num', StandardScaler(), ['age', 'income']),
    ('cat', OneHotEncoder(handle_unknown='ignore'), ['gender', 'country']),
])

pipe = Pipeline([
    ('prep', preprocessor),
    ('clf',  RandomForestClassifier(random_state=42)),
])

pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

ハイパーパラメータ探索(GridSearchCV / RandomizedSearchCV)

from sklearn.model_selection import GridSearchCV

param_grid = {
    'clf__n_estimators': [50, 100, 200],
    'clf__max_depth':    [None, 5, 10, 20],
}
gs = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='accuracy')
gs.fit(X_train, y_train)

print(gs.best_params_)
print(gs.best_score_)

best = gs.best_estimator_
best.score(X_test, y_test)

クロスバリデーション

from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold

# 5-fold 交差検証
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
print(scores, scores.mean(), scores.std())

# 層化サンプリング(クラス不均衡時)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cross_val_score(clf, X, y, cv=skf)

付属データセット

関数内容サンプル数
load_iris()アヤメ 3 種類の花弁/萼サイズ150
load_digits()8x8 手書き数字1797
load_wine()ワインの化学成分178
load_breast_cancer()乳がん診断569
fetch_california_housing()カリフォルニア住宅価格20640
fetch_openml(...)OpenML から任意取得各種
make_classification()分類用の合成データ任意
make_blobs()クラスタリング用の塊任意

モデルの保存と読込

import joblib

# 保存
joblib.dump(pipe, 'model.joblib')

# 読込
loaded = joblib.load('model.joblib')
loaded.predict(X_test)

pickle でも保存できますが、joblib の方が NumPy 配列を効率的に扱えるため推奨されます。

Jupyter での可視化

import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay, RocCurveDisplay

# 混同行列
ConfusionMatrixDisplay.from_estimator(clf, X_test, y_test)
plt.show()

# ROC 曲線(2 値分類)
RocCurveDisplay.from_estimator(clf, X_test, y_test)
plt.show()

# 決定木の可視化
from sklearn.tree import plot_tree, DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=3).fit(X, y)
plot_tree(dt, filled=True, feature_names=iris.feature_names)

scikit-learn と他ライブラリの比較

ライブラリ得意領域scikit-learn との関係
scikit-learn古典 ML 全般
XGBoost / LightGBM / CatBoost高性能 GBDTsklearn 互換 API あり
PyTorch / TensorFlowディープラーニング役割分担、データ前処理は sklearn
statsmodels古典統計(p 値・信頼区間)解釈重視ならこちら
imbalanced-learn不均衡データ対策(SMOTE 等)sklearn と統合的に使う

FAQ

Q: scikit-learn でディープラーニングはできる?
A: MLPClassifier 等の小規模 NN はありますが、GPU・大規模学習には対応しません。本格的には PyTorch / TensorFlow を使ってください。

Q: なぜ標準化が必要?
A: SVM、k-NN、PCA、ロジスティック回帰などは特徴量スケールに敏感です。木系(RF, GBDT)は不要なことが多いです。

Q: predict_proba と decision_function の違いは?
A: predict_proba は確率 [0,1]、decision_function は決定境界からの距離(マージン)。閾値調整は decision_function が便利です。

Q: GridSearchCV が遅い
A: n_jobs=-1 で並列化、RandomizedSearchCVHalvingGridSearchCV で探索を間引き、それでも遅ければ Optuna 等のベイズ最適化に切替を検討。