0
0

More than 1 year has passed since last update.

PCA with Breast Cancer Datasets

Last updated at Posted at 2023-01-01

初めに

scikit learnのbreast cancer datasetsを利用しPCAをやってみます。
これはそのコードを保存するために作成しました。

予備知識

Scalingについて理解しましょう。まず、mglearnをインストールします。

pip install mglearn
pip install joblib==1.1.0
import mglearn
mglearn.plots.plot_scaling()

結果
良く使うのは、1. StandardScaler と 2. MinMax Scalerです。
image.png

Breast Cancer Datasets

Datasetsを入手し、Scalingしてみましょう。

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()

中身

print(type(cancer))
<class 'sklearn.utils.Bunch'>

可視化してみましょう。 axes.ravel()には注目してください。これを使うとnested loopを使わなくてもいいです。便利です。

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(6,5, figsize = (30,30))

malignant = cancer.data[cancer.target==0]
benign = cancer.data[cancer.target==1]

ax = axes.ravel()

from numpy import histogram
for i in range(30):
    _, bins = np.histogram(cancer.data[:,i], bins=50)
    ax[i].hist(malignant[:,i], bins=bins, color='red',alpha=0.5)
    ax[i].hist(benign[:,i], bins=bins, color='blue',alpha=0.5)
    ax[i].set_title(cancer.feature_names[i])
    ax[i].legend(['malignant', 'benign'], loc='best')
    ax[i].set_yticks(())
   

fig.tight_layout()
plt.show()

結果
image.png

Scaling

cancer dataをスケールしましょう。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(cancer.data)
X_scaled = scaler.transform(cancer.data)

PCA

それではPCAを始めます。

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X_scaled)
X_pca = pca.transform(X_scaled)

結果

print(f'original data: {X_scaled.shape}')
print(f'after PCA data: {X_pca.shape}')
print(f' Explaiend variance ratio : {pca.explained_variance_ratio_}')

PCAの後、次元が30から2に削減されています。そして、説明可能な分散の比は、PCA1が44.2%, PCA2が18.9%で、合計63.1%です。

結果

original data: (569, 30)
after PCA data: (569, 2)
 Explaiend variance ratio : [0.44272026 0.18971182]

可視化のために、pandasを利用し、dataframeの操作を行います。
ガンの陰性と陽性に関する別々のdataframeを作ります。これは最後の散布図で陰性と陽性の色分けをしたいからです。

import pandas as pd
df_X_pca = pd.DataFrame(X_pca, columns=['PC1','PC2'])
df_target = pd.DataFrame(cancer.target, columns=['target'])

df_X_pca = pd.concat([df_X_pca, df_target] , axis=1)
df_X_pca_malignant = df_X_pca[df_X_pca['target'] ==0]
df_X_pca_benign = df_X_pca[df_X_pca['target'] ==1]

可視化のコードです。

fig, ax = plt.subplots( figsize = (10,10))

ax.scatter(x = df_X_pca_malignant['PC1'], y = df_X_pca_malignant['PC2'], color='blue')
ax.scatter(x = df_X_pca_benign['PC1'], marker='^',y = df_X_pca_benign['PC2'], color='red')

ax.legend(['malignant', 'benign'], loc='best')
ax.set_title('PCA')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid()

fig.show()

image.png

感想

PCA、教師なし学習として、なかなか良さそうですね。ロジックも確かでシンプルであることが気に入ります。

参考資料

2017年の本ですが、自分の中で機械学習ベスト1の教材です。
https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984
muller.jpg

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0