search
LoginSignup
2

posted at

updated at

医療機器データでpythonの特徴量選択 分散とベルヌーイ分布について

@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となった 情報がかなり乏しい 特徴量を削減することに成功しました

次回の記事では医療データにおける機械学習の実装部分を記載したいと思います!

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
What you can do with signing up
2