学習コースLearn

機械学習

データからパターンを学び、予測や分類を行う機械学習の基礎を、概要から理論、評価、そして実際に動かせるコードまで、順を追って学ぶモジュールです。各ステップは「概要 → 仕組み(座学)→ コードで動かす」の3層で進みます。ページ内には手を動かせるデモを3つ用意しました。

この教材は日本語のみで提供していますThis learning material is available in Japanese only.

はじめにIntroduction

このモジュールの全体像

機械学習(machine learning)とは、明示的にルールを書き下す代わりに、データから規則性(パターン)を自動で学び取り、未知のデータに対して予測や判断を行う技術の総称です。迷惑メールの判定、商品のおすすめ、画像認識、需要予測など、身のまわりの多くのサービスがこの技術の上に成り立っています。

機械学習の多くの手法には、共通する処理の流れ(パイプライン)があります。まずデータを集め、モデルが扱える数値(特徴量)に整え、そのデータでモデルを学習させ、性能を評価し、良ければ新しいデータの予測に使います。

機械学習の基本パイプライン

データ Data 特徴量 Features 学習 Training 評価 Evaluation 予測 Prediction 数値・スケーリング 回帰・分類・クラスタリング 正解率・適合率・再現率

このモジュールは、上のパイプラインをたどりながら、機械学習の基礎を一つずつ身につけます。各ステップは次の3層で構成します。

  • 概要:その手法が何のためにあるのか、あらましをつかむ。
  • 仕組み(座学):背後にある理論・定義・式を、ていねいに理解する。
  • コードで動かす:Python の定番ライブラリ scikit-learn や、ページ内デモで実際に動かして確かめる。

手を動かす題材には、scikit-learn に内蔵された実在の公開データセット(Iris、Wine、Breast Cancer、diabetes など)や、ページ内の小さなサンプルだけを使います。特別な環境がなくても、読みながら試せる構成です。

1

機械学習とは

What is machine learning

概要Overview

ふつうのプログラムは、人間が「もし〜ならば〜する」というルールを一つずつ書きます。ところが、手書き数字の判定や迷惑メールの選別のように、ルールを言葉で書き尽くすのが難しい問題がたくさんあります。機械学習は発想を逆にして、正解つきの例(データ)をたくさん見せ、そこに潜む規則性をモデル自身に学ばせます。学んだモデルは、まだ見ていないデータにも予測を返せるようになります。

研究者アーサー・サミュエルは、機械学習を「明示的にプログラムしなくても学習する能力をコンピュータに与える研究分野」と表現しました。私たちは次のような場面で、すでにその成果に触れています。

  • 判定・分類:メールを迷惑/通常に、画像を犬/猫に振り分ける。
  • 予測(回帰):気温や過去の売上から、明日の需要を数値で予測する。
  • 推薦:視聴履歴から、次に見そうな動画を並べる。
  • グループ分け:顧客を似た者どうしにまとめる(クラスタリング)。

仕組みHow it works

機械学習は、与える教師(正解)の有無によって大きく3種類に分けられます。

  • 教師あり学習(supervised learning):入力と正解ラベルの組を学習します。目的が「離散のクラス」なら分類(classification)、「連続した数値」なら回帰(regression)です。迷惑メール判定は分類、住宅価格の予測は回帰です。
  • 教師なし学習(unsupervised learning):正解ラベルなしで、データ自体の構造を見つけます。似たものをまとめるクラスタリングや、情報を圧縮する次元削減が代表です。
  • 強化学習(reinforcement learning):試行錯誤しながら、報酬が最大になる行動を学びます。ゲームやロボット制御で使われます。

そして機械学習の本当の目的は、学習に使ったデータを丸暗記することではありません。まだ見ていない新しいデータでも正しく予測できること、すなわち汎化(generalization)こそが目標です。手元のデータに合わせすぎて汎化に失敗した状態を過学習と呼び、Step 5 でくわしく扱います。

この Step のまとめ

機械学習は、ルールを書く代わりにデータからパターンを学ばせる技術。教師あり(分類・回帰)・教師なし・強化学習に大別され、目標は手元のデータの暗記ではなく、未知のデータへの汎化です。次の Step からは、まず回帰を手を動かして学びます。

2

回帰:数値を予測する

Regression

概要Overview

回帰(regression)は、入力から連続した数値を予測する教師あり学習です。部屋の広さから家賃を、勉強時間からテストの点数を予測する、といった問題が当てはまります。最も基本的で、機械学習の考え方の土台になるのが線形回帰(linear regression)です。

仕組みHow it works

線形回帰と最小二乗法

入力が1つ(単回帰)のとき、線形回帰は点の集まりに1本の直線 y = a + b x を当てはめます。b は傾き、a は切片です。問題は「どの直線が一番よく当てはまるか」です。そこで各点について、実際の値 y と直線の予測値 ŷ とのズレ(残差)を考え、残差の二乗の合計を最小にする直線を選びます。これが最小二乗法(least squares)です。二乗するのは、正負のズレを打ち消し合わせず、大きなズレをより重く見るためです。

単回帰の最小二乗解は、次の式で求まります(数式的に一意に決まります)。

b = Σ(xi − x̄)(yi − ȳ) / Σ(xi − x̄)2  a = ȳ − b x̄ x̄, ȳ: x と y の平均 b: 傾き a: 切片。傾きは「x と y の共分散 / x の分散」に等しくなります。

損失関数(MSE)と勾配降下法

「当てはまりの悪さ」を測る関数を損失関数(loss function)と呼びます。回帰の定番は平均二乗誤差(MSE: Mean Squared Error)で、残差の二乗の平均です。

MSE = (1/n) Σ(yi − ŷi)2 n: データ数 yi: 実際の値 ŷi = a + b xi: 直線による予測値。値が小さいほど当てはまりが良い。

単回帰なら上の式で最適解が一発で求まりますが、特徴量が多い一般の場合には、損失を少しずつ小さくする勾配降下法(gradient descent)という反復法がよく使われます。損失関数の「傾き(勾配)」を計算し、損失が下がる向きへパラメータを少しずつ動かす、を繰り返します。1回にどれだけ動かすかを学習率(learning rate)と呼び、大きすぎると発散し、小さすぎるとなかなか収束しません。

当てはまりの良さ(決定係数 R²)

当てはまりを一つの数字で見たいときは決定係数 R²を使います。1 に近いほど良く、0 なら「常に平均値と答えるのと同じ」、負なら平均より悪い、という目安になります。

デモ 1Demo 1

線形回帰フィッター

1 行に 1 点を x, y の形で書きます(点は自由に追加・編集できます)。最小二乗法で直線 y = a + b x を当てはめ、傾き b・切片 a・MSE・R² を計算して、点と回帰直線を図に描きます。上の式のとおり b と a を求め、予測とのズレの二乗平均が MSE です。

例

コードで動かすRun the code

scikit-learn の LinearRegression を使うと、線形回帰は数行で書けます。まずは、上のデモと同じ小さな点で傾き・切片・MSE・R² を確認します。

Pythonlinear_regression.py
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 入力 X は 2次元(サンプル数 x 特徴量数)の形にする
X = np.array([1, 2, 3, 4, 5, 6]).reshape(-1, 1)
y = np.array([2.1, 3.9, 6.2, 7.8, 10.3, 11.7])

model = LinearRegression()
model.fit(X, y)
pred = model.predict(X)

print("slope     =", round(model.coef_[0], 3))
print("intercept =", round(model.intercept_, 3))
print("MSE       =", round(mean_squared_error(y, pred), 3))
print("R2        =", round(r2_score(y, pred), 3))
出力例 / Output
slope     = 1.966
intercept = 0.12
MSE       = 0.043
R2        = 0.996

より現実的な題材として、scikit-learn 内蔵の diabetes(糖尿病)データセット(442 人の患者、10 個の特徴量から1年後の病状の進行度を予測)で、多変数の線形回帰を試せます。API はまったく同じです。

Pythondiabetes_regression.py
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

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

model = LinearRegression().fit(X_tr, y_tr)
pred = model.predict(X_te)
print("MSE =", round(mean_squared_error(y_te, pred), 1))
print("R2  =", round(r2_score(y_te, pred), 3))
出力例 / Output
MSE = 3424.3
R2  = 0.332

R² が 0.33 ほどというのは「特徴量だけでは病状の進行度の3分の1程度しか説明できない」という意味で、現実のデータでは珍しくありません。ここから特徴量を工夫したり、より柔軟なモデルへ進んだりします。

この Step のまとめ

回帰は数値を予測する教師あり学習。線形回帰は最小二乗法で「残差の二乗和が最小の直線」を選び、当てはまりは MSE や R² で測ります。一般には勾配降下法で損失を少しずつ下げます。次は、数値ではなくクラスを当てる分類に進みます。

3

分類:クラスを当てる

Classification

概要Overview

分類(classification)は、入力をあらかじめ決めたクラス(種類)のどれかに振り分ける教師あり学習です。メールを迷惑/通常に、花の品種を3種のどれかに、腫瘍を良性/悪性に判定する、といった問題が当てはまります。ここでは代表的な3つの分類器の直感をつかみます。

仕組みHow it works

ロジスティック回帰

名前に「回帰」とありますが、分類のための手法です。線形回帰のように重みつきの和 z = w·x + b を作り、それをシグモイド関数 σ(z) = 1 / (1 + e−z) に通します。シグモイドは出力を必ず 0 から 1 の範囲に押し込むので、これを「クラス1である確率」と解釈できます。確率が 0.5 を超えたらクラス1、下回ればクラス0、という具合です。この「クラスの境目」を決定境界(decision boundary)と呼び、ロジスティック回帰では直線(高次元では平面)になります。

k近傍法(k-NN)

k近傍法(k-nearest neighbors)は、とても直感的な手法です。新しい点を分類するとき、特徴量空間で近くにある学習データ k 個を探し、その多数決でクラスを決めます。「似たものは同じ仲間」という素朴な考え方です。学習は「データを覚えるだけ」で、予測のときに近さを計算します。k を小さくすると境界が細かく(ノイズに敏感)、大きくすると滑らか(大まかな傾向を重視)になります。近さは通常ユークリッド距離で測るため、特徴量のスケールをそろえておくことが大切です。

決定木

決定木(decision tree)は、「この特徴量がこの値より大きいか?」というYes/No の質問を枝分かれで重ね、葉にたどり着いたらそこのクラスを答えます。人間が読んで理解しやすいのが長所です。木を深くしすぎると学習データに合わせすぎる(過学習)ので、深さの制限などで抑えます。この決定木を多数束ねたのが、Step 6 で扱うランダムフォレストです。

デモ 2Demo 2

k近傍法(k-NN)

2 クラス(クラス A・クラス B)の学習データが平面上に置いてあります。スライダでクエリ点の位置と k(見る近傍の数)を変えると、クエリ点から最も近い k 個を線で結び、その多数決で予測クラスを表示します。k を変えると判定がどう変わるか試してください。

例

コードで動かすRun the code

実データで試すには、scikit-learn 内蔵の Iris(あやめ)データセットが定番です。3 品種のあやめ 150 本を、がく片・花びらの長さと幅(4 特徴量)から分類します。まずは k近傍法で分類してみましょう。

Pythoniris_knn.py
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

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

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_tr, y_tr)
print("accuracy =", round(knn.score(X_te, y_te), 3))
print("predict  =", knn.predict(X_te[:5]))
出力例 / Output
accuracy = 1.0
predict  = [2 2 0 0 1]

同じデータに、ロジスティック回帰も同じ枠組みで当てはめられます。分類器を差し替えるだけです。

Pythoniris_logreg.py
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

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

clf = LogisticRegression(max_iter=1000)
clf.fit(X_tr, y_tr)
print("accuracy =", round(clf.score(X_te, y_te), 3))
# 各クラスの予測確率も見られる
print(clf.predict_proba(X_te[:1]).round(3))
出力例 / Output
accuracy = 1.0
[[0.    0.035 0.965]]

この設定では、どちらもテストデータを完璧に分類できました(正解率 1.0)。predict_proba は「各クラスである確率」を返し、この例では 3 番目のクラスに 0.965 の確信を持っていると読めます。ただし、正解率だけを見て安心するのは危険です。次の Step でくわしい評価に進みます。

この Step のまとめ

分類はクラスを当てる教師あり学習。ロジスティック回帰はシグモイドで確率を出す線形モデル、k近傍法は「近い k 個の多数決」、決定木は Yes/No の質問の連鎖です。scikit-learn では分類器を差し替えるだけで比較できます。

4

モデル評価

Model evaluation

概要Overview

モデルを作ったら、「どれくらい使えるのか」を正しく測らなければなりません。ここを間違えると、実際には役に立たないモデルを「良い」と勘違いしてしまいます。評価は機械学習で最も重要な工程の一つです。

仕組みHow it works

学習データと検証データの分割

モデルの本当の実力は、学習に使っていないデータで測ります。学習データで測ると、丸暗記したモデルほど高得点になり、汎化性能が見えないからです。そこでデータを学習用(train)と検証用(test)に分割し、train で学習し、test で評価します。分類では、クラスの比率を分割の前後で保つ層化抽出(stratify)を使うのが定番です。

混同行列

2 クラス分類(陽性 / 陰性)の結果は、混同行列(confusion matrix)にまとめると見通しがよくなります。予測と正解の組み合わせを、次の4つに数えます。

  • TP(真陽性):陽性を正しく陽性と予測。
  • FP(偽陽性):陰性なのに陽性と予測(誤検知)。
  • FN(偽陰性):陽性なのに陰性と予測(見逃し)。
  • TN(真陰性):陰性を正しく陰性と予測。

評価指標

「正解率(accuracy)」だけでは不十分な場合があります。たとえば 99% が陰性のデータでは、全部を陰性と答えるだけで正解率 99% になってしまいます。そこで次の指標を組み合わせて見ます。

  • 正解率(accuracy):全体のうち正しく当てた割合。(TP + TN) / 全体。
  • 適合率(precision):陽性と予測したうち、本当に陽性だった割合。TP / (TP + FP)。誤検知を嫌う場面で重視。
  • 再現率(recall):本当の陽性のうち、正しく拾えた割合。TP / (TP + FN)。見逃しを嫌う場面で重視。
  • F値(F1):適合率と再現率の調和平均。2PR / (P + R)。両者のバランスを 1 つの数字で表す。

適合率と再現率は、多くの場合トレードオフの関係にあります(片方を上げると片方が下がる)。しきい値を動かしたときの真陽性率(=再現率)と偽陽性率(陰性のうち誤って陽性と判定した割合)の関係を1枚のグラフにしたのが ROC 曲線で、その下の面積を AUC と呼び、1 に近いほど良い分類器という目安になります。なお、適合率と再現率の関係をそのまま描いた図は PR 曲線(Precision-Recall 曲線)と呼び、陽性がまれなデータではこちらのほうが差が見えやすいことがあります。

交差検証

train/test の1回の分割だけだと、たまたまの分かれ方で結果がぶれます。そこで、データを k 個に分け、1 個を検証・残りを学習として k 回評価し、平均を取るk分割交差検証(k-fold cross-validation)で、評価を安定させます。

デモ 3Demo 3

混同行列と評価指標

正解ラベルと予測ラベルを、それぞれ 1(陽性)と 0(陰性)の並びで書きます(空白・カンマ区切り、個数は同じにそろえてください)。TP / FP / FN / TN を数えて混同行列にし、正解率・適合率・再現率・F値を計算します。数字を書き換えて、指標がどう動くか確かめてください。

例

コードで動かすRun the code

scikit-learn には評価用の関数がそろっています。Breast Cancer(乳がん)データセット(569 件、良性/悪性の2クラス)で、混同行列とレポートを出してみます。

Pythonevaluate.py
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report

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, stratify=y)

clf = LogisticRegression(max_iter=5000).fit(X_tr, y_tr)
pred = clf.predict(X_te)

print(confusion_matrix(y_te, pred))
print(classification_report(y_te, pred, digits=2))
出力例 / Output
[[ 58   6]
 [  6 101]]
              precision    recall  f1-score   support

           0       0.91      0.91      0.91        64
           1       0.94      0.94      0.94       107

    accuracy                           0.93       171
   macro avg       0.93      0.93      0.93       171
weighted avg       0.93      0.93      0.93       171

1回の分割の結果に頼らず、交差検証で平均を取れば評価がより安定します。cross_val_score が便利です。

Pythoncross_val.py
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

X, y = load_breast_cancer(return_X_y=True)
clf = LogisticRegression(max_iter=5000)

# 5分割交差検証。指標は f1 を指定
scores = cross_val_score(clf, X, y, cv=5, scoring="f1")
print(scores.round(3))
print("mean =", round(scores.mean(), 3))
出力例 / Output
[0.953 0.958 0.986 0.944 0.964]
mean = 0.961

この Step のまとめ

評価は「学習に使っていないデータ」で行います。正解率だけでなく、混同行列(TP/FP/FN/TN)から適合率・再現率・F値を見て、目的に合う指標を選びます。交差検証で結果を安定させれば、より信頼できる評価になります。

5

過学習と正則化

Overfitting & regularization

概要Overview

Step 1 で、機械学習の目標は汎化だと述べました。ところがモデルは、しばしば学習データに合わせすぎて、新しいデータで失敗します。これが過学習(overfitting)です。過学習をどう見抜き、どう抑えるかが、実務での腕の見せどころです。

仕組みHow it works

過学習と未学習

過学習は、モデルが複雑すぎて、学習データのノイズや偶然のパターンまで覚え込んだ状態です。学習データでは高得点、検証データでは低得点という形で現れます。逆に、モデルが単純すぎてデータの傾向すら捉えられない状態を未学習(underfitting)と呼び、こちらは学習・検証の両方で成績が悪くなります。ちょうど良い複雑さを見つけるのが目標です。

バイアスとバリアンス

この綱引きはバイアスとバリアンスのトレードオフとして整理されます。バイアスはモデルの仮定が単純すぎて生じる系統的なズレ(未学習の原因)、バリアンスはデータの小さな違いで予測が大きくぶれる不安定さ(過学習の原因)です。片方を下げると他方が上がりやすく、両者の和を小さくする点を探します。

正則化(L1 / L2)

正則化(regularization)は、過学習を抑える代表的な方法です。損失関数に「パラメータ(重み)が大きくなりすぎることへの罰則」を加え、モデルが極端に複雑になるのを防ぎます。回帰では次の2つが有名です。

  • L2 正則化(Ridge 回帰):重みの二乗和を罰則に加える。重みを全体的に小さく抑え、なめらかなモデルにする。
  • L1 正則化(Lasso 回帰):重みの絶対値の和を罰則に加える。一部の重みをちょうど 0 にする性質があり、特徴量の自動選択にもなる。

罰則の強さはハイパーパラメータ(学習前に人が決める値)で調整します。強すぎれば未学習、弱すぎれば過学習になります。

ハイパーパラメータ調整と学習曲線

最適なハイパーパラメータは、候補を総当たりで試すグリッドサーチ(grid search)を交差検証と組み合わせて探すのが定番です。また、学習データ量や複雑さに対して、学習・検証の成績がどう変化するかを描いた学習曲線(learning curve)を見ると、過学習か未学習かを診断できます。

コードで動かすRun the code

まず、正則化なしの線形回帰と、L2 正則化つきの Ridge・L1 正則化つきの Lasso を、diabetes データで比べてみます。Lasso が一部の係数を 0 にする様子にも注目です。

Pythonridge_lasso.py
import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

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

for name, model in [("Linear", LinearRegression()),
                   ("Ridge ", Ridge(alpha=1.0)),
                   ("Lasso ", Lasso(alpha=0.1))]:
    model.fit(X_tr, y_tr)
    r2 = r2_score(y_te, model.predict(X_te))
    nz = np.sum(model.coef_ != 0)
    print(name, " R2 =", round(r2, 3), " nonzero coef =", nz)
出力例 / Output
Linear  R2 = 0.332  nonzero coef = 10
Ridge   R2 = 0.341  nonzero coef = 10
Lasso   R2 = 0.34  nonzero coef = 7

正則化の強さ alpha を、交差検証つきのグリッドサーチで自動的に選びます。GridSearchCV は、候補を総当たりし、交差検証のスコアが最も高い設定を選んでくれます。

Pythongrid_search.py
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

X, y = load_diabetes(return_X_y=True)
param_grid = {"alpha": [0.01, 0.1, 1.0, 10.0, 100.0]}

grid = GridSearchCV(Ridge(), param_grid, cv=5,
                    scoring="r2")
grid.fit(X, y)
print("best alpha =", grid.best_params_)
print("best R2    =", round(grid.best_score_, 3))
出力例 / Output
best alpha = {'alpha': 0.01}
best R2    = 0.481

この Step のまとめ

過学習は「学習データでは高得点、検証データでは低得点」。複雑さの綱引きがバイアスとバリアンスです。正則化(L2=Ridge, L1=Lasso)で重みを抑えて過学習を防ぎ、強さはグリッドサーチと交差検証で選びます。

6

アンサンブルとこれから

Ensembles & what comes next

概要Overview

ここまでは単体のモデルを見てきました。実務で表形式のデータに対して強いのが、多数のモデルを組み合わせるアンサンブル学習です。最後に、その代表とともに、教師なし学習と深層学習への橋渡しにも触れて、このモジュールを締めくくります。

仕組みHow it works

アンサンブル学習

アンサンブル(ensemble)は、「弱いモデルをたくさん束ねると、単体より強くなる」という考え方です。代表的な組み合わせ方が2つあります。

  • バギング(bagging):データを少しずつ変えながら多数のモデルを並列に作り、多数決や平均を取る。ばらつき(バリアンス)を抑える。
  • ブースティング(boosting):前のモデルが間違えたところを、次のモデルが重点的に補う形で、順番にモデルを足していく。

ランダムフォレスト(random forest)は、決定木のバギングに「使う特徴量もランダムに選ぶ」工夫を加えたもので、設定が少なくても安定して高い性能を出す定番です。勾配ブースティング(gradient boosting)はブースティングの代表で、表形式データのコンペで長く強さを発揮しています。

教師なし学習のさわり

正解ラベルがないデータからも学べます。k-means は、データを k 個のグループ(クラスタ)に分ける手法で、各点を最も近いクラスタ中心に割り当て、中心を更新する、を繰り返します。主成分分析(PCA)は、情報をなるべく保ちながら特徴量の次元を減らす手法で、可視化や前処理に使われます。

深層学習への橋渡し

ここまでの手法は、人が設計した特徴量を入力にします。いっぽう画像や音声、テキストのように生の信号が複雑な対象では、特徴量そのものを自動で学ぶ深層学習(ニューラルネットワーク)が力を発揮します。とはいえ、その土台にあるのは、このモジュールで学んだ「損失を定義し、勾配で少しずつ最適化し、汎化を評価する」という同じ考え方です。基礎をしっかり押さえたことが、次の学びを支えます。

コードで動かすRun the code

ランダムフォレストも、これまでと同じ枠組みで使えます。Wine(ワイン)データセット(178 件、3 品種を13 特徴量から分類)で試し、特徴量重要度も見てみましょう。

Pythonrandom_forest.py
import numpy as np
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

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

rf = RandomForestClassifier(n_estimators=200, random_state=0)
rf.fit(X_tr, y_tr)
print("accuracy =", round(rf.score(X_te, y_te), 3))
# 最も効いた特徴量の番号(重要度の高い順に3つ)
top = np.argsort(rf.feature_importances_)[::-1][:3]
print("top features =", top)
出力例 / Output
accuracy = 1.0
top features = [12  9  6]

この Step のまとめ

アンサンブル(バギング・ブースティング)は弱いモデルを束ねて強くします。ランダムフォレストや勾配ブースティングは表データの定番です。教師なし学習(k-means・PCA)や深層学習も、損失・最適化・汎化という同じ土台の上にあります。

まとめWrap-up

学びの振り返りと、さらに学ぶために

このモジュールでは、機械学習の基礎を、パイプラインに沿って順に手に入れました。

  • 機械学習とは:データからパターンを学び、未知のデータへ汎化することが目標。
  • 回帰:最小二乗で直線を当てはめ、MSE や R² で当てはまりを測る。
  • 分類:ロジスティック回帰・k近傍法・決定木でクラスを当てる。
  • モデル評価:混同行列から適合率・再現率・F値を見て、交差検証で安定させる。
  • 過学習と正則化:複雑さの綱引きを、L1/L2 正則化とグリッドサーチで調整する。
  • アンサンブル:ランダムフォレストなど、弱いモデルを束ねて強くする。

次に進むなら、下の道具と資料が役に立ちます。

公開データセット

  • Iris(あやめ):3 品種 150 本を4 特徴量で分類。load_iris。
  • Wine(ワイン):3 品種 178 件を13 特徴量で分類。load_wine。
  • Breast Cancer(乳がん):良性/悪性の2クラス 569 件。load_breast_cancer。
  • diabetes(糖尿病):回帰用、442 人・10 特徴量。load_diabetes。いずれも scikit-learn 内蔵。

ライブラリ

  • scikit-learn:学習・評価・前処理の定番。
  • NumPy:数値計算・配列演算の基盤。
  • pandas:表形式データの読み込みと整形。
  • matplotlib:結果の可視化。

参考書

  • 平井有三『はじめてのパターン認識』森北出版
  • Andreas C. Müller, Sarah Guido『Pythonではじめる機械学習』オライリー
  • Trevor Hastie ほか『The Elements of Statistical Learning』

次のモジュールへ

おつかれさまでした

ここで学んだ「損失を定義する → 最適化する → 汎化を評価する」という流れは、機械学習の多くの手法に共通する考え方です。手元のサンプルを書き換えて、3 つのデモをもう一度動かしてみてください。傾きや k、ラベルを変えると値がどう動くかを確かめると、理解がぐっと深まります。

発展トピックBeyond this module

このコースでは扱わない、関係する発展トピック

このモジュールでは、データからパターンを学ぶ「基礎の流れ」を扱いました。いっぽうで機械学習は、より高性能な手法や、モデルを理解・自動化する技術へと広がっています。ここでは、このコースでは踏み込まないものの、知っておくと視野が広がる発展的なトピックを、特に近年よく使われるものを中心に紹介します。深掘りは各自の興味に合わせてどうぞ。深層学習まわりは、深層学習のモジュールで改めて扱います。

高性能な木ベースの手法

  • 勾配ブースティング実装:XGBoost・LightGBM・CatBoost。表形式データで非常に強く、実務やコンペの定番。
  • サポートベクターマシン(SVM):マージン最大化とカーネル法で、非線形の決定境界も扱える古典的な強力手法。

次元削減と可視化

  • t-SNE・UMAP:高次元データを2次元へ落として可視化する非線形の手法。クラスタ構造の把握に役立つ。
  • PCA の発展:カーネル PCA や、行列分解にもとづく特徴抽出。

モデル解釈と最適化

  • モデル解釈:SHAP や特徴量重要度、部分依存プロットで「なぜその予測か」を説明する。
  • ハイパーパラメータ最適化:Optuna などによる効率的な探索(ベイズ最適化)。グリッドサーチの発展。
  • AutoML:モデル選択やハイパーパラメータ調整を自動化する枠組み。

学習設定の広がり

  • 半教師あり学習:少量のラベルつきと大量のラベルなしデータを併用する。
  • オンライン学習:データが少しずつ届く状況で、逐次的にモデルを更新する。
  • 深層学習への接続:生の信号から特徴量そのものを学ぶニューラルネット(深層学習のモジュールで扱います)。