@FukuharaYohei様が作成された上記記事のFilter Methodについて自分なりに調べてみました
Filter Method
Filter Methodは統計的な手法(分散やχ二乗検定など)で特徴量の評価・選択
他の手法に比べると計算量が少なく、最初に足切りで実施するものとのことです
機械学習では説明変数(特徴量)の選択が重要
機械学習(教師あり学習)を使用する際に
目的変数 と 説明変数(特徴量) が重要となります
私が、医療機器管理データベースを利用して医療データ予測のソースコードを研究用に作成している最中に
説明変数(特徴量)がのデータ数が莫大になり
予測に多くの時間がかかり、データ数が多く予想できないとエラーコードが出てしまったため
説明変数(特徴量)を削除しなければいけない状態となりました
そこで@FukuharaYohei様の記事に出会い助けられたため内容を共有します
低分散変数の削除
分散が低ければ、説明変数(特徴量)としての意味ないと考え特徴から削除する方法です
VarianceThreshold関数を使います
今回の例では分散0としており、まったく変動していない特徴を対象とします
分散(variance)の意味
https://ai-trend.jp/basic-study/basic/variance/
統計学において、分散とは数値データのばらつき具合を表すための指標
私が実施したデータでは分散が0の場合
ほとんど特徴量削減ができませんでした
そこで記事でもあったベルヌーイ分布の分散を使いました
ベルヌーイ分布とは
ベルヌーイ分布とは、「成功か失敗か」「表か裏か」「勝ちか負けか」のように2種類のみの結果しか得られないような実験、試行(ベルヌーイ試行)の結果を0と1で表した分布を指します
1である確率がpであるとき0である確率は1-pとなる、非常にシンプルな確率分布です
今回はこのベルヌーイ分布の分散であるp(1 − p)を利用しました
以下のソースコードで
ベルヌーイ分布を利用しpandas.DataFrameデータから特徴量を削減します
#医療機器関連 dataframe から 日付(day)データを消して ベルヌーイ分布の分散期待値を使い 特徴量を削減
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
X = df.drop("day", axis=1)
# デフォルトはしきい値が0、変えたければthresholdに値を渡す
# sel = VarianceThreshold(threshold=(.8 * (1 - .8))) #ベルヌーイ分布の分散期待値を使った例
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
X_new = pd.DataFrame(sel.fit_transform(X), columns=X.columns.values[sel.get_support()])
print('Before Feature Selection:', X.shape)
print('After Feature Selection:', X_new.shape)
result = pd.DataFrame(sel.get_support(), index=X.columns.values, columns=['False: dropped'])
result['variance'] = sel.variances_
print(result)
分散閾値 VarianceThreshold について
分散は正式には 「各データと平均値との差の2乗の平均」です
分散は英語でVariance 分散閾値は英語でVarianceThreshold
VarianceThresholdの公式ドキュメントは以下となります
https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html
公式ドキュメントではVarianceThresholdについて
Feature selector that removes all low-variance features.
低バランスの特徴をすべて取り除く特徴セレクタ
This feature selection algorithm looks only at the features (X), not the desired outputs (y), and can thus be used for unsupervised learning.
この特徴選択アルゴリズムは、望ましい出力(y)ではなく、特徴(X)のみを見るので、教師なし学習に用いることができる
としています
(threshold=(.8 * (1 - .8)))の部分はthreshold 閾値が
.8 * (1 - .8)=0.16としているという意味です
分散閾値 VarianceThreshold の設定はどのような特徴量を利用したいかで
特徴量を選定できる便利な手法であることがわかります
今回の事例では私が医療機器データをどのように前処理したかにより結果は変わりますが
のサイトでも記載されているように
分散が0になるということは
極端な事例 30歳以上の日本人を対象とした調査で「あなたは成人ですか」と質問したら、全員が「ハイ」と回答し、分散0となった ここに情報はない
となってしまいます
今回私が使用した医療機器データに直すと
医療機器データの特徴量として「その日医療機器関連で何があった?」と質問したら、「何もない」とほぼ毎日回答し、
分散がほぼ0となった
となってしまいます
このようなデータを機械学習の特徴量にするには 意味を持たない情報の可能性が高いので
分散が小さいものを ベルヌーイ分布の分散 を利用し選定したということとなります
まとめ
機械学習(教師あり学習)を使用する際に
目的変数 と 説明変数(特徴量) が重要となります
今回 医療機器データベースのAI解析で 特徴量を減らす必要がありました
そこで 分散閾値 VarianceThreshold の設定 ドキュメントを利用しました
医療機器データの特徴量として「その日医療機器関連で何があった?」と質問したら、「何もない」とほぼ毎日回答し、
分散がほぼ0となった 情報がかなり乏しい 特徴量を削減することに成功しました
次回の記事では医療データにおける機械学習の実装部分を記載したいと思います!