hiroportation

ITの話だったり、音楽の話、便利なガジェットの話題などを発信しています

機械学習アルゴリズムの復習(次元削除と主成分分析(PCA))

次元削除にて膨大なデータの主成分を探す。固有値分解はここで使います。


データセット読み込み

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing, decomposition

# データセット読み込み
df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)

df_wine_all.head(4)

取り込んだワインデータは前処理済みのもので先頭4行を抽出した結果は以下の通りとなる。

取り込んだワインを表示
   0      1     2     3     4    5   ...    8     9     10    11    12    13
0   1  14.23  1.71  2.43  15.6  127  ...  0.28  2.29  5.64  1.04  3.92  1065
1   1  13.20  1.78  2.14  11.2  100  ...  0.26  1.28  4.38  1.05  3.40  1050
2   1  13.16  2.36  2.67  18.6  101  ...  0.30  2.81  5.68  1.03  3.17  1185
3   1  14.37  1.95  2.50  16.8  113  ...  0.24  2.18  7.80  0.86  3.45  1480

[4 rows x 14 columns]


入力とラベルに分ける

X=df_wine_all.iloc[:,1:].values
Y=df_wine_all.iloc[:,0].values

print(X)

特徴リストの出力

[[1.423e+01 1.710e+00 2.430e+00 ... 1.040e+00 3.920e+00 1.065e+03]
 [1.320e+01 1.780e+00 2.140e+00 ... 1.050e+00 3.400e+00 1.050e+03]
 [1.316e+01 2.360e+00 2.670e+00 ... 1.030e+00 3.170e+00 1.185e+03]
~snip~
]

print(Y)

ラベルリストの出力

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]


データの整形

sc=preprocessing.StandardScaler() # 標準化(平均0、分散1)
sc.fit(X)
X=sc.transform(X)

X

データを平均0、分散1(デフォルト)になるように整形します

array([[ 1.51861254, -0.5622498 ,  0.23205254, ...,  0.36217728,
         1.84791957,  1.01300893],
       [ 0.24628963, -0.49941338, -0.82799632, ...,  0.40605066,
         1.1134493 ,  0.96524152],


PCAを実行

6次元に次元圧縮する

pca = decomposition.PCA(n_components=6)
X_transformed = pca.fit_transform(X)

X_transformed

array([[ 3.18562979e+02,  2.14921307e+01,  3.13073470e+00,
        -2.50113758e-01,  6.77078222e-01,  5.68081040e-01],
       [ 3.03097420e+02, -5.36471768e+00,  6.82283550e+00,
        -8.64034749e-01, -4.86095978e-01,  1.43398712e-02],

結果の表示

print(pca.explained_variance_)
print(pca.components_)

f:id:thelarklife1021:20210901084617p:plain:h30

固有値固有ベクトルを求める

# 固有値λに相当
[4.73243698 2.51108093 1.45424187 0.92416587 0.85804868 0.64528221]

# 固有ベクトルvに相当(6次元)
[[ 0.1443294  -0.24518758 -0.00205106 -0.23932041  0.14199204  0.39466085
   0.4229343  -0.2985331   0.31342949 -0.0886167   0.29671456  0.37616741
   0.28675223]
 [-0.48365155 -0.22493093 -0.31606881  0.0105905  -0.299634   -0.06503951
   0.00335981 -0.02877949 -0.03930172 -0.52999567  0.27923515  0.16449619
  -0.36490283]
]

print(np.cumsum(pca.explained_variance_ratio_))

累積寄与率:どれだけ次元を削減したか(7~8割が目安)

[0.36198848 0.55406338 0.66529969 0.73598999 0.80162293 0.85098116]


結果のプロット

plt.subplot(2, 1, 2)
plt.scatter(X[:,9],X[:,12], c=Y)
plt.xlabel('color')
plt.ylabel('proline')
plt.show

f:id:thelarklife1021:20210901091302p:plain

%matplotlib inline
plt.figure(figsize=(10,10))
plt.subplot(2, 1, 1)
plt.scatter(X_transformed[:,0],X_transformed[:,1], c=Y)
plt.xlabel('PC1')
plt.ylabel('PC2')

PC1:第1成分
PC2:第2成分

f:id:thelarklife1021:20210901091052p:plain

以上