Python

Scikit-learnとは?読み方・できること・使い方を実行例で解説

Scikit-learnとは?読み方・できること・使い方を実行例で解説

Scikit-learn は、分類・回帰・クラスタリングといった機械学習のアルゴリズムを、Python から同じ書き方で呼び出せるようにしたライブラリです。表形式のデータを扱う場面では事実上の標準で、データを読み込んでモデルを学習させ、精度を測るところまでが、import を除けば10行で書けます。この記事のコードと出力は、すべて scikit-learn 1.9.0/Python 3.12.13 の環境で実際に実行して得たものです。

まとめ

  • 読み方は公式FAQが「sy-kit learn」と明記。「sci」は science の略で、SciPy 系ツールボックス群(scikits)の一つ
  • 2026年8月時点の最新版は 1.9.0(2026年6月2日公開)。Python 3.11 以上が必要で、3.10 には 1.7 系までしか入らない
  • 収録されている推定器は208個。うち分類44・回帰55・クラスタリング12・変換器84(複数カテゴリに属するものを含む)
  • 学習は全推定器が fit で統一。予測は predict、変換は transform に分かれ、アルゴリズムを差し替えても書き換えるのは1行
  • 深層学習と強化学習は公式が「対象外」と明言。GPU も既定では使わない

以下、名前の由来とライセンスから、インストール、実際に動く最小コード、そして「Scikit-learn では無理な領域」までを順に見ていきます。

Scikit-learnの読み方・名前の由来・開発体制

読み方は「sy-kit learn」

公式ドキュメントのFAQに「How do you pronounce the project name?」という項目があり、回答は「sy-kit learn. sci stands for science!」です。つまり「サイキット・ラーン」に近い音で、頭の sci は science(科学)の略になります。日本語圏では「サイキットラーン」「サイキット・ラーン」の表記が定着していますが、公式が示しているのは英語での音の当て方までで、カタカナ表記そのものに公式の定めはありません。

「scikit」については、同じFAQが「SciPy を土台に作られた科学計算ツールボックスが複数あり、scikit-learn のほかに scikit-image が有名」と説明しています。scikits(SciPy を土台にした科学計算ツールボックス群)の系列名であって、Scikit-learn 独自の造語ではありません。なお sklearn は Python 側の import 名で、パッケージ名としては scikit-learn が正式です。この使い分けはインストール時に実害が出ます(後述)。

2007年のGSoCから始まり、いまも約3か月ごとに更新

公式のAboutページによれば、プロジェクトは2007年に David Cournapeau 氏の Google Summer of Code として始まり、同年に Matthieu Brucher 氏が学位研究の一環として加わりました。2010年に INRIA(フランス国立情報学自動制御研究所)の Fabian Pedregosa、Gael Varoquaux、Alexandre Gramfort、Vincent Michel の各氏が開発を引き継ぎ、最初の公開版が2010年2月1日にリリースされています。以降は「およそ3か月周期」でリリースが続いている、と同ページが記しています。

同ページは、INRIA が引き継いだあとの現在について「a thriving international community has been leading the development」(国際的なコミュニティが開発を主導している)と記しています。INRIA が保持しているのは、在籍中の貢献分の著作権です。出典は公式のAboutページ

ライセンスはBSD 3-Clause(商用組み込みで公開義務なし)

ライセンスは BSD 3-Clause です。インストール後のパッケージメタデータには License-Expression: BSD-3-Clause と記録されており、GitHub リポジトリのライセンス表記(spdx_id: BSD-3-Clause)とも一致します。商用製品に組み込んでも自社コードの公開義務は生じません。2010年の初公開から16年、リリースが途切れず続いていて、ライセンス面の制約も緩い。業務システムに機械学習を載せるときに Scikit-learn が第一候補になるのは、この2点が効いています。

Scikit-learnでできること:208個の推定器の中身

「できること」は、収録されている推定器(estimator)を数えるのが手っ取り早く分かります。Scikit-learn には推定器を列挙するユーティリティが同梱されているので、そのまま実行できます。

from sklearn.utils.discovery import all_estimators

for kind in ["classifier", "regressor", "cluster", "transformer"]:
    print(kind, len(all_estimators(type_filter=kind)))
print("合計", len(all_estimators()))
classifier 44
regressor 55
cluster 12
transformer 84
合計 208

4カテゴリの合計は195ですが、全体は208。ずれるのは、KMeans のようにクラスタリングと変換の両方に数えられるものが14個あり、逆に IsolationForest(外れ値検知)や GridSearchCVPipeline のようにどれにも属さないメタ推定器が27個あるためです。変換器がいちばん多い——これが Scikit-learn の性格をよく表す点です。標準化、欠損値補完、One-Hotエンコーディング、次元削減といった「モデルに食わせる前の加工」が本体と同じ作法で書けるので、前処理から評価までを一つのオブジェクトにまとめられます。ロジスティック回帰、ランダムフォレスト、サポートベクターマシン、k-means、主成分分析といった定番も、もちろんこの中。サポートベクターマシンが内部で使うカーネル法の仕組みとカーネル関数の種類は別記事で扱っています。

裏を返すと、画像・音声・自然言語の生データをそのまま扱う機能はほとんどありません。Scikit-learn が守備範囲としているのは、行と列に整理済みの表形式データです。データを表に整える工程は Pandasのできること・使い方、数値配列の扱いは NumPyの基本的な使い方が受け持ちます。

インストールと対応Pythonバージョン

pip installとバージョン確認

インストールは pip 一行です。NumPy と SciPy は依存関係として自動で入ります。

pip install scikit-learn
python -c "import sklearn; print(sklearn.__version__)"

ここで pip install sklearn と打つと失敗します。実際に 1.9.0 環境で試すと、ホイールのビルドに入る前に「The ‘sklearn’ PyPI package is deprecated, use ‘scikit-learn’ rather than ‘sklearn’ for pip commands.」というメッセージを出して異常終了します。import 名が sklearn なので混同しやすいものの、pip に渡す名前は scikit-learn です。requirements.txt に sklearn と書いてある古いプロジェクトは、この行の書き換えが先決。エラーメッセージ自身は最終手段として環境変数 SKLEARN_ALLOW_DEPRECATED_SKLEARN_PACKAGE_INSTALL=True による回避も案内していますが、これは依存パッケージ側の修正を待つ間のしのぎで、公式が勧めているのは名前の書き換えです。

環境まで含めて確認したいときは sklearn.show_versions() を使います。1.9.0 で実行すると、依存ライブラリの一覧に narwhals が現れます。

>>> import sklearn
>>> sklearn.show_versions()

System:
    (Python本体とマシン情報。ここでは省略)

Python dependencies:
      sklearn: 1.9.0
        numpy: 2.5.2
        scipy: 1.18.0
       pandas: 3.0.5
       joblib: 1.5.3
threadpoolctl: 3.6.0
     narwhals: 2.24.0
    (pip・setuptools・Cython・matplotlib の行は省略)

narwhals は 1.9 で新しく加わった依存で、DataFrame を入力・出力として扱う set_output 周りの実装を共通化するために採用されました。オフライン環境へホイールを持ち込んでいる場合、1.8 以前の手順のままだとこの依存が抜けてインストールに失敗します。pip と conda のどちらで環境を作るかで詰まったときは、pipとcondaの違いと使い分けを参照してください。

Pythonが古いとScikit-learnも古い版しか入らない

「入れたはずなのにバージョンが上がらない」という相談の大半は、Python 側の版が要件を満たしていないケースです。Scikit-learn は Python の最低要件を段階的に引き上げており、PyPI に登録された requires_python を確認すると次のようになっています。

Pythonのバージョン 入る最新のScikit-learn そこで頭打ちになる理由
3.9 1.6.1 1.7.0以降が3.10以上を要求
3.10 1.7.2 1.8.0以降が3.11以上を要求
3.11 / 3.12 / 3.13 / 3.14 1.9.0 頭打ちなし(1.9.0が3.11以上を要求)

1.9.0 が配布しているホイールのタグは cp311・cp312・cp313・cp314 の4種類です。PyPI に登録された requires_python にもとづくと、Python 3.10 の環境で pip install scikit-learn を実行した pip は、条件に合う 1.7.2 を選んで黙って入れることになります。エラーにならないため気づきにくく、1.8 以降で追加された機能のドキュメントを読みながら「動かない」と悩むことになります。バージョンが想定より低いときは、まず python --version を確認してください。

使い方:分類モデルを作って評価するまで

最小構成:読み込み→分割→学習→評価

付属のアヤメ(iris)データセットで、学習から評価までの流れをひととおり通します。

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

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0, stratify=y
)

model = RandomForestClassifier(n_estimators=100, random_state=0)
model.fit(X_train, y_train)
pred = model.predict(X_test)

print("正解率:", accuracy_score(y_test, pred))
正解率: 0.9777777777777777

fit で学習し、predict で予測する。RandomForestClassifierLogisticRegressionSVC に書き換えても、残りのコードは一文字も変わりません。アルゴリズムの比較検討が安く済むのはこの設計のおかげです。random_state の固定は結果の再現用で、外すと実行のたびに数値が動きます。stratify=y は分割後もクラス比率を保つ指定。不均衡データでは付けるかどうかで評価値が変わります。

数値と文字列が混ざったデータをColumnTransformerで整える

実データは数値列とカテゴリ列が混在しているのが普通です。列ごとに違う前処理を当てるには ColumnTransformer を使います(DataFrame を渡すので pandas も必要です)。

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler

df = pd.DataFrame(
    {"age": [25, 40, 33], "dept": ["sales", "dev", "sales"]}
)

ct = ColumnTransformer(
    [("num", StandardScaler(), ["age"]),
     ("cat", OneHotEncoder(sparse_output=False), ["dept"])]
)
out = ct.fit_transform(df)

print(ct.get_feature_names_out())
print(out.round(3))
['num__age' 'cat__dept_dev' 'cat__dept_sales']
[[-1.251  0.     1.   ]
 [ 1.197  1.     0.   ]
 [ 0.054  0.     1.   ]]

年齢は平均0・標準偏差1に標準化され、部署は dev と sales の2列に展開されました。get_feature_names_out() が返す num__age のような名前は「変換器名__元の列名」の形式で、変換後にどの列が何を表しているかを追えます。特徴量が数十列を超えると、この名前が付いているかどうかでデバッグの手間がまったく変わります。

スケーリングを省くと精度も収束も落ちる(実測)

標準化を「あってもなくても大差ない前処理」と受け取られることがありますが、スケールに敏感なアルゴリズムでは差が出ます。乳がん診断データ(30特徴量、値域が列ごとに大きく違う)でロジスティック回帰を、標準化ありとなしで比べます。分割条件は test_size=0.3random_state=0max_iter は既定の100のままです。

import warnings
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

X, y = load_breast_cancer(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)

with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    raw = LogisticRegression().fit(X_tr, y_tr)   # max_iter は既定の100
    print("スケーリングなし:", round(raw.score(X_te, y_te), 4),
          "警告:", w[0].category.__name__ if w else "なし")

sc = StandardScaler().fit(X_tr)
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    scaled = LogisticRegression().fit(sc.transform(X_tr), y_tr)
    print("スケーリングあり:", round(scaled.score(sc.transform(X_te), y_te), 4),
          "警告:", w[0].category.__name__ if w else "なし")
スケーリングなし: 0.9591 警告: ConvergenceWarning
スケーリングあり: 0.9766 警告: なし

正解率が0.9591から0.9766へ上がっただけでなく、標準化なしの側では ConvergenceWarning(既定の反復回数内に最適化が収束しなかった、という警告)が出ています。警告が出た結果は「学習が途中で打ち切られたモデル」の成績であって、そのアルゴリズムの実力ではありません。max_iter を増やして黙らせる前に、まず標準化を挟むほうが筋が良いということです。この差はロジスティック回帰やサポートベクターマシン、k近傍法のように距離やスケールを前提とするアルゴリズムで顕著で、決定木系(ランダムフォレストなど)ではほとんど出ません。

Pipelineと交差検証をセットで使う

前処理とモデルは Pipeline で1つにまとめます。まとめる理由は手間の削減ではなく、交差検証のときに前処理が分割ごとに学習し直されるようにするためです。

from sklearn.datasets import load_breast_cancer
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
pipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
scores = cross_val_score(pipe, X, y, cv=5, scoring="accuracy")

print("各分割のスコア:", scores.round(4))
print("平均:", scores.mean().round(4))
各分割のスコア: [0.9825 0.9825 0.9737 0.9737 0.9912]
平均: 0.9807

先に全データを StandardScaler に通してから cross_val_score にかけると、検証用に取り分けた分割の平均・標準偏差が前処理を経由して学習側へ混ざります(データリーク)。このデータセットで実際に両方を測ると平均はどちらも0.9807で差が出ませんでした。差が出ないから安全という話ではなく、リークの影響量はデータ次第で事前には分からない、というのが要点です。手順として Pipeline に入れておけば、影響量を気にする必要そのものがなくなります。

GridSearchCVでハイパーパラメータを探す

ハイパーパラメータの候補を辞書で並べれば、交差検証つきの総当たり探索が回ります。

from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

X, y = load_wine(return_X_y=True)
grid = {"max_depth": [3, 5, None], "min_samples_leaf": [1, 3, 5]}

search = GridSearchCV(
    RandomForestClassifier(random_state=0), grid, cv=5, scoring="accuracy", n_jobs=-1
)
search.fit(X, y)

print("最良パラメータ:", search.best_params_)
print("最良スコア:", round(search.best_score_, 4))
最良パラメータ: {'max_depth': None, 'min_samples_leaf': 1}
最良スコア: 0.9833

この例は3×3の9通りを5分割交差検証で評価するので、学習は9×5=45回。さらに既定の refit=True によって、最良パラメータで全データを使った再学習が1回走るため、実際の fit 呼び出しは46回になります(RandomForestClassifier.fit を差し替えて計測)。この最後の1回があるおかげで search.best_estimator_ をそのまま予測に使えます。n_jobs=-1 は利用可能なCPUコアをすべて使う指定です。候補数が増えると計算量は掛け算で膨らむため、数十通りを超えるなら総当たりではなく RandomizedSearchCV(候補をランダムに間引く)や HalvingGridSearchCV(有望な候補に計算資源を寄せる)に切り替えます。GridSearchCV には Pipeline をそのまま渡せるので、前処理のパラメータも同時に探索できます。

Scikit-learnを選ぶべきでない場面

Scikit-learn は万能ライブラリではなく、開発チーム自身が扱わない領域を公式に線引きしています。ここを知らずに使い始めると、途中で行き止まりに当たります。

深層学習・強化学習は公式が対象外と明言

公式FAQは「Deep learning and reinforcement learning both require a rich vocabulary to define an architecture(中略) neither of these fit within the design constraints of scikit-learn」として、両者をスコープ外と明言しています。sklearn.neural_network モジュールは存在しますが、1.9.0 で中身を確認すると BernoulliRBMMLPClassifierMLPRegressor の3つだけで、同FAQは「このモジュールについてはバグ修正のみ受け付ける」と付記しています。ニューラルネットワークの構造を自分で組む場所ではない、ということです。画像・音声・テキストの生データを扱うなら PyTorchの特徴とTensorFlowとの違いを先に検討してください。

GPUは既定で非対応、Array API経由も実験段階

公式FAQは、GPU 対応を標準化するとハードウェア依存の重い依存関係が入り、既存アルゴリズムの再実装も必要になるため、インストールも保守も難しくなる、と説明しています。ただし完全に閉ざされてはいません。2023年以降、入力データを PyTorch 配列または CuPy 配列として渡す Array API 対応により、一部の推定器は GPU 上で動くようになりました。もっとも同FAQはこれを experimental(実験的)と位置づけており、対応する推定器も限定されたまま。数百万行規模の学習を GPU 前提で組むなら、Scikit-learn は選定から外すのが妥当な判断です。

数十万行超の勾配ブースティングは専用ライブラリが優位

表形式データであっても、行数が数十万を超えて勾配ブースティングの精度が要るなら LightGBM や XGBoost のほうが速く精度も出ます。Scikit-learn にも HistGradientBoostingClassifier があり中小規模なら十分ですが、大規模な順位学習のような用途では専用ライブラリが優位です(競馬予想AIでのLightGBMランキング学習の実装例)。それでも Scikit-learn を捨てずに済むのは、前処理・交差検証・グリッドサーチの枠組みだけを使い、モデル部分に外部ライブラリを差し込む構成が取れるためです。

Scikit-learn 1.9(2026年6月)の変更点

1.9.0 は2026年6月2日に公開されました。実務に効く変更は次の4点です。

  • コールバックAPIの追加(実験的)sklearn.callbackProgressBar(進捗バー表示)と ScoringMonitor(反復ごとにスコアを記録)が入りました。1.9.0 環境で両クラスの import が通ることを確認しています。対応する推定器は LogisticRegressionsolver="lbfgs" のときのみ)、GridSearchCVHalvingGridSearchCVHalvingRandomSearchCVRandomizedSearchCVPipelineStandardScaler の7つ。公式は「This API is experimental for now and may change without the usual deprecation cycle.」として、通常の非推奨期間を置かずに変更されうると明記しています
  • 疎行列インターフェースの切り替え:設定キー sparse_interface が追加され、sklearn.set_config(sparse_interface="sparray") とすると SciPy の sparse matrix ではなく sparse array を返すようになります
  • 閾値ごとの指標算出metrics.metric_at_thresholds が追加され、取りうるすべての閾値での指標値をまとめて計算できます
  • narwhals への依存追加:DataFrame の入出力サポートを共通化するための軽量ライブラリが依存に加わりました

変更点の完全な一覧は公式のリリースノート(What's new for version 1.9)に載っています。API は約3か月ごとに更新されるため、コードを書く前にインストール済みの版と手元のドキュメントの版が一致しているかを確認してください。バージョン間で挙動が変わる箇所については、公式ドキュメントを実際に使っている版に切り替えて読むのが確実です。

よくある質問

Scikit-learnの読み方は?

公式FAQが「sy-kit learn」と示しています。カタカナ表記には公式の定めがなく、「サイキットラーン」「サイキット・ラーン」のどちらも使われています。

sklearnとscikit-learnは同じものですか?

同じライブラリですが、名前を使う場所が違います。Python コード内の import 名が sklearn、pip に渡すパッケージ名が scikit-learn です。pip install sklearn は 1.9.0 環境でエラー終了するので、requirements.txt の記述も後者に揃えてください。

Scikit-learnのバージョンを確認するには?

python -c "import sklearn; print(sklearn.__version__)" で版だけ、sklearn.show_versions() で依存ライブラリまで出ます。想定より古い版なら Python 側が要件を満たしていない可能性が高く、1.8 以降は Python 3.11 以上が必要です。

Scikit-learnでディープラーニングはできますか?

公式FAQが深層学習と強化学習をスコープ外と明言しているため、向きません。sklearn.neural_network に多層パーセプトロンはありますが、畳み込み層や再帰層といった構造の設計はできません。

Scikit-learnとPyTorch・TensorFlowはどう使い分けますか?

行と列に整理済みの表形式データを標準的なアルゴリズムで解くなら Scikit-learn。画像・音声・自然言語の生データを扱う、ネットワーク構造を自分で設計する、GPU で大規模に学習させる、のいずれかに当てはまるなら PyTorch や TensorFlow を選びます。

関連記事

資料請求

RELATED POSTS 関連記事