機械学習レポート
Section 1 機械学習の課題
1.要点
コンピュータプログラムは、タスクT(アプリケーションにさせたいこと)を性能指標Pで測定し、その性能が経験E(データ)により改善される場合、タスクTおよび性能指標Pに関して経験Eから学習すると言われている
教師あり学習 教師なし学習 半教師あり学習
教師あり学習はラベル付きデータを使って学習する方式
線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、サポートベクターマシン、ニューラルネットワーク、深層学習
教師なし学習はラベルなしテータからパターンや構造を発見する学習方式
K-means、主成分分析(PCA)、オートエンコーダー
半教師あり学習は、少量のラベル付きデータと大量のラベルを組み合わせて学習する方式。
自己訓練、協調訓練、ラベル伝播、FixMatch
学習データに対する予測と正解の誤差。学習データに対してどの程度に予測できるかを示す値。
未知のデータにたいする予測と正解の誤差。未知のデータに対してどの程度正確に予測できるかを示す値。
ホールドアウト法は元のデータセットを訓練データとテストデータに分割して機械学習モデルの汎化性能を評価する手法です。
K-分割交差検証法は、訓練データセットをランダムにk-1個をモデルの訓練に利用して、残りを性能の評価を行います。これより、全k回の評価結果を平均することで、モデルの性能を全体的に評価することができます。
過少適合:データの分布に対してモデルの次元が少なすぎる、機械学習モデルが学習データに十分に適合できず、学習データおよび未知のデータに対して十分な精度が得られない現象。
過剰適合:データの分布に対してモデルの次元が大きすぎる、またはデータ数が少ない、機械学習モデルが学習データに過剰に適合し、学習データに対しては高い精度な一方、未知のデータに対しては十分な精度が得られない現象
バイアスはモデルの予測が真の値からどの程度外れているかを計測するものです。高バイアスのモデルは、訓練データに対して適合度が低い、データのパターンを十分に学べていないため、過少適合の状態を示します。
バリアンスはモデルの予測がどの程度変動するか測定するものです、具体的には、異なる訓練データセットを使用してモデルを再訓練した際の予測の一貫性を示します。高いバリアンスのモデルは、訓練データに対して過度適合状態を示します。
機械学習モデルの過剰適合を抑制する方法。モデルのパラメータが複雑になりすぎないように、制約を加えた状態で学習させる。正則化の方法は様々であり、解きたい問題や手法によって異なる。
L1正則化(lasso正則化)
loss =\sum_{n=0}^N(y_n-f(x_n,w))^2 + a|w|
L2正則化(Ridge)
loss =\sum_{n=0}^N(y_n-f(x_n,w))^2 + a|w|^2
機械学習において、特徴量の次元の数が大きくなればなるほど正確にデータ数が指数関数的に増加した、結果として学習難しいなる現象。
Section 2 性能指標
1. 要点
ROC曲線は、分類予測の正確性を視覚的に示し、AUCから定量評価できる性能指標です。

2つの領域がどれくらい重なっているかをあらわす指標。物体検出やセグメンテーションのタスクで、正解の領域と予測の領域がどれくらい重なっているかをあらわす精度指標として使える
A:正解領域
B:予測領域
IoU=\frac{A \cap B}{A \cup B}=\frac{dxdy}{w_Ah_A + w_Bh_B-dxdy}
一般に、IoUが0.5を超える場合に、良いバウンディングボックスの予測結果であると判断されることが多い。
物体検出モデルおける精度
検出する各クラスについて、BoundingBoxが正しく予測できているか
IoU≧0.5ならTrue、それ以外ならFalseと予測する
例: 正解ラベル"A"のBoundingBox(以外BB)に対し、予測BBが以下の時
TP(True Positive): 予測BBのラベルが"A", IoU≧0.5
TN(True Negative): 定義されない(正解ラベルでない箇所を予測しなかった)
FP(False Postive): 予測BBのラベルが"A"、IoU<0.5
FN(False Negative): 正解BBがどの予測BBとも紐づいていない(あまり使わない)
mAP = \frac{1}{N} × \sum_{c = 1}^N(AP_c)
$N$:クラス数
$AP_c$:クラスのAverage Precision
$Precision = \frac{TP}{TP + FP}$
多クラスの分類タスクにおける性能指標には、micro平均とmarco平均があります。

2.実装演習
# 混同行列の実装を試してみる
import numpy as np
import matplotlib.pyplot as plt
data = {
"TP": 950,
"FP": 15,
"FN": 25,
"TN": 10
}
accuracy = (data["TP"] + data["TN"]) / (data["TP"] + data["FP"] + data["FN"] + data["TN"])
print(f"正解率: {round(accuracy, 4)}")
precision = (data["TP"]) / (data["TP"] + data["FP"])
print(f"適合率: {round(precision, 4)}")
recall = (data["TP"] / (data["TP"] + data["FN"]))
print(f"再現率: {round(recall, 4)}")
f = (2 * precision * recall) / (precision + recall)
print(f"F値: {round(f, 4)}")
# AUCROC曲線を実装してみよう
import numpy as np
import matplotlib.pyplot as plt
def roc_curve_numpy(y_true, y_score):
# スコアの降順でソート
desc_score_indices = np.argsort(-y_score)
y_true = y_true[desc_score_indices]
y_score = y_score[desc_score_indices] # 修正:- を = に
# 正例と負例の数
P = np.sum(y_true == 1)
N = np.sum(y_true == 0)
tpr = []
fpr = []
tp = 0
fp = 0
# 各閾値でTPR, FPRを計算
for y in y_true:
if y == 1:
tp += 1
else:
fp += 1
tpr.append(tp / P if P > 0 else 0)
fpr.append(fp / N if N > 0 else 0) # 修正:P を N に
# 原点(0,0)を追加
tpr = np.array([0.0] + tpr)
fpr = np.array([0.0] + fpr)
return fpr, tpr # 順序を逆に(慣例的にfpr, tpr)
def calculate_auc(fpr, tpr):
"""台形則でAUCを計算"""
auc = 0.0
for i in range(1, len(fpr)):
# 台形の面積 = (上底 + 下底) × 高さ / 2
auc += (tpr[i] + tpr[i-1]) * (fpr[i] - fpr[i-1]) / 2
return auc
# テストデータ
y_true = np.array([1 if x > 0.5 else 0 for x in np.random.rand(100)])
y_score = np.random.rand(y_true.shape[0])
print(f"Scores: {y_score}")
print(f"Positive samples: {np.sum(y_true == 1)}")
print(f"Negative samples: {np.sum(y_true == 0)}")
# ROC曲線を計算
fpr, tpr = roc_curve_numpy(y_true, y_score)
# AUCを計算
auc = calculate_auc(fpr, tpr)
# プロット
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, 'b-', linewidth=2, label=f'ROC curve (AUC = {auc:.3f})')
plt.plot([0, 1], [0, 1], 'r--', label='Random classifier')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (FPR)', fontsize=12)
plt.ylabel('True Positive Rate (TPR)', fontsize=12)
plt.title('ROC Curve', fontsize=14)
plt.legend(loc="lower right")
plt.grid(alpha=0.3)
plt.show()
print(f"\nAUC: {auc:.4f}")
Section 3 線形回帰モデル
1.要点
ある入力(離散あるいは連続値)から出力(連続値)を予測する問題
2.実装演習
numpyを使って線形回帰を実装してみる
# %%
from sklearn.datasets import fetch_california_housing
california_housing = fetch_california_housing()
print(california_housing["DESCR"])
# %%
import pandas as pd
california_housing_pd = pd.DataFrame(california_housing.data, columns=california_housing["feature_names"])
california_housing_pd["MedPrice"] = california_housing["target"]
california_housing_pd.head(10)
# %%
california_housing_pd[["MedInc", "MedPrice"]].head(10)
# %%
data = california_housing_pd.loc[:, ["MedInc", "AveRooms"]].to_numpy()
data[0 : 5]
# %%
target = california_housing_pd.loc[:, ["MedPrice"]].to_numpy()
target[0 : 5]
# %%
import numpy as np
class LinearRegression:
def __init__(self):
self.W = None
def fit(self, data: np.ndarray, target: np.ndarray):
# 1次元の場合は列ベクトルに変換
if target.ndim == 1:
target = target.reshape(-1, 1)
# 最小二乗法 (XᵀX)^(-1)Xᵀy
self.W = np.linalg.inv(data.T.dot(data)).dot(data.T).dot(target)
print(self.W)
def predict(self, test_data: np.ndarray) -> np.ndarray:
if self.W is None:
raise ValueError("モデルがまだ訓練されていません。先に fit() を呼び出してください。")
y_hat = test_data.dot(self.W)
return y_hat
# %%
from sklearn.model_selection import train_test_split
model = LinearRegression()
train_data, test_data, train_target, test_target = train_test_split(data, target, train_size=50, test_size=50)
model.fit(train_data, train_target)
y_hat = model.predict(test_data)
print(y_hat.T)
print(test_target.T)
# %%
import matplotlib.pyplot as plt
if train_data.shape[1] == 2:
train_x = train_data[:, [0]].reshape(-1, )
train_y = train_data[:, [1]].reshape(-1, )
train_z = train_target.reshape(-1, )
test_x = test_data[:, [0]].reshape(-1, )
test_y = test_data[:, [1]].reshape(-1, )
test_z = test_target.reshape(-1, )
predict_z = y_hat.reshape(-1, )
fig = plt.figure()
ax = fig.add_subplot(projection="3d")
ax.scatter(train_x, train_y, train_z, color='blue', label='train_data')
ax.scatter(test_x, test_y, test_z, color='green', label='test_data')
ax.scatter(test_x, test_y, predict_z, color='red', label='predict_data')
ax.set_title("LinearRegression")
ax.set_xlabel("data(MedInc)")
ax.set_ylabel("data(AveRooms)")
ax.set_zlabel("target(MedPrice)")
ax.set_xlim3d(0, 12)
ax.set_ylim3d(0, 12)
ax.set_zlim3d(0, 12)
ax.legend()
if train_data.shape[1] == 1:
plt.figure(figsize=(8, 5))
plt.scatter(train_data, train_target, color='blue', label='train_data')
plt.scatter(test_data, test_target, color="green", label="test_data")
plt.scatter(test_data, y_hat, color='red', label='predict_data')
plt.xlabel("data(MedInc)")
plt.ylabel("target(MedPrice)")
plt.xlim(0, 15)
plt.ylim(0, 10)
plt.title("LinearRegression")
plt.legend()
plt.grid(True)
plt.show()
Section 4 非線形回帰モデル
1.要点
複雑な非線形構造を内在する現象に対して、非線形回帰モデリングを実質
\hat y = w_0 + w_1\phi(x) + w_2\phi(x) ... + w_m\phi_m(x)
例
y = w_0 + w_1x + w_2x^2 + w_3x^3(3次関数)
y = w_0 + w_1sin(x) + w_2(cosx) + w_3log(x)
$\phi(x)$はxの任意の関数。基底関数という
例
\phi(x) = x^2
\phi(x) = x^3
\phi(x) = sin(x)
\phi(x) = log(x)
\sum_{i = 1}{N}(y_i - \hat y_i)^2
行列式で書くと
||y−Φw||^2 = (y−Φw)^T(y−Φw) = y^Ty−2y^TΦw+w^TΦ^TΦw
wで微分した
\frac{\partial}{\partial w}||y−Φw||^2=0
−2y^TΦ+2Φ^TΦw=0
w = (Φ^TΦ)^{−1}Φ^Ty
モデルが過学習すると、訓練データにはよく合うものの、未知のデータに対する予測性能が下がります。
これを防ぐために、損失関数に「重みに対する罰則項」を追加する方法が 正則化 です。
L1 正則化(Lasso):重みの“絶対値”(一次)を加える
L2 正則化(Ridge):重みの“二乗”(二次)を加える
L1 正則化では、重みが 0 になりやすく(スパース化) 特徴量選択の効果があります。
L_{L1} = \frac{1}{2m} \sum_{j=1}^{m}(y_i - \hat y)^2 + \lambda \sum_{i = 0}^{n}|w_i|
L_{L2} = \frac{1}{2m} \sum_{j=1}^{m}(y_i - \hat y)^2 + \lambda \sum_{i = 0}^{n}|w_i|^2
Section 5 ロジスティック回帰
1.要点
分類問題を解くための教師あり機械学習モデル(教師データから学習)
入力とm次元パラデータの線形結合をシグモイド関数に入力
出力はy=1になる確率の値になる
P(Y = 1|x) = \sigma(w_0 + w_1x_1 + ... + w_mx_m)
あるデータが得られた時、それが同時に得られる確率
確率変数は独立であることを仮定すると、それぞれの確率の掛け算となる
データは固定し、パラメータを変化させる
尤度関数を最大化するようなパラメータを選ぶ推定方法を最尤推定という

反復学習によりパラメータを逐次的に更新するアプローチの一つ
$\eta$は学習率と呼ばれるハイパーパラメータでモデルのパラメータの収束しやすさを調整


Section 6 パータン認識
1. 要点
与えられた特徴量から新たな特徴量(主成分)を作り出し、元の特徴量よりも少ない数の変数(次元)でデータを説明する

教師あり学習
識別したいサンプルと訓練サンプルの距離計算を行い、近傍k個のデータポイントを見つけ、それらの多数決で結果を決定します。
近似最近傍探索 計算量の削減
空間のパーディションニングによる最適化(kd-tree)
値が近いものだけの距離計算を行う
kd-tree
k次元空間にある点を分類する空間分割データ構造
空間の探索(範囲探索・最近傍探索 など)に用いられる
kd-treeの構築
k次元空間のデータに対して実行する
1つ目の次元について、中央値などでデータ集合を分割
次の次元に、同様にデータ集合を分割
これを繰り返し空間を分割する

教師なし学習
クラスタリング手法
与えられたデータをK個のクラスに分類する
アルゴリズム
- 各クラス中心の初期値を設定する
- 各データ点に対して、各クラス中心との距離を計算する
- 各クラスの平均ベクトル(中心)を計算する
- 収束するまで2,3の処理を繰り返す
K-meansはK-meansの初期セントロイド選択改良した手法です、最初のセントロイドを選ぶデータポイントからランダムに一つを選び、残りセントロイド前のセントロイドを最も遠いのデータポイントを選択する
k-means法では初めのセントロイドの位置が近い場合、うまく分類できないケース解決する改良された手法です。
【参考文献】
<< 書籍 >>
1.機械学習(1)、Tatsuro Fukuda (日本電子専門学校 2025)
2.ディープラーニングE資格精選問題集、小林範久、小林寛幸
















