본문 바로가기
머신러닝/PCA(Principal Component Analysis)

PCA - wine 데이터

by 미생22 2024. 6. 1.
728x90

이번에는 wine 데이터로 살펴보겠습니다. 지난시간에 썼던 iris 데이터는 feature가 4개밖에 없었지만 wine 데이터는 feature가 꽤 많았던걸로 기억합니다.

 

wine_url = 'http://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/wine.csv'
wine = pd.read_csv(wine_url, sep=',', index_col=0)

wine.head()

 

wine_X = wine.drop(['color'], axis=1)
wine_y = wine['color']

X와 y로 나누구요, 이번에도 scalilng 시켜보겠습니다.

 

wine_ss = ss.fit_transform(wine_X)

이렇게 얻은 scaling 된 X데이터를 pca를 돌려야겠죠, pca fit, transform 시키는 함수였던 get_pca_data()함수를 들고옵니다.

 

pca_wine, pca = get_pca_data(wine_ss, n_components=2)

이렇게 얻은 pca에서 설명력을 print 시켜주는 함수를 또 만들겠습니다.

 

def print_variance_ratio(pca):
    print('varience_ratio :', pca.explained_variance_ratio_)
    print('sum of varience_ratio :', np.sum(pca.explained_variance_ratio_))

 

print_variance_ratio(pca)

varience_ratio : [0.25346226 0.22082117]
sum of varience_ratio : 0.4742834274323619

 

pca_wine을 넣어야 하는거 아닌가 싶지만 pca_wine은 pca.transform시킨후의 wine 데이터입니다. 그냥 array만 갖고있는것이죠.

 

주성분을 두개로 줄였더니 50%가 안되네요...

데이터프레임으로 만들어서 pairplot으로 관찰해보겠습니다.

 

pca_columns = ['PC1', 'PC2']
pca_wine_pd = pd.DataFrame(pca_wine, columns=pca_columns)
pca_wine_pd['color'] = wine_y.values
pca_wine_pd.head()

 

sns.pairplot(pca_wine_pd, hue='color', height=5, x_vars=['PC1'], y_vars=['PC2'])

생각보다 잘 나뉘어지는 걸 알 수 있습니다.

머신러닝을 돌려 accuracy를 확인해볼까요? 먼저 pca를 적용하기 전 scaling 만했을때의 정확도입니다.

 

rf_scores(wine_ss, wine_y)

Score :  0.9935352638124

 

pca_X = pca_wine_pd[['PC1', 'PC2']]
rf_scores(pca_X, wine_y)

Score :  0.981067803635933

 

%%time으로 확인해보니까 시간이 줄어드는걸 확인했습니다. score가 98%로 떨어지지만, 나쁘지않습니다.
주성분 3개로 바꿔보겟습니다.

 

pca_wine, pca = get_pca_data(wine_ss, n_components=3)
print_variance_ratio(pca)

varience_ratio : [0.25346226 0.22082117 0.13679223]
sum of varience_ratio : 0.61107566218387

 

주성분을 3개로 하니까 sum값이 61%로 높아지는걸 볼 수 있습니다.
주성분이 3개니까 pairplot 말고 3D로 표현하는 것도 해보겠습니다. 주성분이 3개니까요.

 

pca_columns = ['PC1', 'PC2', 'PC3']
pca_wine_pd = pd.DataFrame(pca_wine, columns=pca_columns)
pca_wine_pd['color'] = wine_y.values
pca_wine_pd

 

pca_X = pca_wine_pd[pca_columns]
rf_scores(pca_X, wine_y)

Score :  0.9832236631728548

 

0.2% 정확도가 높아졌네요 ㅎㅎ
3Dplot을 그려보겠습니다. 3D는 plotly express의 scatter_3D라는 함수로 만들겠습니다.

 

import plotly_express as px

fig = px.scatter_3d(pca_wine_plot, x='PC1', y='PC2', z='PC3', color='color', symbol='color', opacity=0.4)
#color는 color컬럼에 따라 구분하고 symbol도 color 컬럼에 따라 구분하라는 뜻
fig.update_layout(margin=dict(l=0, r=0, b=0, t=0))
fig.show()

color는 color컬럼에 따라 구분하고 symbol도 color 컬럼에 따라 구분하라는 뜻입니다.

이 강의에서 알아야 하는 점은 코드가 아니라, pca는 새로운 특성을 만들어낸다. 주성분은 설명력이라는 변수에 의해 얼마나 데이터를 설명할 수 있는지도 알 수 있다. 라는 점입니다 :D

728x90

'머신러닝 > PCA(Principal Component Analysis)' 카테고리의 다른 글

MNIST using PCA and kNN  (1) 2024.06.04
HAR using PCA  (0) 2024.06.04
PCA - eigenface  (0) 2024.06.01
PCA - iris 데이터  (0) 2024.06.01
PCA란?  (0) 2024.05.31