はじめに: データが十分ではない場合
機械学習ではデータがすべてです。しかし、多くの場合、データセットが十分ではありません。 e アンバランスな (あるクラスには他のクラスよりもはるかに多くのチャンピオンがいます)。そこには 日付 増強 データセットを人工的に拡張して、 既存のサンプルから始まる新しいサンプル。これらのテクニックの背後にある数学は次のとおりです。 幾何学的変換 all'統計的補間.
何を学ぶか
- 画像の幾何学的変換: 回転、反転、拡大縮小
- Mixup と CutMix: サンプル間の補間
- SMOTE: 少数派クラスの合成オーバーサンプリング
- テキストと時系列の拡張
- 生成モデル: 合成データ用の GAN および VAE
- 増強が役立つ場合と害を及ぼす場合
画像の幾何学的変換
幾何学的変換は、拡張の最も単純かつ直感的な形式です。毎 変換は次のように表現できます。 変換行列 適用された ピクセル座標に変換します。
回転
1 つの角度の回転 \\シータ 2D 平面内:
スケーリング(ズーム)
一般的なアフィン変換
同次座標での回転、スケーリング、平行移動、およびせん断を組み合わせる:
import numpy as np
def rotate_image(image, angle_deg):
"""Rotazione di un'immagine (semplificata per array 2D)."""
angle_rad = np.radians(angle_deg)
cos_a, sin_a = np.cos(angle_rad), np.sin(angle_rad)
# Matrice di rotazione
R = np.array([[cos_a, -sin_a],
[sin_a, cos_a]])
h, w = image.shape[:2]
center = np.array([h/2, w/2])
# Crea immagine ruotata
rotated = np.zeros_like(image)
for i in range(h):
for j in range(w):
coords = np.array([i, j]) - center
src = R.T @ coords + center
si, sj = int(round(src[0])), int(round(src[1]))
if 0 <= si < h and 0 <= sj < w:
rotated[i, j] = image[si, sj]
return rotated
def augment_batch(images, labels):
"""Applica augmentation casuale a un batch."""
augmented_images = []
augmented_labels = []
for img, label in zip(images, labels):
augmented_images.append(img)
augmented_labels.append(label)
# Flip orizzontale (50% probabilità)
if np.random.random() > 0.5:
augmented_images.append(np.fliplr(img))
augmented_labels.append(label)
# Flip verticale (30% probabilità)
if np.random.random() > 0.7:
augmented_images.append(np.flipud(img))
augmented_labels.append(label)
# Rumore gaussiano
if np.random.random() > 0.5:
noise = np.random.normal(0, 0.05, img.shape)
augmented_images.append(np.clip(img + noise, 0, 1))
augmented_labels.append(label)
return np.array(augmented_images), np.array(augmented_labels)
# Esempio
np.random.seed(42)
batch = np.random.rand(4, 8, 8) # 4 immagini 8x8
labels = np.array([0, 1, 0, 2])
aug_images, aug_labels = augment_batch(batch, labels)
print(f"Originale: {batch.shape[0]} immagini")
print(f"Augmentato: {aug_images.shape[0]} immagini")
ミックスアップ: サンプル間の補間
取り違え サンプルのペア間を線形補間して新しいサンプルを作成します 既存 (入力とラベルの両方):
どこ \\lambda \\sim \\text{ベータ}(\\アルファ, \\アルファ) con \\アルファ \\in (0, \\infty)。通常 \\アルファ = 0.2 (軽い混合物)。
それは機能するので: Mixup は正則化機能として機能し、モデルに次のことを強制します。 サンプル全体にわたる線形予測。オーバーフィッティングを軽減し、キャリブレーションを改善します。
import numpy as np
def mixup(X, y, alpha=0.2):
"""Mixup data augmentation."""
n = X.shape[0]
# Lambda dalla distribuzione Beta
lam = np.random.beta(alpha, alpha, size=n)
# Permutazione casuale per il secondo campione
indices = np.random.permutation(n)
# Per feature multidimensionali, reshape lambda
lam_x = lam.reshape(-1, *([1] * (X.ndim - 1)))
# Interpolazione
X_mix = lam_x * X + (1 - lam_x) * X[indices]
y_mix = lam * y + (1 - lam) * y[indices]
return X_mix, y_mix
# Esempio con one-hot labels
X = np.random.randn(100, 10) # 100 campioni, 10 feature
y = np.eye(3)[np.random.randint(0, 3, 100)] # One-hot, 3 classi
X_mix, y_mix = mixup(X, y, alpha=0.2)
print(f"Campione originale y[0]: {y[0]}")
print(f"Campione mixup y_mix[0]: {np.round(y_mix[0], 3)}")
print(f"Somma label mixup: {y_mix[0].sum():.4f}") # Deve essere ~1
CutMix: カットアンドペースト
カットミックス 画像から長方形の領域を切り取り、それを 別の対応する領域。ラベルは面積に比例します。
どこ r_w、r_h 切り取られた領域の幅と高さです。 e W、H 画像の寸法。
SMOTE: 少数派クラスのオーバーサンプリング
リモート (合成少数派オーバーサンプリング技術) 合成サンプルを生成します 既存のサンプルと彼らのサンプルの間を補間することによる少数派クラスの場合 k 最も近い隣人:
どこ \\mathbf{x}_{nn} そしてその中の偶然の隣人 k-最も近い隣人による \\mathbf{x}_i.
SMOTE を使用する場合: 不均衡なクラス (不正、診断) を含む表形式データセットの場合 医療、異常)。画像 (より良い焦点損失またはクラスの重み) には使用しないでください。また、適用しないでください。 テスト セットへ (トレーニングのみ)。
import numpy as np
from sklearn.neighbors import NearestNeighbors
def smote(X_minority, n_synthetic, k=5):
"""SMOTE: genera campioni sintetici dalla classe minoritaria."""
n_samples = X_minority.shape[0]
k_actual = min(k, n_samples - 1)
# Trova k nearest neighbors
nn = NearestNeighbors(n_neighbors=k_actual + 1)
nn.fit(X_minority)
distances, indices = nn.kneighbors(X_minority)
synthetic = []
for _ in range(n_synthetic):
# Scegli un campione casuale
idx = np.random.randint(0, n_samples)
# Scegli un vicino casuale (escludi se stesso: indice 0)
nn_idx = indices[idx, np.random.randint(1, k_actual + 1)]
# Interpola
lam = np.random.random()
new_sample = X_minority[idx] + lam * (X_minority[nn_idx] - X_minority[idx])
synthetic.append(new_sample)
return np.array(synthetic)
# Dataset sbilanciato: 100 classe 0, 10 classe 1
np.random.seed(42)
X_majority = np.random.randn(100, 5) + np.array([2, 0, 0, 0, 0])
X_minority = np.random.randn(10, 5) + np.array([-2, 0, 0, 0, 0])
# Genera 90 campioni sintetici per bilanciare
X_synthetic = smote(X_minority, n_synthetic=90, k=5)
X_balanced = np.vstack([X_majority, X_minority, X_synthetic])
y_balanced = np.array([0]*100 + [1]*10 + [1]*90)
print(f"Originale: classe 0={100}, classe 1={10}")
print(f"Bilanciato: classe 0={100}, classe 1={100}")
print(f"Shape bilanciato: {X_balanced.shape}")
テキストの拡張
テキスト データの場合、主な手法は次のとおりです。
- 同義語の置換: 単語を同義語に置き換えます
- ランダム挿入: 同義語をランダムな位置に挿入します
- ランダムスワップ: 単語の位置を入れ替えます
- ランダム削除:ランダムな単語を確率で削除します p
- 逆翻訳: 別の言語に翻訳して返します (EN -> FR -> EN)
時系列の拡張
時系列データの具体的な手法:
ジッタリング (ガウス ノイズ)
タイムワープ
ランダムな単調関数で時間軸を歪め、加速または減速します。 シリーズの一部。
ウィンドウのスライス
ランダムな長さのサブシーケンスを抽出します w < T そして 元の長さに再スケールします。
合成データの生成モデル
GAN (敵対的生成ネットワーク)
発電機 G そして識別子 D ミニマックスゲームで競う:
G ノイズから偽のデータを生成する z, D 本物と偽物を区別しようとします。 平衡状態では、 G 実際のデータと区別できないサンプルを生成します。
VAE (変分オートエンコーダー)
VAE 損失は、潜在空間の再構築と正則化を組み合わせたものです。
最初の項は再構成の質であり、2 番目の項は潜在空間を強制します。 標準ガウスになるため、新しいデータをサンプリングできるようになります。
拡張が機能する場合 (および機能しない場合)
作品:
- クラスあたりのサンプルが少ない小規模なデータセット
- セマンティクスを保持した変換 (自然な画像反転)
- アンバランス クラス (表形式の場合は SMOTE、画像の場合は Focal Loss + Augmentation)
動作しない、または破損の原因となります:
- セマンティクスを変更する変換 (数字 6 と 9 の回転)
- 拡張が強すぎる (データが認識できないほど変形する)
- テストセットに拡張を適用する (データ漏洩)
- データはすでに豊富で多様化しています
まとめ
覚えておくべき重要なポイント
- 幾何学的変換: 回転行列、スケーリング、反転 - 画像拡張の基礎
- 取り違え: \\チルダ{x} = \\ラムダ x_i + (1-\\ラムダ) x_j - 補間による正則化
- リモート: マイノリティ クラスの隣接間を補間してバランスをとります
- ガン: リアルな合成データを生成するミニマックス ゲーム
- VAE: サンプリング可能な潜在空間の再構築 + KL 発散
- 黄金律: 拡張はセマンティクスを保持する必要があり、テスト セットには影響しません。
シリーズの完結編: この記事でシリーズは終了です 「AIのための数学と統計」。線形代数から基礎までをカバーしました。 情報理論、最適化からトランスフォーマー数学まで。あらゆるコンセプト NumPy 実装を使用した ML/AI の実用的なアプリケーションにリンクされています。これら 数学的基礎により、あらゆるアルゴリズムを深く理解できるようになります あなたが遭遇する機械学習の。







