학습 내용
- 비지도학습 방법에 대해 알아보자
비지도 학습
타겟값(y의 값)이 없음
차원축소
- feature가 많을수록 데이터의 차원이 커지게 되는데, 데이터셋의 크기에 비해 feature가 많아질 경우 이를 표현하기 위한 변수가 많아져 모델의 복잡성이 증가되고 과적합 문제발생
- 이를 방지하기 위해 차원 축소 사용
- 차원 : 데이터 포인트를 공간에 표현하기 위해 필요한 최소한의 축의 개수
PCA(Principal Component Analysis)
차원축소 (PCA)
- PCA(Principal Component Analysis)
- 차원 축소 기법 중 대표적인 기법
- 고차원에서 저차원으로 축소하는 선형 투영 기법
- 데이터의 차원이 증가할 수록 거리가 증가하고 오버피팅 가능성이 커짐
- PCA 단계
- 데이터에서 분산이 최대인 축을 찾음 (첫번째 축)
- 첫번째 축과 직교하면서 분산이 최대인 축을 찾음 (두번째 축)
- 첫번째 축과 두번째 축에 직교하고 분산이 최대인 축을 찾음 (세번째 축)
# 라이브러리 불러오기
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()
스탠다드 스케일링
특성별로 데이터 스케일이 다를 경우
머신러닝 모델이 원활하게 작동하는 데 어려움을 겪을 수 있어
데이터 스케일링을 통해 데이터 값의 범위나 분포를 같게 만들어줘야 합니다.
스탠다드 스케일링은 데이터 스케일링의 한 종류로서
데이터가 표준 정규 분포를 갖도록 스케일링합니다.
(평균 0, 분산 1로 변경하여 모든 특성들이 같은 스케일을 갖도록 함)
# 스탠다드 스케일링
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data = scaler.fit_transform(data)
data[:3]
# 데이터 복사 (df변수)
df = data.copy()
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]
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())
지도 학습 (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()
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)
점진적 주성분 분석 (Incremental PCA, IPCA):
- 개념: IPCA는 전체 데이터 세트를 메모리에 올리지 않고 점진적으로 주성분을 추정하는 방법
- 활용: 대용량 데이터셋이나 온라인 학습(scikit-learn에서는 IncrementalPCA 클래스 사용)에 적합합니다.
- 차이점: 일반적인 PCA와는 다르게 전체 데이터를 한 번에 처리하지 않고 일부씩 점진적으로 처리하여 메모리 효율성을 높입니다.
# 라이브러리 불러오기
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())
희소PCA (SparsePCA)
희소 주성분 분석 (Sparse PCA):
- 개념: 희소 PCA는 주성분 중 일부만이 실제로 비율적으로 큰 값을 갖도록 제한하는 방식. 이는 주성분 중 일부만 사용하여 데이터의 특징을 설명하는데 사용됩니다.
- 활용: 데이터의 특징이 대부분이 중요하지 않은 경우나 해석 가능한 주성분이 필요한 경우에 사용됨.
- 차이점: 주성분 중 대부분이 0에 가까운 값을 갖도록 하여 희소성을 가짐. 일반적인 PCA와는주성분이 밀집(dense)한 것과 차이가 있음
- 적절한 희소성을 유지 (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)
커널 주성분 분석 (Kernel PCA):
- 개념: 커널 PCA는 원본 공간에서는 비선형인 데이터를 고차원 특징 공간으로 사상함으로써 비선형 구조를 감지하는 방법.
- 활용: 비선형 데이터에 대한 주성분 분석이 필요한 경우에 사용됨. 선형으로 안 나왔을때 적용가능
- 차이점: 커널 함수를 사용하여 데이터를 고차원 특징 공간으로 변환한 후에 일반적인 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)
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)
군집(클러스터링)
- 군집분석은 유사성이 높은 대상의 집단을 분류하는 분석 방법
- 계층적 군집분석과 비계층적 군집분석으로 구분함
- 전통적인 계층적 군집분석은 군집의 개수를 나중에 선정함 (Dendrogram)
- 비계층적 군집분석인 K-means는 군집의 수를 가장 먼저 선정함
- K-means 군집분석은 초기 중심 값은 임의로 선정하며, 중심 값이 이동함
- 군집분석의 평가지표
- Silhouette(실루엣), Dunn index등 활용
- 비계층적 클러스터링
- 계층적 클러스터링
비계층적 군집분석
- 대표적인 방법 K-means
- K-평균군집(centroid): 임의의 지점 K개를 선택해 해당 중심에서 가까운 데이터를 군집화
- n_clusters(하이퍼파라미터) 반드시 설정
# KMeans 라이브러리
from sklearn.cluster import KMeans
# 데이터 불러오기
from sklearn.datasets import load_wine
dataset = load_wine()
data = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df = data.copy()
# KMeans 선언 및 학습
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)
# KMeans 예측
pred = kmeans.predict(df)
pred
# 실제값과 예측값 비교
df['target'] = dataset.target
df['pred'] = pred
df
PCA -> 군집 -> 시각화
# PCA
df = data.copy()
pca = PCA(n_components=2)
df = pca.fit_transform(df)
df = pd.DataFrame(df) # 넘파이 형태로 반환되므로 DF형태로 변환
df.head()
# Kmeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)
pred = kmeans.predict(df)
df['kmeans'] = pred
df
# 각 군집의 중심점
centers = kmeans.cluster_centers_
# 시각화
import seaborn as sns
plt.figure(figsize=(12, 6))
sns.scatterplot(x=df.iloc[:,0], y=df.iloc[:,1], hue=df['kmeans'])
plt.scatter(centers[:,0], centers[:,1])
클러스터 개수 찾는 방법 (엘보우 방법, elbow method)
클러스터 개수를 대체 몇 개로 잡아야 할 지
시각화를 시켜본 후, 대충 몇 개를 잡을지 파악하기 위함
그래프에서 급격히 떨어지다가 완만해지는 부분을 (e.g. 2,3,4) 클러스터 개수로 설정하면 됨
# 군집 수 찾기
inertia = [] # inertia 변수에 리스트 만들기
for i in range(1,10):
kmeans = KMeans(n_clusters=i, random_state=2022)
kmeans.fit(df)
inertia.append(kmeans.inertia_) # inertia 리스트에 꼭 추가해주어야 함
plt.plot(range(1,10),inertia)
계층적 군집분석
대표적인 방법 : 덴드로그램
k-means와 달리 군집 개수를 사전에 설정하지 않음
PCA -> 타겟별 샘플링 -> 덴드로그램
*용어 : 덴드로그램? 개체간의 결합되는 순서를 나타낸 트리 형태의 다이어그램이다.
# 덴드로그램, 와드 함께 불러오기
from scipy.cluster.hierarchy import dendrogram, ward
# PCA를 통해 데이터 축소시키기
df = data.copy()
pca = PCA(n_components=2) # 2차원으로 축소
df = pca.fit_transform(df) # df를 transform 하여 df 변수에 다시 담음
df = pd.DataFrame(df)
# (데이터) 샘플링
kdata = df[:3].copy() # 앞에서 부터 3개 (0,1,2) 를 copy함
kdata = kdata.append(df[70:73])
kdata = kdata.append(df[160:163])
kdata
# 덴드로그램
linkage = ward(kdata) # linkage 라는 거리정보를 ward 함수를 통해 받음
dendrogram(linkage)
K-means(비계층군집) 와 달리 덴드로그램(계층군집)은 시간/비용절감
'AIFFLE > STARTER' 카테고리의 다른 글
[DL] 3. 딥러닝 구조와 모델 (0) | 2024.05.02 |
---|---|
[DL] 2. 텐서 표현과 연산 (0) | 2024.05.02 |
[DL] 1. 딥러닝 (0) | 2024.05.01 |
[ML] 지도학습(회귀) (0) | 2024.04.26 |
[ML] 지도학습(분류) (0) | 2024.04.26 |