소개: 데이터가 충분하지 않은 경우
머신러닝에서는 데이터가 전부입니다. 하지만 종종 데이터세트가 충분하지 않거나 전자 불안정한 (한 클래스에는 다른 클래스보다 더 많은 챔피언이 있습니다). 거기 날짜 증강 데이터 세트를 인위적으로 확장하는 일련의 기술을 사용하여 기존 샘플에서 시작하는 새로운 샘플. 이러한 기술의 이면에 있는 수학은 다음과 같습니다. 기하학적 변환 에게통계적 보간.
무엇을 배울 것인가
- 이미지의 기하학적 변환: 회전, 뒤집기, 크기 조정
- Mixup 및 CutMix: 샘플 간 보간
- SMOTE: 소수 클래스를 위한 합성 오버샘플링
- 텍스트 및 시계열 확대
- 생성 모델: 합성 데이터를 위한 GAN 및 VAE
- 증강이 도움이 될 때와 해를 끼칠 때
이미지의 기하학적 변환
기하학적 변환은 가장 간단하고 직관적인 형태의 증강입니다. 매 변형은 다음과 같이 표현될 수 있다. 변환 행렬 적용됨 픽셀 좌표에.
회전
한 각도 회전 \\세타 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{Beta}(\\alpha, \\alpha) ~와 함께 \\알파 \\in (0, \\infty). 일반적으로 \\알파 = 0.2 (가벼운 혼합물).
작동하기 때문에: 혼합은 정규화 역할을 하여 모델이 다음을 수행하도록 합니다. 샘플 전반에 걸친 선형 예측. 과적합을 줄이고 보정을 향상시킵니다.
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 잘린 영역의 너비와 높이입니다. 전자 와트시 이미지의 크기.
SMOTE: 소수 클래스에 대한 오버샘플링
스모트 (Synthetic Minority Over-sampling Technique) 합성 샘플 생성 기존 샘플과 샘플 사이를 보간하여 소수 클래스에 대해 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 < 티 그리고 원래 길이로 다시 조정됩니다.
합성 데이터를 위한 생성 모델
GAN(생성적 적대 네트워크)
발전기 G 그리고 판별자 D 최소-최대 게임에서 경쟁하세요:
G 소음으로부터 잘못된 데이터 생성 z, D 진짜와 가짜를 구별하려고 노력하십시오. 평형 상태에서, G 실제 데이터와 구별할 수 없는 샘플을 생성합니다.
VAE(변형 자동 인코더)
VAE 손실은 잠재 공간의 재구성과 정규화를 결합합니다.
첫 번째 용어는 재구성의 품질이고 두 번째 용어는 잠재 공간을 강제합니다. 표준 가우스가 되어 새로운 데이터를 샘플링할 수 있습니다.
증강이 작동하는 경우(및 작동하지 않는 경우)
공장:
- 클래스당 샘플 수가 적은 소규모 데이터세트
- 의미 보존 변환(자연스러운 이미지 뒤집기)
- 불균형 클래스(표 형식의 경우 SMOTE, 이미지의 경우 초점 손실 + 확대)
작동하지 않거나 손상을 초래합니다.:
- 의미를 변경하는 변환(숫자 6과 9 회전)
- 너무 공격적인 확장(데이터를 인식할 수 없을 정도로 변형함)
- 테스트 세트에 확장 적용(데이터 유출)
- 이미 풍부하고 다양한 데이터
요약
기억해야 할 핵심 사항
- 기하학적 변환: 회전 행렬, 스케일링, 뒤집기 - 이미지 확대의 기초
- 혼동: \\tilde{x} = \\lambda x_i + (1-\\lambda) x_j - 보간을 통한 정규화
- 스모트: 소수 클래스 이웃 사이를 보간하여 균형을 유지합니다.
- GAN: 현실적인 합성 데이터를 생성하는 최소-최대 게임
- VAE: 샘플링 가능한 잠재 공간에 대한 재구성 + KL 발산
- 황금률: 기능 보강은 의미를 보존해야 하며 테스트 세트를 건드리지 않아야 합니다.
시리즈의 결론: 이 기사로 시리즈가 마무리됩니다. "AI를 위한 수학과 통계". 선형대수학부터 기초까지 다뤘습니다. 정보 이론, 최적화에서 변환기 수학까지. 모든 컨셉 NumPy 구현을 통해 ML/AI의 실제 애플리케이션에 연결되었습니다. 이것들 수학적 기초를 통해 모든 알고리즘을 깊이 이해할 수 있습니다. 당신이 접하게 될 머신러닝의







