본문 바로가기
AI 공부/머신러닝

(머신러닝) 비지도 학습 - 차원축소

by AI Sonny 2022. 9. 14.
728x90

지도학습 vs 비지도학습

  • 비지도 학습의 기본 아이디어는 X를 설명할 수 있는 z가 존재한다고 가정하고 학습진행
  • 여기서 z는 잠재변수라고 한다.
  • z의 해는 여러개가 존재한다.

예를 들면 우리가 100을 값을 구하기 위한 방법은 25 X 4, 1 X 100, 20 X 5와 같이 여러가지 방법이 있다.

 

이를 잠재변수라고 비유할 수 있다.

 

차원의 저주

  • 차원이 증가할수록 학습데이터의 수에 비해 특성의 차원수가 많아져서 성능이 저하되는 현상
model = LGBMClassifier(random_state=SEED)
cv = KFold(n_splits=5,shuffle=True,random_state=SEED)

scores = cross_val_score(model,x_train,y_train,cv = cv, scoring="roc_auc", n_jobs=-1)
scores.mean() 

=> 0.8900131161304283

 

타이타닉 데이터를 결측치를 채우고, ticket과 cabin을 원핫인코딩을 활용해 차원을 늘려보았다.

 

PCA(Principal Component Analysis)

  • 주성분 분석
  • 새로 파생된 주성분이 특성이다!
  • 주요 아규먼트
    • n_components : 주성분의 수

 

from sklearn.decomposition import PCA

pca = PCA(n_components=200,random_state=SEED) # 200개로 줄인다.
pca.fit(sparse_features)

=> PCA(n_components=200, random_state=42)

 

주성분을 200개로 줄였다.

 

sum(pca.explained_variance_ratio_)

 

PCA를 통해 주성분에 의해 설명되는 분산 비율을 구하였다.

 

데이터프레임 만들기

 

tmp = pd.DataFrame(pca.transform(sparse_features)).add_prefix("pca_")
x_train = pd.concat([features,tmp],axis=1)
x_train.head()

 

축소 후 교차 검증

 

model = LGBMClassifier(random_state=SEED)
scores = cross_val_score(model,x_train,y_train,cv = cv, scoring="roc_auc", n_jobs=-1)
scores.mean()

=> 0.9013099786869494

 

주성분 개수에 따른 분산 비율

 

components = np.arange(200,901,50)
for c in components:
    v = sum(pca.explained_variance_ratio_[:c])
    print(f"{c}개 주성분: {v}") # 개수가 적은 주성분이 더 좋은 성능을 발휘할 수도 있다.

=> 
200개 주성분: 0.527159387064588
250개 주성분: 0.5818057014232519
300개 주성분: 0.6343174560575218
350개 주성분: 0.6634783108864314
400개 주성분: 0.6908014680657634
450개 주성분: 0.7181246252450953
500개 주성분: 0.7454477824244273
550개 주성분: 0.7727709396037593
600개 주성분: 0.8000940967830913
650개 주성분: 0.8274172539624233
700개 주성분: 0.8547404111417553
750개 주성분: 0.8820635683210872
800개 주성분: 0.9093867255004192
850개 주성분: 0.9367098826797512
900개 주성분: 0.9640330398590832

 

실제 데이터에 결합

 

pca = PCA(n_components=800, random_state=SEED)
pca.fit(sparse_features)
tmp = pd.DataFrame(pca.transform(sparse_features)).add_prefix("pca_")
x_train = pd.concat([features,tmp],axis=1)
model = LGBMClassifier(random_state=SEED)
scores = cross_val_score(model, x_train, y_train, cv = cv, scoring="roc_auc", n_jobs=-1)
scores.mean()

=> 0.9103647522510643

 

함수 적용

 

def get_score(decomp ,features, sparse_features):
    tmp = pd.DataFrame(decomp.transform(sparse_features)).add_prefix("decomp_")
    x_train = pd.concat([features,tmp],axis=1)
    model = LGBMClassifier(random_state=SEED)
    scores = cross_val_score(model,x_train,y_train,cv = cv , scoring="roc_auc",n_jobs=-1)
    return scores.mean()

 

get_score(pca,features,sparse_features)

=> 0.9103647522510643

 


KernelPCA

  • 비선형 결합방식
  • kernel을 이용해서 비선형으로 결합
    • linear(default 값, pca랑 같다.)
    • poly(다항식)
    • rbf
    • sigmoid
    • cosine

적용

 

from sklearn.decomposition import KernelPCA
kpca = KernelPCA(n_components=100,kernel="cosine",n_jobs=-1,random_state=SEED) # kernel바꿔가면서 넣어보기!
kpca.fit(sparse_features)

get_score(kpca,features,sparse_features)

=> 0.9224232825859108

 


행렬 분해

  • 하나의 행렬을 여러개의 행렬의 곱으로 나타내는 것

 

SVD (Singular Value Decomposition)

  • 특이값 분해
  • 이상치 탐지 때 사용 (카드 사용거래, 거래 데이터를 축소한 것과 원본데이터의 차이가 적다면 정상, 차이가 많이나면 사기)

 

SVD 적용

 

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=100,random_state=SEED)
svd.fit(sparse_features)

=> TruncatedSVD(n_components=100, random_state=42)

 

주성분 개수에 따른 분산 비율

 

sum(svd.explained_variance_ratio_)

=> 0.3929530650654831

 

스코어

 

get_score(svd,features,sparse_features)

=> 0.9047766578047938

 


NMF(Non-negative Matrix Factorization)

  • 자연어 때 많이 쓰인다.
  • 음수가 안 들어간다.

적용

 

from sklearn.decomposition import NMF
nmf = NMF(n_components=100,random_state=SEED,max_iter=200)
nmf.fit(sparse_features)

 

음수 확인해보기

 

(nmf.components_ < 0).sum()

=> 0

 

음수가 없다.

 

get_score(nmf,features,sparse_features)

=> 0.890574647758255

 

  • LDA (Linear Discriminant Analysis) 생략! (책에 있으니 한번 보기!)
  • 백화점 데이터에는 좋게 나온다!

 


Random Projection

  • 데이터 포인트 간에 거리를 유지되도록 하면서 특성의 차원을 저차원으로 투영
  • GRP(Gaussian Random Project) -> 일반적인 데이터에서 사용!
  • SRP(Sparse Random Project) -> 0이 많은 데이터에서 사용!
  • 3차원의 피처를 2차원으로 거리를 유지하여 차원을 줄임!

- GaussianRandomProjection

  • n_components: 차원수
    • "auto": 기본값, eps에 따라 자동으로 차원수를 결정
  • eps: 입실론값
    • 값이 작을수록 차원이 높아진다.

 

GaussianRandomProjection 적용

 

from sklearn.random_projection import GaussianRandomProjection
grp = GaussianRandomProjection(eps=0.4,random_state=SEED)
grp.fit(sparse_features)
get_score(grp,features,sparse_features)

=> 0.9142671033621493

 

일반적인 데이터에서 많이 사용된다.

 

- SparseRandomProjection 적용

 

from sklearn.random_projection import SparseRandomProjection
srp = SparseRandomProjection(eps=0.4,random_state=SEED)
srp.fit(sparse_features)
get_score(srp,features,sparse_features)

=> 0.8953524130060654

 

0이 많은 데이터에서 사용한다.

 


비지도 학습의 차원축소를 하여 성능을 높일 수 있다는 것을 이론으로만 배워서 아직 감이 안잡힌다.

 

실제로 적용해보는 연습을 통해 익혀야할 것 같다,

728x90

'AI 공부 > 머신러닝' 카테고리의 다른 글

(머신러닝) XAI와 SHAP  (1) 2022.09.15
(머신러닝) data leakage  (0) 2022.09.15
(머신러닝) 모델튜닝  (1) 2022.09.13
(머신러닝) 앙상블  (0) 2022.09.13
(머신러닝) 머신러닝 모델  (2) 2022.09.13

댓글