Pythonを学び始めると、機械学習という言葉にどこかで必ず出会います。求人票にも入門書にも並んでいて、気になっている方は多いのではないでしょうか。
ただ、数学の話から入る解説が多くて、そこで手が止まってしまうことがあります。行列や微分が出てきた瞬間、自分にはまだ早いと感じてしまうものです。
実のところ、動かすだけならもっと手前から始められます。scikit-learnという道具を使えば、予測するプログラムは十数行で書けてしまいます。
この記事では、その道具の正体と、最初の一本を動かすまでの流れを順番にほどいていきます。
そもそも機械学習は、ふつうのプログラムと何が違うのか¶
道具の話に入る前に、考え方の違いを押さえておきましょう。ここが分かると、あとの説明がすんなり入ります。
ふだん私たちが書くプログラムは、手順を人間が決めます。この値が3000より大きければ高い、そうでなければ安い、という具合に条件を自分で書き込みます。
機械学習は、その手順のほうをデータから作らせる考え方です。人間が渡すのは、大量の実例と、それぞれの正解だけになります。
たとえば迷惑メールの判定を思い浮かべてください。怪しい単語を全部書き出して条件にするのは、数が多すぎて現実的ではありません。
そこで、迷惑メールと普通のメールを何万通も見せて、違いの傾向をつかませます。ルールを書く代わりに、ルールを見つけさせるのが機械学習です。
なぜこの分野でPythonがここまで使われているのか、その背景はこちらに書いています。【関連記事】なぜ、AI・機械学習はPythonなのか?——歴史と技術から読み解く決定的理由
scikit-learnは、機械学習の道具箱¶
では本題です。scikit-learnは、機械学習の定番の手法をPythonから呼び出せるようにまとめたライブラリです。
読み方はサイキットラーンで、名前のscikitはSciPy Toolkitの略にあたります。2007年に始まったプロジェクトで、いまも活発に開発が続いています。
中身は、データから規則を見つける手法の詰め合わせだと考えてください。分類、回帰、クラスタリングといった定番が、どれも同じ書き方で使えるように揃えられています。
土台にはNumPyとSciPyがあります。数値計算のいちばん重い部分は、そちらに任せる作りになっています。
配列計算がなぜ速いのかを先に知っておくと、内部の想像がつきやすくなります。【関連記事】PythonのNumPyとは?配列計算がリストより速くなる仕組みを初心者向けに解説
深層学習を扱うPyTorchなどとは、守備範囲が違います。画像や文章の複雑な処理は他に譲り、表形式のデータを手早く扱うのがscikit-learnの得意分野です。
インストールと、動かす準備¶
説明を読むより、手元で動いたほうが早いはずです。準備はコマンド1行で終わります。
入れ方と、必要なPythonのバージョン¶
ひとつ注意があります。パッケージの名前はscikit-learnですが、コードの中で書くときはsklearnという名前になります。
ここは誰もが一度は引っかかるところなので、先に頭に入れておいてください。
python -m venv venv
source venv/bin/activate
pip install scikit-learn
執筆時点の最新版は1.9.0で、2026年6月2日に公開されました。動かすにはPython 3.11以降が必要で、3.14まで対応しています。
入れると、NumPyやSciPyなど必要なライブラリも一緒に入ってきます。依存するものが多いので、プロジェクトごとに仮想環境を分けておくと後が楽です。
仮想環境という言葉がまだ曖昧なら、先にここを押さえておくと事故が減ります。【関連記事】Pythonの仮想環境(venv)って何のためにある?プロジェクトごとに混ぜない管理法
最初に覚える言葉は、ふたつだけ¶
用語が多いように見えますが、入口で必要なのはふたつです。特徴量と、目的変数と呼ばれるものになります。
特徴量は、予測の材料になる数値のことです。花びらの長さや幅、家の広さや築年数がこれにあたります。
目的変数は、当てたい答えのほうです。この花の品種は何か、この家はいくらか、という部分になります。
材料を渡すと答えが返ってくる。機械学習の道具は、結局のところこの形に落ち着きます。
十数行で、予測するプログラムを書いてみる¶
言葉の説明はこのくらいにして、実際に動かしてみましょう。scikit-learnには練習用のデータが同梱されているので、データを探す手間もかかりません。
ここではアヤメの花のサイズから品種を当てる、入門の定番を使います。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3, random_state=0
)
model = RandomForestClassifier(random_state=0)
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
これで学習から採点まで終わりです。実行すると0.9前後の数字が出て、7割のデータで学んだプログラムが、残り3割をどれだけ当てられたかが分かります。
数式は一度も出てきませんでした。中で何が起きているかを知るのは、動かしたあとでも遅くありません。
random_stateという引数は、乱数の出方を固定するためのものです。これを入れておくと、何度実行しても同じ結果になるので、学習中の確認がしやすくなります。
fitとpredictという、共通の作法¶
さきほどのコードで本当に大事なのは、実はメソッドの名前です。scikit-learnでは、どの手法を選んでも呼び出す名前が揃えられています。
学習させるときはfit、予測させるときはpredictを呼びます。採点したいときはscoreです。
この統一が、scikit-learnがここまで広まった理由のひとつだと言われています。手法を差し替えるときも、クラス名を書き換えるだけで済むからです。
試しに、RandomForestClassifierの部分をLogisticRegressionに変えてみてください。importの行以外は、そのままで動きます。
やりたいことと、よく使うクラスの対応を表にまとめておきます。
| やりたいこと | 呼び方 | よく使うクラス |
|---|---|---|
| どの種類かを当てる | 分類 | RandomForestClassifier、LogisticRegression |
| 数値を予測する | 回帰 | LinearRegression、RandomForestRegressor |
| 似たもの同士をまとめる | クラスタリング | KMeans |
| データの特徴を圧縮する | 次元削減 | PCA |
上の2つは、正解の付いたデータで学ばせる方法です。教師あり学習と呼ばれる分野で、実務でもここが中心になります。
下の2つは正解なしで、データそのものの形をつかみにいく方法です。最初は分類と回帰だけ触れば十分で、この2つで入口はだいたい足ります。
学習用とテスト用に分ける、これだけは外せない理由¶
先ほどのコードに、train_test_splitという行がありました。あれは、データを学習用とテスト用に切り分ける関数です。
なぜ分けるのでしょうか。答えを見ながら解いたテストでは、実力が測れないからです。
学習に使ったデータでそのまま採点すると、点数は不自然に高く出ます。本当に知りたいのは、初めて見るデータにどれだけ通用するかのほうです。
test_size=0.3は、全体の3割をテスト用に取っておくという指定になります。残りの7割で学び、取っておいた3割で採点する流れです。
ここで私の失敗も書いておきます。10年ほどエンジニアとして開発に関わってきましたが、機械学習を触り始めたころ、前処理の段階でテスト用のデータまで一緒に平均を計算していたことがありました。
手元の精度は99%を超えて、心の中でガッツポーズをしたのを覚えています。ところが本番のデータに当てると、まるで当たりませんでした。
答えがほんの少しだけ漏れていたのが原因でした。分けたデータは最後まで混ぜない、これは痛い目を見てようやく体に入った原則です。
1回の分割だけでは、運に左右される¶
分け方によって点数が上下することもあります。たまたま簡単なデータがテスト側に集まれば、点は高く出てしまいます。
そこで使うのが交差検証です。分け方を何通りか変えて採点し、その平均を見る方法になります。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, iris.data, iris.target, cv=5)
print(scores.mean())
cvは分割の数を表します。5にすると5回学習して5つの点数が返り、その平均が落ち着いた実力の目安になります。
数字が毎回ぶれると感じたら、まずここを試してみてください。1回きりの点数より、ずっと信用できます。
前処理までまとめてくれるPipeline¶
実務では、学習の前にデータを整える作業が必ず入ります。単位の違う数値を揃えたり、欠けている値を埋めたりする工程です。
この前処理と学習をひとつに包めるのが、Pipelineという仕組みになります。
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
model = make_pipeline(StandardScaler(), LogisticRegression())
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
StandardScalerは、数値の大きさを揃える前処理です。年収と年齢のように桁がまるで違う値が混ざっていても、同じ土俵に乗せられます。
包んでおく利点は、fitを呼んだときに前処理が学習用のデータだけで行われる点にあります。さきほど書いた私の失敗も、Pipelineを使っていれば起こりようがありませんでした。
書き方が少し増えるので、最初は面倒に感じるかもしれません。それでも、事故を仕組みで防げるほうが結局は速いというのが実感です。
データを渡す前の、下ごしらえの担当¶
scikit-learnに渡すデータそのものを用意するのは、pandasの役目です。CSVを読み、いらない列を落とし、数値に直すところまでを済ませてから渡します。
その流れは、実際に手を動かしながら追うのがいちばん早いです。【関連記事】pandas入門 データ処理をやってみよう
結果を眺めるときには、グラフも役に立ちます。予測が外れたところに偏りがないかは、数字の一覧より図のほうが早く気づけます。【関連記事】Pythonのmatplotlibとは?データをグラフにして見せる基本を初心者向けに解説
初学者がつまずきやすいところ¶
最後に、よく引っかかる点を3つ挙げておきます。どれも知っていれば数分で抜けられるものばかりです。
ひとつ目は、インストール名とimport名の食い違いです。入れるのはscikit-learn、書くのはsklearnでした。
ふたつ目は、文字列をそのまま渡してしまうことです。scikit-learnが受け取れるのは数値なので、性別や地域といった項目は先に数値へ直しておく必要があります。
みっつ目は、精度の数字だけを見て安心してしまうことです。100人に1人しか当てはまらない事象なら、全員にハズレと答えるだけで99%になってしまいます。
数字が高いときほど、一度立ち止まってみてください。その点数が何を意味しているかを自分の言葉で説明できるかが、実務では効いてきます。
どこから手をつければいいか¶
まずは、この記事のアヤメのコードをそのまま動かしてみてください。写経で構いません、動く実感が先にあると理解はずっと早く進みます。
次に、データを自分の手元のCSVに差し替えてみましょう。どの列を材料にして、何を当てたいのかを決める段階で、機械学習の考え方がぐっと近づいてきます。
理論はそのあとで足せます。順番を逆にすると、たいてい途中で力尽きてしまうものです。
まとめ¶
scikit-learnは、機械学習の定番手法を同じ書き方で使えるようにまとめたライブラリです。fitで学ばせて、predictで予測する。この形さえつかめば、手法が変わっても迷いません。
いちばん大事なのは、学習用とテスト用を最後まで混ぜないことでした。Pipelineを使えば、その事故は仕組みのほうで防げます。
最初の一本は、十数行で動きます。まずは手元で数字をひとつ出すところまで、今日のうちに進めてみてください。
ここまでお読みいただきありがとうございました。