Python

PredictivePowerScoreによる特徴選択

TL;DR

  • 機械学習モデルを構築する際に、関連性が高い特徴量が含まれると色々うまくいかない
  • 従来の相関係数だと、数値データのみしか計算できなかったり、非線形な関係は捕捉できないなどの問題点があった
  • Predictive Power Score(PPS)は上記の問題を解決してくれる手法なので、特徴量のブラッシュアップの目安としておすすめ
  • ただし、PPSは他の特徴量との交互作用を考慮できない点には注意が必要
  • Predictive Poser Scoreの詳細はこちら*で確認できます

* Towards Data Science_RIP correlation. Introducing the Predictive Power Score

本題

機械学習モデル構築における特徴量設計が重要なことは言うまでもありません。分析官が知と汗と涙と願いを込めて作成した特徴量。これをどのようにブラッシュアップさせていくかは様々な手法が提案されていますが、今回この記事で紹介するのは、Predictive Power Scoreと呼ばれる特徴選択の手法です。

Predictive Power Score(PPS)は特徴量間の関連性をスコア化する手法です。具体的には、各特徴量のペアを決定木モデルの説明変数と予測変数にとったときの精度をもとにしたスコアを定義算出しています。特徴量間の関連性というと、まず初めに思い浮かぶのは相関分析かと思いますので、相関行列とPPSの違いを明らかにしていくことで、まずはその特徴の概要を説明します。

相関行列 PPS行列
計算できるデータ型 数値データのみ カテゴリデータも計算可能
捕捉できる関連性 線形のみ 非線形も捕捉可能
行列の対称性 対称 非対称

上記比較表を見れば以下のことがまず分かるかと思います。

  • 数値とカテゴリの間の関連性を捕捉できるのが便利
  • 非線形な関係性を捕捉できるのが便利
  • 相関の場合はX->YとY->Xの方向依存性はないので片方だけ計算すればOKだが、PPSの場合は方向依存があるので両方向ともに計算する必要がある(PPS行列は非対称というのを言い直しただけ)

これだけではイメージが湧かないと思うので、トイデータセットを利用して実際に計算してみました。

データセット

今回はSIGNATEさんの練習用データセットである、国勢調査からの収入予測データセットを使わせて頂きました。性別や年齢、学歴などのデモグラ属性から年収5万ドルより高いか低いかのクラス分類にチャレンジするためのデータセットになります。

フォーマット TSV
データ行数 16,280
カラム数 16

16あるカラムの各種説明を以下の表にまとめました。ちなみに、すべてのカラムに明示的な欠損はありませんでした。

カラム名 意味 データ型 平均値/最頻カテゴリ 特記事項
id 識別データ 数値 (IDのため省略)
age 年齢 数値 38.6 最年少は17歳、最年長は90歳
workclass 雇用形態 カテゴリ Private(69.3%) 「?」という暗示的欠損あり
fnlwgt 不明 数値 189975.3 final weight の略語?
education 教育レベル カテゴリ HS-grad (32.0%)
education-num 教育年数 数値 10.1
marital-status 配偶者の有無 カテゴリ Married-civ-spouse (45.8%)
occupation 職業 カテゴリ Prof-specialty (12.6%) 「?」という暗示的欠損あり
relationship 家族形態 カテゴリ Husband (40.2%)
race 人種 カテゴリ White (85.3%)
sex 性別 カテゴリ Male (66.6%)

Femake (33.4%)

capital-gain キャピタルゲイン 数値 1131.1 株式投資における売却益
capital-loss キャピタルロス 数値 88.1 株式投資における売却損
hours-per-week 週当たりの労働時間 数値 40.4
native-country 出身国 カテゴリ United-States (89.4%) 「?」という暗示的欠損あり
Y 年収5万ドル以上か否か カテゴリ <=50K (75.5%)

>50K (24.5%)

この記事ではPythonを使って各種計算をしています。本データの読み込み部分は以下のような感じになります。

import pandas as pd

df = pd.read_csv('/path/to/train.tsv', sep='\t')

相関行列

まずは相関行列の計算をしてみると、以下のようなソースコード、結果になります。

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(data=df.corr(),
            cmap='viridis',
            vmin=-1,
            vmax=1,
            ax=ax)

相関行列は数値データのカラムのみしか計算できないので、上記結果の中に肝心の予測ターゲットカラム「Y」が結果が出現せず、分析結果としては全体的に物足りなさを感じます。

PPS

まったく同じデータセットに対してPPSを計算してみましょう。PPSは以下のコマンドで導入することができます。

pip install ppscore

 

PPS行列の計算は以下のようにたった数行(本質的には1行)で達成できます。

import ppscore as pps

df_pps = pps.matrix(df, random_seed=42)
df_pps_pivot = df_pps.pivot_table(values=['ppscore'],
                                  index=['x'],
                                  columns=['y'])
df_pps_pivot.columns = df_pps_pivot.columns.droplevel()

fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(data=df_pps_pivot, 
            cmap='viridis',
            vmin=0,
            vmax=1,
            ax=ax)

上記を見ると、「Y」も含めたカテゴリ型データの関連性も計算できていることが分かります。結果をもう少し深堀りしてみると、

  1. education ↔ education-num には双方向の強い関連性がある(PPSは双方向で1.0)
  2. relationship → marital-status に対してそれなりに強い予測力がある(PPSは0.65)
  3. 一方で、martial-status → relationship はそこそこの予測力(PPSは0.42)
  4. 予測ターゲットYに対して最も予測力がありそうなのはcapital-gain(PPSは0.32)

ということが分かります。まずは上記3点に関して集計分析をしてみましょう。

educationとeducation-numの関連性

当該2カラムを軸にクロス集計すると下図のようになり、education-numとeducationの間には1対1の関係にあることが分かり、いずれか一つの特徴量のみを残すべきだということが分かります。今回はeducationを特徴量から除外するのが良いかもしれません。なぜなら、教育レベルは名義尺度ではなく順序尺度として扱うべきではないかと推察されるためです。

marital-statusとrelationshipの関連性

marital-statusとrelaionshipのクロス集計し、relationshipで規格化した結果が上図になります。

  • relationshipがHusbandあるいはWifeの場合にはmarital-statushはほぼMarried-civ-spouse
  • relationshipがOwn-childの場合にはNever-marriedのケースが多い

などのように、relationshipが決まるとそれに対応するmarital-statusが絞り込めるケースがあることが分かりますが、一方で、

  • marital-statusがMarries-civ-spouseでも、relationshipがHusbandかWifeかは絞りこみづらい
  • marital-statusがNever-marriedのケースでも複数のrelationsipの選択肢が残る

などのように、marital-status → relationshipは1対Nの度合いが比較的強いことが分かります。これがmarital-statusとrelationshipの間のPPSの非対称性を生んでいる要因と考えられます。したがって、もしいずれか一つの特徴量を残すとするならば、よりPPSが高いrelationshipを選択するのがベターといえます。

機械学習モデルの構築

最後に、Yを予測する機械学習モデルを実際に構築し、PPSスコアとの関係性を確認しました。機械学習モデルの構築にはForecastFlowを利用しました。また、データセットは訓練と検証をそれぞれ7:3に分割し、精度はF1を採用しました。

モデルは以下のようなフローで特徴選択を逐次的に行いました。

  1. 全特徴量を採用したモデルを構築(これがベースライン)
  2. educationを除外
  3. education除外モデルの特徴量重要度およびYに対するPPSが共に低い特徴量をさらに除外
  4. marial-statusを除外
  5. モデル4の重要特徴量の最下位workclassを除外

その結果をまとめたのが以下の表になります。

モデルID 特徴量数 精度
1 14 79.4%
2 13 79.5%
3 9 80.1%
4 8 80.1%
5 7 78.7%

この結果から、モデル4が特徴選択の最終結果と結論付けられます。特徴量数を5種減らしつつ精度も向上させることができました。また、モデル4の重要特徴量は以下のようになりました。

Yに対するPPSで最も高かった capital-gainはモデル重要度の2番目に位置しているので、リーズナブルな結果となりました。一方で、特徴量重要度1位のrelationshipはPPSはほぼ0とかなり低く見積もられていました。これは、ForecastFlowの重要度では他の特徴量との交互作用も考慮しているが、PPSは他の特徴量との交互作用を考慮していないという差異が大きく影響しているのではないかと思われます。したがって、予測ターゲットに対するPPSが低いからと機械的に全部落としてしまうのは危険なことが分かりました。

最後に

PPSを使うことで、データ間の隠れた関連性を簡単に見出すことができました。PPSの計算の仕様上、PPS行列全体を計算するためにはデータの全カラムの2乗個の決定木モデルを構築する必要があるため、カラム数によっては相当計算量が多くなる恐れがありますが、PPSと重要特徴量の2つを見てあげることで、機械学習モデルの軽量化や頑健性の向上につながる特徴選択ができそうな所感を得ることができました。うまく使いこなして皆さんも機械学習モデルの高度化にチャレンジしてみましょう。

ohtomo.yuichi
仕事では人工知能を育てていて、家事ではホモ・サピエンス(♂)の自然知能を育てています。