[머신러닝] 8. 비지도학습_PCA(차원축소)

PurinYun·2023년 11월 27일
0

AIffel

목록 보기
37/75

비지도학습

타겟값(y의 값)이 없음

차원축소

feature가 많을수록 데이터의 차원이 커지게 되는데,
데이터셋의 크기에 비해 feature가 많아질 경우
이를 표현하기 위한 변수가 많아져
모델의 복잡성이 증가되고 과적합 문제가 발생되기도 합니다.
이러한 문제를 해결하기 위해 차원 축소 방법이 사용되고 있습니다.
*용어: 차원이란? 데이터 포인트를 공간에 표현하기 위해 필요한 최소한의 축의 개수

PCA(Principal Component Analysis)

차원 축소 기법 중 대표적인 기법
고차원에서 저차원으로 축소하는 선형 투영 기법
데이터의 차원이 증가할 수록 거리가 증가하고, 오버피팅 가능성이 커짐

  1. 점진적 주성분 분석 (Incremental PCA, IPCA):
    • 개념: IPCA는 전체 데이터 세트를 메모리에 올리지 않고 점진적으로 주성분을 추정하는 방법입니다. 이는 대규모 데이터셋에 효율적으로 적용될 수 있습니다.
    • 활용: 대용량 데이터셋이나 온라인 학습(scikit-learn에서는 IncrementalPCA 클래스 사용)에 적합합니다.
    • 차이점: 일반적인 PCA와는 다르게 전체 데이터를 한 번에 처리하지 않고 일부씩 점진적으로 처리하여 메모리 효율성을 높입니다.
  1. 희소 주성분 분석 (Sparse PCA):
    • 개념: 희소 PCA는 주성분 중 일부만이 실제로 비율적으로 큰 값을 갖도록 제한하는 방식입니다. 이는 주성분 중 일부만 사용하여 데이터의 특징을 설명하는데 사용됩니다.
    • 활용: 데이터의 특징이 대부분이 중요하지 않은 경우나 해석 가능한 주성분이 필요한 경우에 사용됩니다.
    • 차이점: 주성분 중 대부분이 0에 가까운 값을 갖도록 하여 희소성을 갖습니다. 일반적인 PCA와는 주성분이 밀집(dense)한 것과 대조적입니다.
  1. 커널 주성분 분석 (Kernel PCA):
    • 개념: 커널 PCA는 원본 공간에서는 비선형인 데이터를 고차원 특징 공간으로 사상함으로써 비선형 구조를 감지하는 방법입니다.
    • 활용: 비선형 데이터에 대한 주성분 분석이 필요한 경우에 사용됩니다.
    • 차이점: 커널 함수를 사용하여 데이터를 고차원 특징 공간으로 변환한 후에 일반적인 PCA를 적용합니다. 이로써 비선형 관계를 캡처할 수 있습니다.

PCA 단계

데이터에서 분산이 최대인 축을 찾음 (첫번째 축)
첫번째 축과 직교하면서 분산이 최대인 축을 찾음 (두번째 축)
첫번째와 두번째 축에 직교하고, 분산이 최대인 축을 찾음 (세번째 축 : 3차원)

# 라이브러리 불러오기
import pandas as pd


# 와인 데이터 불러오기
from sklearn.datasets import load_wine
dataset = load_wine()
data = pd.DataFrame(dataset.data, columns=dataset.feature_names)


# 데이터 샘플 확인
print(data.shape)
data.head()

1. 스탠다드 스케일링

특성별로 데이터 스케일이 다를 경우
머신러닝 모델이 원활하게 작동하는 데 어려움을 겪을 수 있어
데이터 스케일링을 통해 데이터 값의 범위나 분포를 같게 만들어줘야 합니다.
스탠다드 스케일링은 데이터 스케일링의 한 종류로서
데이터가 표준 정규 분포를 갖도록 스케일링합니다.
(평균 0, 분산 1로 변경하여 모든 특성들이 같은 스케일을 갖도록 함)

# 스탠다드 스케일링
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data = scaler.fit_transform(data)
data[:3]


# 데이터 복사 (df변수)
df = data.copy()

2. PCA

2차원이나 3차원으로 축소할 경우 시각화가 가능하다는 장점이 있음

# 라이브러리 불러오기
from sklearn.decomposition import PCA

# PCA (피처 여러개를 2개로 줄임)
pca = PCA(n_components=2)

# PCA 변환 (df라는 데이터셋을 변환)
df = pca.fit_transform(df)

# 데이터 크기 확인 (피처가 2개가 되었을 것 : 2차로 시각화 가능)
df.shape

# 샘플 데이터 확인
df[:3]

3. PCA(2차원) 시각화

# 시각화 라이브러리
import matplotlib.pyplot as plt

# 데이터 프레임 변환
df = pd.DataFrame(df)
df.head()

# scatter (X축에 들어갈 data, Y축에 들어갈 data 넣어주기)
# iloc(전체data 중에서 0번째 데이터 넣는다, 1번째 ~)
plt.scatter(df.iloc[:,0], df.iloc[:,1])


# 타겟 데이터 확인
dataset.target


# scatter (c=target) : 원래 파란색으로만 나왔었는데 3가지 색으로 나옴
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)

# 데이터 설명력 확인(%) : 아래줄에 0.55 라고 나옴(55%)
print(pca.explained_variance_ratio_)
print(pca.explained_variance_ratio_.sum())

4. 지도 학습 (PCA 전후 비교)

# PCA후 데이터로 머신러닝 (2개의 피처)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

model = RandomForestClassifier(random_state=2022)
cross_val_score(model, df, dataset.target, scoring='accuracy', cv=5).mean()




# PCA전 데이터로 머신러닝 (13개의 피처)
cross_val_score(model, data, dataset.target, scoring='accuracy', cv=5).mean()

5. PCA(3차원) 시각화

# 새 데이터 복사
df = data.copy()

# pca (n_components=3)
pca = PCA(n_components=3)

# pca 변환
df = pca.fit_transform(df)

# 데이터 프레임 변환
df = pd.DataFrame(df)

# 시각화 (3차원)
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(df.iloc[:,0], df.iloc[:,1],df.iloc[:,2], c=dataset.target)

6. 점진적 PCA (IncrementalPCA)

데이터 셋이 큰 경우 활용 (배치를 통해 점직전 수행)
중간에 추가도 가능

# 라이브러리 불러오기
from sklearn.decomposition import IncrementalPCA

# 데이터 복사
df = data.copy()

# 점진적 PCA
pca = IncrementalPCA(n_components=2, batch_size=16)

# 점진적 PCA 변환
df = pca.fit_transform(df)

# 시각화
df = pd.DataFrame(df)
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)

# 데이터 설명(%)
print(pca.explained_variance_ratio_)
print(pca.explained_variance_ratio_.sum())

7. 희소PCA (SparsePCA)

적절한 희소성을 유지 (alpha값으로 조정)
오버피팅 방지

# 라이브러리 불러오기
from sklearn.decomposition import SparsePCA

# 데이터 복사
df = data.copy()

# 희소 PCA
pca = SparsePCA(n_components=2, alpha=0.01)

# 희소 PCA 변환
df = pca.fit_transform(df)

# 시각화
df = pd.DataFrame(df)
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)

8. 커널PCA

비선형으로 차원축소, 차원을 늘리는 것으로 이해하셨다고?

주성분 분석은 복잡 -> 단순
커널은

데이터 하나하나가 어떤 특성을 가지고 있는지를 파악하는 방법
선형으로 안 나왔을때 적용가능

PCA(Principal Component Analysis, 주성분 분석)는 데이터의 분산을 최대한 보존하는 새로운 축을 찾아 데이터를 변환하는 방법입니다. 이는 고차원의 데이터를 저차원으로 축소시키는 데 사용되며, 데이터의 손실을 최소화하면서 차원을 줄이는 데 유용합니다.
그런데, PCA는 선형적인 데이터 변환에 한정되어 있습니다. 즉, 비선형적인 데이터 구조를 잘 잡아내지 못합니다. 이런 경우에 커널 PCA(Kernel PCA)를 사용하게 됩니다.
커널 PCA는 PCA를 확장한 방법으로, 커널 트릭을 사용하여 비선형적인 데이터를 고차원 공간에서 선형적으로 구분될 수 있도록 변환합니다. 이를 통해 비선형적인 구조를 가진 데이터를 잘 분리할 수 있게 됩니다.
커널 PCA는 SVM(Support Vector Machine)과 같이 커널 트릭을 사용하는 알고리즘에서 종종 사용되며, 여러 종류의 커널 함수(예: RBF, Polynomial, Sigmoid 등)를 사용할 수 있습니다.
커널 PCA의 주요 단점 중 하나는 데이터 변환 후에 원래 특성 공간으로 되돌릴 수 없다는 점입니다. 이는 커널 PCA가 고차원 공간에서의 데이터 변환을 직접 계산하지 않기 때문입니다. 이러한 제한성 때문에 커널 PCA는 주로 시각화나 비선형 차원 축소에 사용됩니다.

# 라이브러리 불러오기
from sklearn.decomposition import KernelPCA

# 데이터 복사
df = data.copy()

# 커널 PCA
pca = KernelPCA(n_components=2)

# 커널 PCA 변환
df = pca.fit_transform(df)

# 시각화
df = pd.DataFrame(df)
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)

9. SVD(Singular Value Decomposition) 특이값 분해

행렬을 특정한 구조로 분해하는 방식
신호 처리와 통계학 등의 분야에서 자주 사용됨

SVD는 대수식을 인수분해하는 것과 직접 비교할 수 있는 반면, PCA는 '가장 큰' 항을 유지하고 더 작은 모든 항을 제거하여 인수분해된 명령문을 근사화하는 것과 같다.
SVD의 값은 일관된 숫자이며 인수분해는 이를 분해하는 과정인 반면 PCA는 주요 측면을 결정하는 통계/기계 지능 방식이다.
행렬을 직교 정규 영역으로 분해하는 것을 SVD라고 하는 반면, PCA는 SVD를 사용하여 계산할 수 있지만 가격이 더 높다.
SVD는 데이터 수집을 위한 수치 선형 대수학에서 가장 광범위하게 사용되는 다목적 유용한 기능 중 하나인 반면, PCA는 통계에 대한 많은 이론을 도입한 잘 정립된 방법이다.
SVD는 저명한 알고리즘 중 하나인 반면, PCA는 차원 축소 접근 방식이다.

# 라이브러리 불러오기
from sklearn.decomposition import TruncatedSVD

# SVD적용
df = data.copy()
pca = TruncatedSVD(n_components=2)
df = pca.fit_transform(df)

# 시각화
df = pd.DataFrame(df)
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
profile
Fantivation

0개의 댓글