LDA(선형 판별 분석)
LDA(선형 판별 분석)는 고차원 데이터를 저차원으로 축소하는 데 사용되는 기법으로, 주로 분류 문제에서 데이터의 클래스를 가장 잘 구분할 수 있는 축을 찾는 데 초점을 맞춥니다.
이 방법은 클래스 간 분산은 최대화하고, 클래스 내 분산은 최소화하는 방식으로 작동합니다.
LDA는 데이터 내에 존재하는 클래스 간의 차이를 명확하게 하여 데이터의 시각화 및 해석을 용이하게 하며, 데이터의 복잡성을 감소시킵니다.
1. 데이터 전처리 및 표준화
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
# 데이터 읽어오기
train = pd.read_csv('train.csv')
# 일부 칼럼 제거
train = train.drop(['index', 'type'], axis = 1)
display(train.head())
# 독립 / 종속변수 설정
x_train = train.drop('quality', axis = 1)
y_train = train['quality']
# 데이터에 대한 표준화
scaler = StandardScaler()
scaler.fit(x_train)
scaled_train = scaler.transform(x_train)
2. LDA를 활용한 데이터 차원 축소 및 변환
선형 판별 분석(LDA)은 분류 문제를 위해 설계된 지도학습 기법입니다.
LDA의 주된 목적은 클래스 간 구분을 최대화하는 동시에 클래스 내 분산을 최소화 하는 특성 축을 찾는 것입니다.
이를 통해, 다차원 데이터를 저차원으로 효과적으로 축소하여 계산 효율성을 높입니다.
LDA는 각 클래스의 데이터를 가장 잘 구분하는 선형 결합을 찾아내며, 이는 분류를 위한 결정 경계를 설정하는 역할을 합니다.
LDA는 데이터의 분산을 최대화하는 방향을 찾는 PCA와 달리,
각 클래스에 속한 데이터 포인트의 레이블 정보를 활용 하여 분류 성능을 극대화하는 특성 축을 찾습니다.
위의 이미지는 임의로 생성된 2차원 데이터에 LDA와 PCA를 적용한 결과를 시각화한 것입니다.
원본 데이터(왼쪽 그림)에 두 차원 축소 기법을 적용했을 때, 그 효과는 뚜렷이 다릅니다.
PCA(오른쪽 그림)는 데이터의 분산을 최대화하는 주성분을 찾는 비지도 학습 방식으로 작동합니다.
그 결과, 데이터의 가장 큰 분산을 따라 데이터가 투영되지만, 클래스 간 구분은 반드시 최적화되지 않습니다.
이는 PCA가 주로 데이터의 구조를 파악하고 시각화하는 데 사용됨을 보여줍니다.
반면에 LDA(중앙 그림)는 지도 학습 방식으로, 클래스 레이블 정보를 사용하여 클래스 간 분리를 극대화합니다.
LDA는 클래스 내 분산을 최소화하고 클래스 간 분산을 최대화하는 방향으로 데이터를 투영합니다.
이는 분류 작업에 특히 유용하며, 중앙 그림에서 볼 수 있듯이 서로 다른 클래스가 잘 구분되도록 데이터를 선형적으로 분리합니다.
이렇게 서로 다른 방식으로 차원 축소를 수행하는 LDA와 PCA는 목적에 맞게 선택되어야 합니다.
PCA는 데이터의 주요 변동성을 강조하는 데 유용한 반면, LDA는 분류 작업에서 높은 성능을 발휘합니다.
※ LDA의 장점
- 데이터의 클래스별 평균 차이가 클 때 탁월한 성능을 발휘합니다
- 차원을 축소할 때 클래스 간 거리를 고려하기 때문에, 생성된 축은 높은 해석 용이성을 제공합니다
- 분산 구조가 일정한 가정이 위반되더라도 비교적 잘 작동할 수 있습니다
※ LDA의 단점
- 클래스 불균형, 비정규 분포, 다중 공선성과 같은 데이터의 특정한 특성에 의해 LDA의 성능이 영향을 받을 수있습니다
- 클래스 수에 따라 생성할 수 있는 성분의 수가 제한됩니다
- 데이터가 정규분포를 따른다고 가정하므로, 이 가정에서 벗어날 경우 성능이 저하될 수 있습니다
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# LDA 객체 생성
lda = LDA()
# LDA를 훈련 데이터에 적용
lda.fit(scaled_train, y_train)
lda_transformed_train = lda.transform(scaled_train)
# LDA로 생성된 칼럼명을 작성하기 위함
lda_columns = [f'lda{i+1}' for i in range(lda_transformed_train.shape[1])]
lda_df = pd.DataFrame(lda_transformed_train, columns = lda_columns)
lda_df.head()
3. LDA 구성 요소별 설명된 분산 비율 시각화
데이터의 고차원성은 차원의 저주 문제를 야기시킵니다.
차원의 저주는 데이터의 차원이 높아질수록 필요한 데이터의 양이 기하급수적으로 늘어나는 문제를 의미합니다.
이미지에서 볼 수 있듯이, 차원이 증가함에 따라 같은 수의 데이터 포인트들 사이의 거리가 점점 멀어집니다.
1차원에서는 포인트들이 선상에 밀접하게 위치해 있는 반면, 2차원으로 넘어가면 이 포인트들은 평면 상에 더 넓게 퍼지게 되고, 3차원에서는 이 퍼짐이 더욱 증가하여 각 포인트들은 큐브의 서로 다른 면에 위치하게 됩니다.
이는 데이터의 밀도가 감소함을 의미하며, 데이터 포인트들 간의 상대적 거리가 증가하는 결과를 가져옵니다.
고차원 데이터셋에서는 이 거리의 증가가 더욱 극적으로 나타나며, 이는 데이터 분석에 있어서 상당한 어려움을 만들어냅니다.
데이터 포인트들 사이의 이러한 거리 증가는 모델이 데이터의 중요한 패턴을 파악하고 예측을 하는 데 필수적인 밀접한 관계를 인식하기 어렵게 만듭니다.
결과적으로, 모델이 더 많은 데이터를 요구하며, 모델의 성능이 저하될 수 있고, 특히 과적합이 발생할 위험이 커집니다.
이러한 상황을 해결하기 위해 Scree Plot과 같은 도구를 사용하여 차원 축소를 수행할 때 최적의 차원 수를 결정할 수 있습니다. 이는 모델이 주요한 데이터 구조를 파악하고 예측 성능을 유지하면서도 불필요한 차원을 제거함으로써 과적합의 위험을 줄이는 데 도움을 줍니다.
설명된 분산의 증가율이 급격히 감소하는 지점과 그 이후 분산 감소가 완만해지는 부분을 찾아, 그 지점 이후의 주성분은 덜 중요하다고 판단합니다.
일반적으로 차원 축소된 차원의 설명된 분산 비율은 70%에서 90% 사이를 목표로 설정합니다.
이러한 지점을 Elbow(팔꿈치) 라고 부르며, 이를 통해 데이터의 복잡성을 유지하면서도 차원을 효과적으로 축소할 수 있는 최적의 차원 수를 결정합니다.
LDA를 수행한 후 Scree Plot을 사용하면 각 LDA 특성이 설명하는 분산의 비율을 시각적으로 확인할 수 있습니다.
Scree Plot을 통해 각 특성의 설명된 분산 비율을 평가함으로써, 가장 유의미한 정보를 제공하는 특성들을 식별할 수 있습니다.
또한, 계산 효율성을 높이는 데도 도움을 주는데,
모델이 과도하게 복잡해지지 않도록 필요한 최소한의 특성을 선택할 때 유용하게 사용됩니다.
따라서, 차원 축소를 수행한 후 Scree Plot을 사용하여 최적의 차원 수를 결정함으로써 데이터의 복잡성을 관리하고 모델의 효율성을 높일 수 있습니다.
plt.figure(figsize=(10, 6))
plt.plot(range(1, lda_transformed_train.shape[1] + 1), lda.explained_variance_ratio_)
plt.xlabel('LDA Components')
plt.ylabel('Explained Variance Ratio')
plt.title('Scree Plot for LDA')
plt.show()
두번째 주성분에서 분산의 비율이 급격하게 감소하는 것을확인했습니다.
따라서, LDA를 수행할때 최적의 차원을 2로 설정합니다.
4. PCA를 이용한 분산 설명률 및 구성 요소 시각화
아래 코드는 주성분 분석(PCA)을 이용하여 데이터의 차원을 축소하는 과정과,
적절한 차원의 수를 결정하기 위한 Scree Plot을 그리는 과정을 나타냅니다.
LDA를 수행한 후 Scree plot을 사용했을 때와 마찬가지로,
PCA의 Scree Plot은 각 주성분(Components)이 데이터의 분산에 기여하는 정도를 보여줍니다.
이 과정을 통해 찾아낸 적절한 차원의 수는 다음 스텝에서 PCA를 재정의하고, 학습 데이터를 다시 변환하는 데 사용됩니다.
from sklearn.decomposition import PCA
# PCA 객체 생성
pca = PCA()
# 훈련 데이터에 PCA 적용
pca.fit(scaled_train)
pca_transformed_train = pca.transform(scaled_train)
# Scree Plot 그리기
plt.figure(figsize=(10, 6))
plt.plot(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, marker='o')
plt.title('Scree Plot for PCA')
plt.xlabel('Number of Components')
plt.ylabel('Explained Variance Ratio')
plt.xticks(range(1, len(pca.explained_variance_ratio_) + 1)) # X축 눈금 설정
plt.show()
Elbow는 4번째 주성분에서 나타납니다.
따라서 주성분 4를 최적의 차원으로 설정합니다.
5. 지정된 차원 수로 LDA와 PCA 재적용
선형 판별 분석(LDA)과 주성분 분석(PCA)은 모두 데이터의 차원을 축소하는 데 사용되는 기법들이지만, 이들의 접근 방식에는 차이가 있습니다.
LDA는 지도 학습 방식의 차원 축소 기법으로, 데이터의 클래스 레이블을 활용하여 클래스 간 분리를 최대화하는 방식으로 작동합니다.
반면, PCA는 비지도 학습 방식의 차원 축소 기법으로, 데이터의 분산을 최대화하는 주성분을 찾는 것을 목표로 합니다.
이러한 차이점을 고려할 때, LDA와 PCA는 서로 다른 유형의 문제와 데이터셋에 적합합니다.
예를 들어, 클래스 레이블이 중요한 분류 문제에는 LDA가, 전반적인 데이터 구조의 이해가 필요한 경우에는 PCA가 더 적합할 수 있습니다.
차원 축소가 완료된 데이터 lda_transformed_train와 pca_transformed_train는 분석이나 머신러닝 모델 학습에 직접 사용될 수 있습니다.
이들 데이터는 원본 데이터의 중요한 정보를 유지하면서도 차원이 줄어들어, 모델의 성능을 향상시키고 계산 비용을 절감할 수 있습니다.
추가적으로, 이러한 차원 축소된 데이터는 원래 데이터프레임에 결합될 수 있으며, 이는 축소된 특성과 원래 데이터의 다른 특성들을 함께 활용하여 더 풍부한 데이터 분석을 가능하게 합니다.
# LDA, PCA 객체 재생성
lda = LDA(n_components=2)
pca = PCA(n_components=4)
# LDA, PCA를 훈련 데이터에 적용
lda.fit(scaled_train, y_train)
pca.fit(scaled_train)
# 차원 축소가 완료된 각 데이터
lda_transformed_train = lda.transform(scaled_train)
pca_transformed_train = pca.transform(scaled_train)
display(lda_transformed_train)
display(pca_transformed_train)
array([[ 1.34946286, 2.53032701],
[ 1.64167702, 0.93213274],
[-0.36150086, 0.42496772],
...,
[-1.72712618, -0.21526777],
[ 0.81173914, 0.91286138],
[ 1.59246733, 0.45543417]])
array([[-1.4736227 , -0.90828643, -2.81266519, -1.27455688],
[-2.58549294, 1.00186384, -0.52098985, -1.34319211],
[ 0.21199022, -0.64324441, 1.63422494, -0.13223707],
...,
[-0.15071316, -1.13645608, 1.7246467 , 0.74950337],
[-0.25295859, -1.19081198, 0.22479214, -0.9718927 ],
[-0.38398393, -0.83832922, -0.28389288, -1.59127645]])
'머신러닝 > 머신러닝: 심화 내용' 카테고리의 다른 글
피처 생성(Feature Generation) 1 : Binning 기법 (0) | 2024.12.23 |
---|---|
분류 모델 하이퍼파라미터 튜닝 (0) | 2024.12.22 |
회귀 모델 하이퍼파라미터 튜닝 (0) | 2024.12.20 |
교차검증 (1) | 2024.12.19 |
차원 축소 기법 : PCA (1) | 2024.12.17 |