LoginSignup
3
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-04-14

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

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

3
2
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
3
2