0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

StudyAI E資格講座レポート(機械学習)

0
Last updated at Posted at 2025-12-15

機械学習レポート

Section 1 機械学習の課題

1.要点

  • 機械学習

コンピュータプログラムは、タスクT(アプリケーションにさせたいこと)を性能指標Pで測定し、その性能が経験E(データ)により改善される場合、タスクTおよび性能指標Pに関して経験Eから学習すると言われている

  • 機械学習の流れ

image.png

  • 機械学習の分類

image.png

教師あり学習 教師なし学習 半教師あり学習

教師あり学習はラベル付きデータを使って学習する方式
線形回帰、ロジスティック回帰、決定木、ランダムフォレスト、サポートベクターマシン、ニューラルネットワーク、深層学習

教師なし学習はラベルなしテータからパターンや構造を発見する学習方式
K-means、主成分分析(PCA)、オートエンコーダー

半教師あり学習は、少量のラベル付きデータと大量のラベルを組み合わせて学習する方式。

自己訓練、協調訓練、ラベル伝播、FixMatch

  • 訓練誤差

学習データに対する予測と正解の誤差。学習データに対してどの程度に予測できるかを示す値。

  • 汎化誤差

未知のデータにたいする予測と正解の誤差。未知のデータに対してどの程度正確に予測できるかを示す値。

  • ホールドアウト法、k-分割交差検証法

ホールドアウト法は元のデータセットを訓練データとテストデータに分割して機械学習モデルの汎化性能を評価する手法です。
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. 要点

image.png

  • 混同行列

image.png
image.png

  • ROC曲線

ROC曲線は、分類予測の正確性を視覚的に示し、AUCから定量評価できる性能指標です。
image.png

  • IoU(Insterection over Union)

2つの領域がどれくらい重なっているかをあらわす指標。物体検出やセグメンテーションのタスクで、正解の領域と予測の領域がどれくらい重なっているかをあらわす精度指標として使える
A:正解領域
B:予測領域

IoU=\frac{A \cap B}{A \cup B}=\frac{dxdy}{w_Ah_A + w_Bh_B-dxdy}

image.png

一般に、IoUが0.5を超える場合に、良いバウンディングボックスの予測結果であると判断されることが多い。

  • mAP(mean Average Precision)

物体検出モデルおける精度
検出する各クラスについて、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平均

多クラスの分類タスクにおける性能指標には、micro平均とmarco平均があります。
image.png

  • RMSE/MSE、MAE

image.png

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)}")

実行結果:
image.png

# 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}")

実行結果:
image.png

Section 3 線形回帰モデル

1.要点

  • 回帰問題

ある入力(離散あるいは連続値)から出力(連続値)を予測する問題

  • 線形回帰モデル

回帰問題解くための機械学習モデルの一つ
教師あり学習
image.png

  • パタメータの推定

image.png
image.png

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()

実行結果:
image.png

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)

image.png

  • パタメータを推定 最小二乗法

先ず行列式の表現形式に変換する
image.png
最小二乗法
誤差の計算

\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 正則化(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)
  • 同時確率 

あるデータが得られた時、それが同時に得られる確率
確率変数は独立であることを仮定すると、それぞれの確率の掛け算となる

  • 尤度関数

データは固定し、パラメータを変化させる
尤度関数を最大化するようなパラメータを選ぶ推定方法を最尤推定という
image.png

  • バイナリクロスエントロピー

image.png

  • 勾配降下法

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

Section 6 パータン認識

1. 要点

  • 主成分分析

与えられた特徴量から新たな特徴量(主成分)を作り出し、元の特徴量よりも少ない数の変数(次元)でデータを説明する
image.png

  • K近傍法

教師あり学習
識別したいサンプルと訓練サンプルの距離計算を行い、近傍k個のデータポイントを見つけ、それらの多数決で結果を決定します。

近似最近傍探索 計算量の削減
空間のパーディションニングによる最適化(kd-tree)
値が近いものだけの距離計算を行う

kd-tree
k次元空間にある点を分類する空間分割データ構造
空間の探索(範囲探索・最近傍探索 など)に用いられる

kd-treeの構築
k次元空間のデータに対して実行する
1つ目の次元について、中央値などでデータ集合を分割
次の次元に、同様にデータ集合を分割
これを繰り返し空間を分割する
image.png

  • K-means

教師なし学習
クラスタリング手法
与えられたデータをK個のクラスに分類する

アルゴリズム

  1. 各クラス中心の初期値を設定する
  2. 各データ点に対して、各クラス中心との距離を計算する 
  3. 各クラスの平均ベクトル(中心)を計算する
  4. 収束するまで2,3の処理を繰り返す
  • K-means++

K-meansはK-meansの初期セントロイド選択改良した手法です、最初のセントロイドを選ぶデータポイントからランダムに一つを選び、残りセントロイド前のセントロイドを最も遠いのデータポイントを選択する
k-means法では初めのセントロイドの位置が近い場合、うまく分類できないケース解決する改良された手法です。

  • 距離計算

image.png

【参考文献】

<< 書籍 >>
1.機械学習(1)、Tatsuro Fukuda (日本電子専門学校 2025)
2.ディープラーニングE資格精選問題集、小林範久、小林寛幸

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?