学習コースLearn
機械学習
データからパターンを学び、予測や分類を行う機械学習の基礎を、概要から理論、評価、そして実際に動かせるコードまで、順を追って学ぶモジュールです。各ステップは「概要 → 仕組み(座学)→ コードで動かす」の3層で進みます。ページ内には手を動かせるデモを3つ用意しました。
この教材は日本語のみで提供していますThis learning material is available in Japanese only.
はじめにIntroduction
このモジュールの全体像
機械学習(machine learning)とは、明示的にルールを書き下す代わりに、データから規則性(パターン)を自動で学び取り、未知のデータに対して予測や判断を行う技術の総称です。迷惑メールの判定、商品のおすすめ、画像認識、需要予測など、身のまわりの多くのサービスがこの技術の上に成り立っています。
機械学習の多くの手法には、共通する処理の流れ(パイプライン)があります。まずデータを集め、モデルが扱える数値(特徴量)に整え、そのデータでモデルを学習させ、性能を評価し、良ければ新しいデータの予測に使います。
機械学習の基本パイプライン
このモジュールは、上のパイプラインをたどりながら、機械学習の基礎を一つずつ身につけます。各ステップは次の3層で構成します。
- 概要:その手法が何のためにあるのか、あらましをつかむ。
- 仕組み(座学):背後にある理論・定義・式を、ていねいに理解する。
- コードで動かす:Python の定番ライブラリ scikit-learn や、ページ内デモで実際に動かして確かめる。
手を動かす題材には、scikit-learn に内蔵された実在の公開データセット(Iris、Wine、Breast Cancer、diabetes など)や、ページ内の小さなサンプルだけを使います。特別な環境がなくても、読みながら試せる構成です。
機械学習とは
What is machine learning概要Overview
ふつうのプログラムは、人間が「もし〜ならば〜する」というルールを一つずつ書きます。ところが、手書き数字の判定や迷惑メールの選別のように、ルールを言葉で書き尽くすのが難しい問題がたくさんあります。機械学習は発想を逆にして、正解つきの例(データ)をたくさん見せ、そこに潜む規則性をモデル自身に学ばせます。学んだモデルは、まだ見ていないデータにも予測を返せるようになります。
研究者アーサー・サミュエルは、機械学習を「明示的にプログラムしなくても学習する能力をコンピュータに与える研究分野」と表現しました。私たちは次のような場面で、すでにその成果に触れています。
- 判定・分類:メールを迷惑/通常に、画像を犬/猫に振り分ける。
- 予測(回帰):気温や過去の売上から、明日の需要を数値で予測する。
- 推薦:視聴履歴から、次に見そうな動画を並べる。
- グループ分け:顧客を似た者どうしにまとめる(クラスタリング)。
仕組みHow it works
機械学習は、与える教師(正解)の有無によって大きく3種類に分けられます。
- 教師あり学習(supervised learning):入力と正解ラベルの組を学習します。目的が「離散のクラス」なら分類(classification)、「連続した数値」なら回帰(regression)です。迷惑メール判定は分類、住宅価格の予測は回帰です。
- 教師なし学習(unsupervised learning):正解ラベルなしで、データ自体の構造を見つけます。似たものをまとめるクラスタリングや、情報を圧縮する次元削減が代表です。
- 強化学習(reinforcement learning):試行錯誤しながら、報酬が最大になる行動を学びます。ゲームやロボット制御で使われます。
そして機械学習の本当の目的は、学習に使ったデータを丸暗記することではありません。まだ見ていない新しいデータでも正しく予測できること、すなわち汎化(generalization)こそが目標です。手元のデータに合わせすぎて汎化に失敗した状態を過学習と呼び、Step 5 でくわしく扱います。
この Step のまとめ
機械学習は、ルールを書く代わりにデータからパターンを学ばせる技術。教師あり(分類・回帰)・教師なし・強化学習に大別され、目標は手元のデータの暗記ではなく、未知のデータへの汎化です。次の Step からは、まず回帰を手を動かして学びます。
回帰:数値を予測する
Regression概要Overview
回帰(regression)は、入力から連続した数値を予測する教師あり学習です。部屋の広さから家賃を、勉強時間からテストの点数を予測する、といった問題が当てはまります。最も基本的で、機械学習の考え方の土台になるのが線形回帰(linear regression)です。
仕組みHow it works
線形回帰と最小二乗法
入力が1つ(単回帰)のとき、線形回帰は点の集まりに1本の直線 y = a + b x を当てはめます。b は傾き、a は切片です。問題は「どの直線が一番よく当てはまるか」です。そこで各点について、実際の値 y と直線の予測値 ŷ とのズレ(残差)を考え、残差の二乗の合計を最小にする直線を選びます。これが最小二乗法(least squares)です。二乗するのは、正負のズレを打ち消し合わせず、大きなズレをより重く見るためです。
単回帰の最小二乗解は、次の式で求まります(数式的に一意に決まります)。
損失関数(MSE)と勾配降下法
「当てはまりの悪さ」を測る関数を損失関数(loss function)と呼びます。回帰の定番は平均二乗誤差(MSE: Mean Squared Error)で、残差の二乗の平均です。
単回帰なら上の式で最適解が一発で求まりますが、特徴量が多い一般の場合には、損失を少しずつ小さくする勾配降下法(gradient descent)という反復法がよく使われます。損失関数の「傾き(勾配)」を計算し、損失が下がる向きへパラメータを少しずつ動かす、を繰り返します。1回にどれだけ動かすかを学習率(learning rate)と呼び、大きすぎると発散し、小さすぎるとなかなか収束しません。
当てはまりの良さ(決定係数 R²)
当てはまりを一つの数字で見たいときは決定係数 R²を使います。1 に近いほど良く、0 なら「常に平均値と答えるのと同じ」、負なら平均より悪い、という目安になります。
線形回帰フィッター
1 行に 1 点を x, y の形で書きます(点は自由に追加・編集できます)。最小二乗法で直線 y = a + b x を当てはめ、傾き b・切片 a・MSE・R² を計算して、点と回帰直線を図に描きます。上の式のとおり b と a を求め、予測とのズレの二乗平均が MSE です。
コードで動かすRun the code
scikit-learn の LinearRegression を使うと、線形回帰は数行で書けます。まずは、上のデモと同じ小さな点で傾き・切片・MSE・R² を確認します。
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))
slope = 1.966
intercept = 0.12
MSE = 0.043
R2 = 0.996より現実的な題材として、scikit-learn 内蔵の diabetes(糖尿病)データセット(442 人の患者、10 個の特徴量から1年後の病状の進行度を予測)で、多変数の線形回帰を試せます。API はまったく同じです。
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))
MSE = 3424.3
R2 = 0.332R² が 0.33 ほどというのは「特徴量だけでは病状の進行度の3分の1程度しか説明できない」という意味で、現実のデータでは珍しくありません。ここから特徴量を工夫したり、より柔軟なモデルへ進んだりします。
この Step のまとめ
回帰は数値を予測する教師あり学習。線形回帰は最小二乗法で「残差の二乗和が最小の直線」を選び、当てはまりは MSE や R² で測ります。一般には勾配降下法で損失を少しずつ下げます。次は、数値ではなくクラスを当てる分類に進みます。
分類:クラスを当てる
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 で扱うランダムフォレストです。
k近傍法(k-NN)
2 クラス(クラス A・クラス B)の学習データが平面上に置いてあります。スライダでクエリ点の位置と k(見る近傍の数)を変えると、クエリ点から最も近い k 個を線で結び、その多数決で予測クラスを表示します。k を変えると判定がどう変わるか試してください。
コードで動かすRun the code
実データで試すには、scikit-learn 内蔵の Iris(あやめ)データセットが定番です。3 品種のあやめ 150 本を、がく片・花びらの長さと幅(4 特徴量)から分類します。まずは k近傍法で分類してみましょう。
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]))
accuracy = 1.0
predict = [2 2 0 0 1]同じデータに、ロジスティック回帰も同じ枠組みで当てはめられます。分類器を差し替えるだけです。
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))
accuracy = 1.0
[[0. 0.035 0.965]]この設定では、どちらもテストデータを完璧に分類できました(正解率 1.0)。predict_proba は「各クラスである確率」を返し、この例では 3 番目のクラスに 0.965 の確信を持っていると読めます。ただし、正解率だけを見て安心するのは危険です。次の Step でくわしい評価に進みます。
この Step のまとめ
分類はクラスを当てる教師あり学習。ロジスティック回帰はシグモイドで確率を出す線形モデル、k近傍法は「近い k 個の多数決」、決定木は Yes/No の質問の連鎖です。scikit-learn では分類器を差し替えるだけで比較できます。
モデル評価
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)で、評価を安定させます。
混同行列と評価指標
正解ラベルと予測ラベルを、それぞれ 1(陽性)と 0(陰性)の並びで書きます(空白・カンマ区切り、個数は同じにそろえてください)。TP / FP / FN / TN を数えて混同行列にし、正解率・適合率・再現率・F値を計算します。数字を書き換えて、指標がどう動くか確かめてください。
コードで動かすRun the code
scikit-learn には評価用の関数がそろっています。Breast Cancer(乳がん)データセット(569 件、良性/悪性の2クラス)で、混同行列とレポートを出してみます。
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))
[[ 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 1711回の分割の結果に頼らず、交差検証で平均を取れば評価がより安定します。cross_val_score が便利です。
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))
[0.953 0.958 0.986 0.944 0.964]
mean = 0.961この Step のまとめ
評価は「学習に使っていないデータ」で行います。正解率だけでなく、混同行列(TP/FP/FN/TN)から適合率・再現率・F値を見て、目的に合う指標を選びます。交差検証で結果を安定させれば、より信頼できる評価になります。
過学習と正則化
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 にする様子にも注目です。
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)
Linear R2 = 0.332 nonzero coef = 10
Ridge R2 = 0.341 nonzero coef = 10
Lasso R2 = 0.34 nonzero coef = 7正則化の強さ alpha を、交差検証つきのグリッドサーチで自動的に選びます。GridSearchCV は、候補を総当たりし、交差検証のスコアが最も高い設定を選んでくれます。
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))
best alpha = {'alpha': 0.01}
best R2 = 0.481この Step のまとめ
過学習は「学習データでは高得点、検証データでは低得点」。複雑さの綱引きがバイアスとバリアンスです。正則化(L2=Ridge, L1=Lasso)で重みを抑えて過学習を防ぎ、強さはグリッドサーチと交差検証で選びます。
アンサンブルとこれから
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 特徴量から分類)で試し、特徴量重要度も見てみましょう。
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)
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』
次のモジュールへ
- 深層学習(ニューラルネットの基礎)
- 大規模言語モデル(LLM)
- 統計分析(推定・検定・回帰の基礎)
おつかれさまでした
ここで学んだ「損失を定義する → 最適化する → 汎化を評価する」という流れは、機械学習の多くの手法に共通する考え方です。手元のサンプルを書き換えて、3 つのデモをもう一度動かしてみてください。傾きや k、ラベルを変えると値がどう動くかを確かめると、理解がぐっと深まります。
発展トピックBeyond this module
このコースでは扱わない、関係する発展トピック
このモジュールでは、データからパターンを学ぶ「基礎の流れ」を扱いました。いっぽうで機械学習は、より高性能な手法や、モデルを理解・自動化する技術へと広がっています。ここでは、このコースでは踏み込まないものの、知っておくと視野が広がる発展的なトピックを、特に近年よく使われるものを中心に紹介します。深掘りは各自の興味に合わせてどうぞ。深層学習まわりは、深層学習のモジュールで改めて扱います。
高性能な木ベースの手法
- 勾配ブースティング実装:XGBoost・LightGBM・CatBoost。表形式データで非常に強く、実務やコンペの定番。
- サポートベクターマシン(SVM):マージン最大化とカーネル法で、非線形の決定境界も扱える古典的な強力手法。
次元削減と可視化
- t-SNE・UMAP:高次元データを2次元へ落として可視化する非線形の手法。クラスタ構造の把握に役立つ。
- PCA の発展:カーネル PCA や、行列分解にもとづく特徴抽出。
モデル解釈と最適化
- モデル解釈:SHAP や特徴量重要度、部分依存プロットで「なぜその予測か」を説明する。
- ハイパーパラメータ最適化:Optuna などによる効率的な探索(ベイズ最適化)。グリッドサーチの発展。
- AutoML:モデル選択やハイパーパラメータ調整を自動化する枠組み。
学習設定の広がり
- 半教師あり学習:少量のラベルつきと大量のラベルなしデータを併用する。
- オンライン学習:データが少しずつ届く状況で、逐次的にモデルを更新する。
- 深層学習への接続:生の信号から特徴量そのものを学ぶニューラルネット(深層学習のモジュールで扱います)。