概要
scikit-learnの主成分分析モデル(PCA)をBiston housing pricesデータに適用して、その挙動を確認する。
主成分が適切に発見されてよい相関が得られることを期待したが、IrisデータやBreast cancerデータの場合のようなクラス分類データにおける良好な結果は得られなかった。
ただし、Boston housing pricesデータはIrisやcancerのデータよりも複雑な社会行動に関するものであり、その指標も限定されていることから、これをもってPCAが回帰系のデータに不向きとまでは言い切れない。
なお、Boston housing pricesデータの特徴量には属性データ(カテゴリーデータ、クラスデータ)が含まれることから、DataFrame
のget_dummis()
メソッドによるone-hot encodingを行っている。
計算の手順
- 必要なパッケージをインポート
- Boston housing pricesデータセットを準備
- データセットをスケーリング/エンコーディング
- 属性データの列を取り出して、get_dummiesでone-hot化
StandardScaler
で残りの特徴量データを標準化- 上記2つを結合して前処理済みデータとして準備
- PCAモデルのインスタンスを生成
- 引数
n_components=2
として、2つの特徴量について計算
- 引数
fit()
メソッドにより、モデルにデータを学習させる- 主成分やその寄与率を確認
- 主成分は
PCA.comonents_
を、寄与率はPCA.explained_variance_ratio_
を確認
- 主成分は
transform()
メソッドによって、主成分に沿ってデータを変換- 3つの主成分について3次元可視化
- 2つの主成分について2次元可視化
前処理
特徴量のうちの1つCHAS
については、「チャールズ川に関するダミー変数(1:川沿い、0:それ以外)」~”Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)“となっていて、0か1の属性変数である。この変数をDataFrame
のget_dummies()
メソッドでone-hot化する。
また、その他のデータについてはStandardScalerで標準化する。
CHAS
のデータのみone-hot化CHAS
の列を除いたデータをStandardScaler
で標準化- 上記2つのデータを
join()
で結合
可視化
2次元
ここではまず、2次元可視化の結果を確認する。
クラス分類の場合は2次元で2つの主成分を確認できるが、回帰データの場合はターゲットの量を確認する必要があるため、グラフの軸を1つ消費する。このため、2次元による表現では1つの主成分による説明性を確認することになる。
- 各点の色や大きさをターゲットの値によって変化させ、2つの軸を2つの主成分に割り当てる方法も考えられるが、直感的にとらえにくくなる。
この結果を見る限り、あまり美しい結果とはなっていない。データを俯瞰した際、各特徴量であまりいい説明ができなかったが、その中でもある程度関係がみられたMDEVやLSTATとの相関と変わらないくらい。
3次元
そこで3次元の可視化にして、2つの主成分による説明性を確認する。
これでもあまりいい結果にならない。ただしグラフを見ると、大きく2つの塊に分かれているように見える。ターゲットである住居価格とは別に、特徴量の組み合わせに隠れている、性質の違うグループがあるのかもしれない。
主成分と寄与率
2つの主成分と寄与率について表示させてみる。
寄与率は第1主成分が50%程度で低いため高い相関が出ないといえるかもしれない。だが、Breast cancerデータセットのクラス分類では第1主成分の寄与率が40%台だが、明確なクラス分類ができていた。やはり回帰系の問題にはPCAは不向きなのかもしれない。
主成分の要素について、先の散布図が第1主成分と負の相関があることから、第1主成分の各特徴量は価格低下に寄与するものはプラス、価格上昇に寄与するものはマイナスとなるはずである。
たとえばZN
やRM
がマイナスなのは頷けるが、DIS
がマイナスなのは微妙。TAX
やPRATIO
がプラスなのも逆のような気がする。
先にも書いたが、Boston housing pricesデータセットで取りそろえられた特徴量は、住居の価格以外の何かを特徴づける傾向が強いのかもしれない。