본문 바로가기
파이썬/머신러닝-비지도학습

파이썬 머신러닝 비지도학습 - 차원축소 - 주성분 분석(PCA)

by 큰고양2 2023. 9. 21.

PCA

주성분 분석(pca)는 여러 변수를 가진 데이터(고차원 데이터)를 최대한의

특성을 유지하면서 저차원의 데이터로 만드는 방법으로

가능한 데이터의 분산을 유지하며 선형방식으로 차원을 축소한다

축소하는 데이터는 여러 변수를 가진 데이터 x다

 

 

 

사용

데이터 준비

https://bigcat5312.tistory.com/80

 

파이썬 머신러닝 지도학습 - 데이터 분리 (sklearn - train_test_split

import from sklearn.model_selection import train_test_split train_test_split 데이터를 머신러닝에 사용하기 위해서 학습 데이터와 테스트 데이터를 무작위로 분리하는 함수로 train_test_split(x , y, test_size = or train_siz

bigcat5312.tistory.com

게시글을 참고해서 데이터를 분리한다

이번 게시글에서는 데이터를 x_train, x_val, y_train, y_val 으로 분리했다

이후 

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_val = scaler.transform(x_val)

코드로 정규화를 진행한다

import

from sklearn.decomposition import PCA

코드로 임포트를 한다

 

# 분석 모델
pca = PCA(n_components=n)

# 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

n_components=

파라미터는 데이터를 몇개로 축소할건지 정하는 파라미터다

위 코드를 실행하면 x_train과 x_val 데이터를  x_trian을 기준으로 n개의 차원(변수)를 가진 데이터로

수정해 각각 x_train_pc와 x_val_pc 변수에 저장한다

여기서는 n = x_train.shape[1] = 전체 변수의 숫자로 지정했다

 

 

그대로 사용해도 되지만

# 칼럼이름
n = x_train.shape[1]
column_names = [ 'PC'+str(i+1) for i in range(n) ]
column_names

# 데이터프레임으로 변환
x_train_pc = pd.DataFrame(x_train_pc, columns = column_names)
x_val_pc = pd.DataFrame(x_val_pc, columns = column_names)
x_train_pc

위 코드를 통해 데이터 프레임으로 변환하면 보기 좋아진다

물론 꼭 해야할 필요는 없다

 

elbow method
plt.plot(range(1,n+1),  pca.explained_variance_ratio_   , marker = '.')
plt.grid()
plt.show()

위 코드를 사용하면 주성분 개수별 전체 분산의 크기 - 누적분산의 크기를

그래프로 확인 할 수 있다

 

ex)

예를 들어 이 그래프의 경우 pc의 수가 20개가 넘어간 이후로는 주성분의 수가 늘어나도

분산과의 차이가 거의 없다

즉 수많은 차원을 가지고 있지만 실질적으로 20개가 넘어가면 학습에 이득을 보는게 딱히 없다는 말이다

오히려 차원의 수가 많아지니 과적합 혹은, 다중공선성, 차원의 저주 같은 문제가 생길 수 있다

 

차원 축소를 적용하여 모델 학습

이미 데이터가 완성되어 있으니

cols = column_names[:n]
x_train_pc_n = x_train_pc.loc[:, cols]
x_val_pc_n = x_val_pc.loc[:, cols]

코드를 통해 n개의 차원을 가진 새로운 x_train이나 y_train을 만들어도 되고

# 분석 모델
pca = PCA(n_components=n)

# 적용
x_train_pc = pca.fit_transform(x_train)
x_val_pc = pca.transform(x_val)

에서 그냥 사용할 n을 넣어서 사용해도 된다

 

 

이후 사용할 모델을 정해서

모델에 fit을 해줄 때 새로 만든 x_train데이터를 사용하고

predict로 값을 예측할 때는 x_val을 넣어주면 된다