LDA란?
LDA는 Linear Discriminant Analysis의 약어로 PCA와 같이 차원 축소의 방법 중 하나이다. 다만 비지도 학습 방식은 PCA와는 다르게 LDA는 지도 학습 방식의 차원 축소 기법으로, 데이터셋의 클래스 레이블을 이용하여 클래스 간의 정보를 최대화하는 방향으로 작동한다. PCA는 축 위에서의 데이터의 분산을 최대화한다는 점에서 차이가 있다. PCA는 전반적인 데이터의 구조나 패턴을 파악하는데 용이하다면, LDA는 클래스 레이블을 분류하는 문제에서 용이하다.
LDA의 원리
클래스 내의 분산은 최소화하고, 클래스 간의 분산은 최대화하는 방향으로 차원을 축소한다, 이는 클래스 간의 분리가 최대화될 수 있도록 한다. 두 조건을 만족하는 방향 벡터는 고유값 분해를 통해서 구하고 고유 벡터 방향에 대하여 데이터들을 투영하여 차원을 축소한다.
LDA의 장단점
장점
1. 효율적으로 차원을 축소하며 클래스 간의 거리가 고려되어 결과가 해석에 용이하다.
2. 계산량이 적고, 데이터셋에서도 잘 작동한다.
3. 노이즈에 강하다.
단점
1. LDA는 데이터가 정규 분포를 따르고 클래스 별로 공분산 행렬이 동일하다고 가정한다.
2. 선형성을 가정한다.
3. 이상치에 민감하다
LDA가 적용될 상황
클래스 간의 분리를 최대화하기 때문에 이진 분류나 다중 클래스 분류 문제에 적합하다. 또한 데이터가 정규 분포를 따르고, 고차원의 데이터여서 축소해야할 경우에도 적합하다.
LDA 실행 코드
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# LDA 모델 생성 및 학습
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)
# 예측 및 정확도 평가
y_pred = lda.predict(X_test)
accuracy = np.mean(y_pred == y_test)
print(f"Accuracy: {accuracy:.2f}")
# 변환된 데이터 확인
X_lda = lda.transform(X)
print("Transformed Data Shape:", X_lda.shape)
# 데이터프레임으로 변환
lda_columns = [f'lda{i+1}' for i in range(X_lda.shape[1])]
lda_df = pd.DataFrame(X_lda, columns = lda_columns)
# 시각화
plt.figure(figsize=(8, 6))
for class_value in np.unique(y):
plt.scatter(X_lda[y == class_value, 0],
X_lda[y == class_value, 1] if X_lda.shape[1] > 1 else np.zeros_like(X_lda[y == class_value, 0]),
label=f"Class {class_value}")
plt.title("LDA: Transformed Data")
plt.xlabel("LD1")
plt.ylabel("LD2" if X_lda.shape[1] > 1 else "")
plt.legend()
plt.grid()
plt.show()

LDA도 PCA와 마찬가지로 scree plot을 이용하여 차원을 결정한다.
explained_variance_ratio = lda.explained_variance_ratio_
# Scree Plot 그리기
plt.figure(figsize=(8, 6))
plt.plot(range(1, len(explained_variance_ratio) + 1), explained_variance_ratio, marker='o', linestyle='--')
plt.title('Scree Plot')
plt.xlabel('Linear Discriminants')
plt.ylabel('Explained Variance Ratio')
plt.xticks(range(1, len(explained_variance_ratio) + 1))
plt.grid()
plt.show()
분산의 증가율이 급격히 감소하는 지점과 완만해지는 부분을 찾는다. 이러한 지점을 elbow라 하는데 이를 기준으로 최적의 차원을 결정한다.
LDA는 선형 데이터에 대한 모델로 비선형 데이터에 대해서는 Kernel LDA를 사용하여야한다.
LDA는 모든 클래스가 동일한 분산을 가진다고 가정한다. 클래스 간의 분산의 차이가 클수록 LDA가 투영 방향을 적절하지 않은 방향으로 찾을 수 있다. 클래스 간의 분산 차이가 클 경우 QDA를 사용하는 것이 좋다. 또한 LDA는 정규 분포 가정을 따르기 때문에 데이터의 분포를 정규성에 맞게 변환하여야한다.
클래스 간의 불균형 문제에도 예민하다. 오버 샘플링이나 언더 샘플링을 통해서 불균형을 맞추는 것이 좋다.