特徴量重要度にバイアスが生じる状況ご存知ですか?
なぜこの記事を書いたのか?
決定木をベースにしたアルゴリズムのほとんどに特徴量重要度という指標が存在する。データに対する知識が少ない場合はこの指標を見て特徴量に対する洞察深めることができる。KaggleではEDAのときにとりあえず重要度を見てみるなんてこともするようだ。
しかし、この特徴量重要度にはバイアスが存在していて、特定の条件下では信用出来ないことがある。そういった条件を広く知ってほしいということでこの記事を書いた。
この記事では人工データを生成しバイアスを再現してみた。また、こういったバイアスに対処したという論文を見つけたので軽く紹介する。おまけとしてgainベース以外の特徴量重要度についても紹介する。
目次
- なぜこの記事を書いたのか?
- 想定読者と実験の枠組み
- 想定読者
- 限定する枠組み
- 特徴量重要度とは?
- 特徴量重要度にバイアスが生じる条件
- 1. 解像度が低い場合
- 2. 特徴量同士にdependancyがある場合
- 実験
- 実験設定
- データの解像度が低い場合
- データ生成の設定
- 結果
- 特徴量同士にdependancyがある場合
- データ生成の設定
- 結果
- その他(おまけ)
- 特徴量の分布でバイアスは生じるか
- 判別に寄与する状況下ではどうなるの?
- 特徴量重要度のバイアスに対抗するには?
- 3種の特徴量重要度
- split frequency
- gini importances
- permutation importances
- まとめ
- 2020/09/06 追記
- 参考
AI・機械学習ハンズオン 〜実践Kaggle 初級編〜に参加しました
はじめに
今回はただの日記です。 AI・機械学習ハンズオン 〜実践Kaggle 初級編〜に参加したので、感想を書く。 これから行く人が知りたいだろう情報も書くように心がける。
- はじめに
- 率直な感想
- 対象者は?
- どんなことをやったのか
- データと環境
- データのEDA
- LightGBM推しがすごい
- コンペ解法解説
- Kaggle のシステムの説明
- 懇親会
- さいごに
新曲をプレイするとスコアはいくつ? 〜最大値を利用したスコアの分布推定〜
概要
本記事では音楽ゲーム(以下音ゲ)において、曲をプレイすると得られるスコアを確率変数として、その分布を推定することを試みた。 音ゲのスコアは慣習的に最大値のみが保存されるような仕組みになっている。 そのため、曲をプレイすると得られるスコアは一覧として得られない。 得られるデータと言えば、その曲を何回プレイして最高のスコアはいくつだったかだけである。 そこで、本記事では、その最大値から背景にあるスコアの分布を推定することを試みた。
本記事をすらすらと読むためには、大学学部レベルの確率統計を履修している必要がある。
どうやらスマホでは本記事の数式が見切れてしまうようである。スマホの方は横画面にして読んでほしい。
- 概要
- 分析のモチベーション
- 目的
- SDVXにおけるデータ
- 分析上の仮定
- ノーテーションと目的
- 知っている
- 知りたい
- 推定のための定式化
- 1について
- 2について
- 3について
- 実装
- 推定結果
- レベル17
- レベル18
- レベル19
- レベル20
- 考察
- 実際の実力と比較して
- レベルの難易度が反映されているか
- まとめ
PriorityQueue Classを作る [Pythonで競プロ]
この問題を解くのにpriority queueを使う方法がある。 atcoder.jp
Pythonでpriority queueを実装するためには2つ方法があるがどちらも欠点がある。
heapqを用いた方法
- こちらを用いて実装する方が多いと思う。でもめちゃくちゃ使いづらくないですか?
- これで用意されている関数は、リストに対してin-placeで処理を施す。
- クラスが用意されていない。
from deque import PriorityQueue を用いた方法
- クラスが用意されていて1よりも扱いやすいが、2倍ぐらい遅い。
- 中身が確認できない。(中身でfor を回す等の作業ができない。)
そこで、1をベースにPriorityQueueクラスを用意した。 pushやpopをメソッドとすることで、heapqをそのまま使うよりもスッキリ見やすく実装することができる。 また、インスタンスをそのまま実行するとheapの中身が見られるようにした。
from heapq import heapify, heappop, heappush, heappushpop class PriorityQueue: def __init__(self, heap): ''' heap ... list ''' self.heap = heap heapify(self.heap) def push(self, item): heappush(self.heap, item) def pop(self): return heappop(self.heap) def pushpop(self, item): return heappushpop(self.heap, item) def __call__(self): return self.heap def __len__(self): return len(self.heap)
冒頭に上げた問題で使い方の具体例を示すと、こう。
import sys read = sys.stdin.readline def read_ints(): return list(map(int, read().split())) X, Y, Z, K = read_ints() A = read_ints() B = read_ints() C = read_ints() A.sort(reverse=True) B.sort(reverse=True) C.sort(reverse=True) from heapq import heapify, heappop, heappush, heappushpop class PriorityQueue: def __init__(self, heap): ''' heap ... list ''' self.heap = heap heapify(self.heap) def push(self, item): heappush(self.heap, item) def pop(self): return heappop(self.heap) def pushpop(self, item): return heappushpop(self.heap, item) def __call__(self): return self.heap heap = [] # ヒープといっても順序を工夫したただのリスト q = PriorityQueue(heap) #ここでインスタンスを作ってます q.push((-(A[0] + B[0] + C[0]), 0, 0, 0)) considered = set() ans = [] for k_th in range(1, K+1): heap_max, i, j, k = q.pop() #ここで一番小さな要素(先頭が見られる)を取り出してます ans.append(-heap_max) for di, dj, dk in zip([1, 0, 0], [0, 1, 0], [0, 0, 1]): i_new, j_new, k_new = i + di, j + dj, k + dk if i_new >= X or j_new >= Y or k_new >= Z: continue if (i_new, j_new, k_new) in considered: continue considered.add((i_new, j_new, k_new)) q.push((-(A[i_new] + B[j_new] + C[k_new]), i_new, j_new, k_new)) #ここで要素の追加を行っています。 print(*ans, sep='\n')
逆パームレストを自作した
- はじめに
- 薄すぎるMagic Keyboard
- 底上げ板を自作
- サイズを決定する
- ものを購入
- 作成
- 逆パームレスト
はじめに
たまには日記のようなことを書いていこうと思います。
最近キーボードの配列をJISからUSに変更しました。 ためしに3日間使ってみようという感じでUSを使ってみたのですが、予想以上にプログラミングがしやすくてそのままUSを使い続けようと決心しました。
そして、一昨日、家用にApple Magic Keyboardを購入しました(HHKBとかなり迷いました)。
軽いのでMacbook(JIS)とともに持ち運ぶことも苦じゃないですし、iMacとMacBookのペアリングの切り替えもケーブルでつなぎ替えるだけという楽々仕様で満足しています。
ただ一点を除いては。
続きを読む【具体例つき】scikit-learnを改変しよう ~改変版のinstall方法と改変に必要な知識のリンク集~
はじめに
この記事を読むことで、scikit-learnの中身のコードに改変を加えることができるようになることを期待している。改変に必要な知識も学習できるようリンクを用意してある。そして改変を加えたコードをpipで管理する方法も示した。 最後には具体例として、決定木のfeature_importances_を可視化するメソッドをDecisionTreeClassifierに組み込む。
- はじめに
- 本記事をおすすめしない人
- scikit-learnのディレクトリ構造の俯瞰
- 開発環境を整える
- pyenvを用いた方法
- venvを用いた方法
- 編集した内容が反映されるようにインストールする
- 環境の確認
- pip install --editable
- トラブルシューティング
- 準備完了
- 編集に必要な知識
- Pythonの知識
- scikit-learn
- scikit-learn準拠モデル
- Cythonの知識
- feature_importances_の可視化をscikit-learnに組み込む
- どういう可視化か
- DecisionTreeClassifierの改変
- 可視化、再訪
- まとめ
- ソースコード等