bonggyulim 님의 블로그
추가로 알아두면 좋은 전처리: PCA, Vectorization, SMOTE 본문
전처리를 하다 보면 결측치 처리, 인코딩, 스케일링만으로 끝나지 않는 경우도 많다.
데이터 형태와 문제 유형에 따라 차원축소, 벡터화, 클래스 불균형 처리까지 함께 고려할 수 있다.
다만 이 기법들은 모든 문제에 무조건 사용하는 것이 아니라,
데이터 특성과 모델 목적에 맞게 선택적으로 적용해야 한다.
1. PCA
차원축소는 feature 수가 많을 때 정보를 최대한 유지하면서 차원을 줄이는 방법이다.
컬럼이 너무 많으면 학습 속도가 느려지고, 불필요한 노이즈가 많아질 수 있다.
이럴 때 대표적으로 PCA(Principal Component Analysis) 를 사용할 수 있다.
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train_standard)
X_test_pca = pca.transform(X_test_standard)
print("원본 shape:", X_train_standard.shape)
print("축소 후 shape:", X_train_pca.shape)
2. TF-IDF 벡터화
벡터화는 텍스트 데이터를 숫자 형태로 바꾸는 작업이다.
머신러닝 모델은 문자열 자체를 직접 처리하지 못하기 때문에,
문장을 단어 빈도나 중요도 기반의 숫자 벡터로 변환한 뒤 사용한다.
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train_text)
X_test_tfidf = tfidf_vectorizer.transform(X_test_text)
3. SMOTE
SMOTE는 클래스 불균형이 있는 분류 문제에서 소수 클래스를 늘려 학습 균형을 맞추는 방법이다.
예를 들어 정상 데이터는 많고 이상 데이터는 적다면, 모델이 다수 클래스를 중심으로만 학습할 가능성이 커진다.
이럴 때 SMOTE를 사용하면 소수 클래스를 보강할 수 있다.
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
X_train_cls, X_test_cls, y_train_cls, y_test_cls = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train_cls, y_train_cls)
print("원본 학습 데이터 분포:")
print(y_train_cls.value_counts())
print("SMOTE 적용 후 분포:")
print(y_train_smote.value_counts())
주의할 점
- 차원축소(PCA), 벡터화(TF-IDF/CountVectorizer)
→ 학습 데이터로만 fit 하고,
→ 테스트 데이터에는 transform만 한다. - SMOTE
→ 학습 데이터에만 적용해서 resample 한다.
→ 테스트 데이터에는 적용하지 않는다.
'AI dev > Machine Learning' 카테고리의 다른 글
| ML - 모델 학습 및 평가 (0) | 2026.04.04 |
|---|---|
| ML - 데이터 전처리 (0) | 2026.04.04 |