深層学習
畳み込み後のサイズの式
値 | 記号 |
---|---|
幅 | w |
高さ | h |
パディングサイズ | p |
フィルタ(カーネル)サイズ | k |
ストライド | s |
$$ w' = \frac{w + 2p -k}{s} + 1$$ $$ h' = \frac{h + 2p -k}{s} + 1$$
im2col後のサイズの式
便宜上フィルタは正則行列とする(幅と高さが等しい)
入力画像
値 | 記号 |
---|---|
出力サイズの幅 | w' |
出力サイズの高さ | h' |
入力画像のチャンネル数 | C |
フィルタ(カーネル)サイズ | k |
バッチサイズ | B |
im2col後の幅 | im_w |
im2col後の高さ | im_h |
$$ im_w = B \times h' \times w' $$ $$ im_h = C \times k \times k $$
フィルタ
値 | 記号 |
---|---|
フィルタ(カーネル)サイズ | k |
フィルタ数 | N |
im2col後の幅 | im_fw |
im2col後の高さ | im_fh |
$$ im_fw = C * k * k $$ $$ im_fh = N $$
上記の行列積をとることで畳み込みを行うことができる
$$ (フィルタ) \times (入力画像) = (im_fh, im_fw) \times (im_h, im_w) $$
最終的な次元は以下、 $$ (N, B \times h' \times w' \times h') $$
YOLOの出力の次元の式
分割数s=7, 1グリッドあたりのbboxの数b=2, クラス数c=10なら $$出力の次元数 = (分割数) * (bboxの情報数 * bboxの数 + クラス数) = 7 * 7 * (5 * 2 + 10) = (7 * 7 * 20)$$
GoogleNetの特徴
Inceptionモジュール
$5 \times 5$の畳み込みをするより、圧縮して$5 \times 5, 3 \times 3, 1 \times 1$を行う方が次元が減る。
なので、Inceptionモジュールは「スパースな畳み込み」とも呼ばれる
1 * 1の畳み込み
チャンネル方向にのみ畳み込むので、重要なチャンネルを抽出してパラメータを減らすことができる
オーグジュアリロス
ネットワークの途中にも出力を作ることで、途中からもバックプロップさせ勾配消失を避けようとする手法。
あまり現在では使用されない。
Global Average Pooling
- 大きい画像を$1px \times 1px$に縮小するような動作
- CNNの全結合層のパラメータ数を劇的に減らせる。めちゃ使う
ResNeXt
- ResNetとInceptionモジュールが合わさったようなイメージ
- ResNetのブロック内で入力を分岐させる
- 分岐する数をC (cardinality, 濃度)
Xceptionの畳み込み
- 通常の畳み込みを廃止している
Depthwise Separable Convolution
- Depthwise Convolution
- 各チャンネルごとに畳み込み
- Pointwise Convolution
- $1 \times 1$の畳み込み
Object Detection
画像がどこに何があるかを解く問題
R-CNN系
= 画像を切り出す系
- R-CNN
- Selective Search
- 色の似ている領域を取得していく
- 切り出して畳み込む
- Fast R-CNN
- Selective Searchで取ってきた領域に対して、それが何か?と位置の微調整を同時に行ってる
- 何が?がわかるので微調整ができる
- マルチタスク
- ROI Pooling(先に畳み込みもしといて後で切り出す)
- Faster R-CNN
- Selective Searchを廃止
- アンカーボックスを基準点から決められたサイズ、数で置きまくる
YOLO, SSD系
= 画像を切り出さない系
-
YOLO
- 候補領域を抽出するのはR-CNN系と一緒だが、切り出さない
- s * s(多くはs=7)のグリッドで画像を区切って、物体の候補領域とそれが何か?を同時に判定する
- それが何か?はsoftmaxで出力
- 各グリッドごとにb個のバウンディボックス(アンカーボックスみたいな)をおいて判定(多くはb=2)
- 情報は、x, y, h, wに加えて物体である自信度をもつ
- non-maximum suppression(重なってるところ=IOUが一定以上の領域はスコアの高い方を残す)
- IOU→Jaccard係数
- 「背景である」ことと、「物体である」ことは損失関数の計算として別で計算する
-
SSD
- YOLOと違いデフォルトボックスをたくさんおく
- 密集に強い
- VGG16を転移学習してる
- Hard Negative Mining: 正例と負例を最大でも1: 3にしてる(物体じゃないもの=背景は多いので損失に影響しすぎないようにしてる)
IOU(Jaccard係数)の式
- 完全に重なっていれば1, 全く重なっていなければ0 $$ IOU(A, B) = \frac{A \cap B}{A \cup B}$$
ノルムの式
- L1ノルムは絶対値の総和
- L2ノルムは絶対値の2乗の総和の平方根
Bi-directional RNN
- 過去だけでなく、未来からの情報も使用する
- 過去と未来の両方向だからBi-directional
スキップ接続
- RNNにおいて一つ前だけでなくN個前の情報も取得する手法
- 内部で別時間のスケールで進んでいると考えられる
Peephool付きLSTM
- 各ゲートの内容を決めるときに、メモリを参照しながら決めるやり方
- そんなに性能上がらない
LSTMのゲート
入力ゲート
- 入力重み衝突の対策になる
出力ゲート
- 出力重み衝突の対策になる
GRU
- LSTMから発展させて、メモリを取っ払った
- 更新ゲートとリセットゲートの2つがある
- リセットゲートは忘却ゲートみたいなの
- 更新ゲートが、前回の出力と今回出力予定の出力をミックスする役割。
- それぞれ、更新ゲートzと(1 -z)を乗算して最終的な出力とする
式
値 | 記号 |
---|---|
入力 | $x_t$ |
重み | $W$ |
リセットゲートの出力 | $r_t$ |
更新ゲートの出力 | $z_t$ |
時間方向の出力(今回分) | $\tilde{h}_t$ |
時間方向の出力(前回と今回のブレンド) | $h_t$ |
シグモイド関数 | $\sigma$ |
$$ r_t = \sigma (W_r \times [h_{t-1}, x_t] )$$ $$ z_t = \sigma (W_z \times [h_{t-1}, x_t] )$$ $$ \tilde{h}t = tanh(W \times [r \times h_{t-1}, x_t] )$$ $$ h_t = (1 - z_t) \times h_{t-1} + z_t \times \tilde{h}_t $$
Sequence-to-Sequence
- Encorder-Decorderモデルの代表
- Encoder-Decoder を系列データに利用したもの
- 入力系列と出力系列の長さが一致せず、またどちらの系列も長さがまちまちな場合(翻訳など)に特に有用
SentencePiece
- https://kleinblog.net/natural-language-processing.html
Positional Encording
- Attentionで各単語に位置情報のベクトルを追加する
- Attentionはそのままだと入力を一気みするので順番がわからなくなる
OpenAI GPT(Tranceformer)
- これTranceformerとも読んじゃってることもある
- Tranceformerは翻訳用
- Tranceformerで事前学習して、他のタスクを解くこと
- 文章分類、翻訳、質問などなんでもあり
- Encorderとして使用する
- 過去データのみを参照して、次の単語を当てると言う学習を行う
BERT
- OpenAI GPT(Tranceformer)では過去データのみを参照するが未来のデータも使うようにする
- 単語の1部をmask(隠して)そこを当てる
- Masked Language Model
- 系列長(=入力トークン数)は512に決めうちする
- 単語数が512に足りない場合はパディングする
- 逆に多い場合は打ち切る
- [SEP]で区切ると2つの文脈を入力として与えられる(Segment)
- 質問と応答など、2ついれられると実用上便利
- 分類問題用に[CLS](分類クラス)も入れられる
- 単語のベクトル+Segment(A or B)+Positional Encording(位置情報)で入力が構成される
- 学習時は15%のトークンをランダムに選択し、そのトークンに対してのみMasked Language Modelを行う
- 全てをmaskを使って学習すると、pre-training(事前学習)で本モデルを使用するときに、本来の別タスクの学習時に差が出過ぎてしまうから
- 学習効率は悪い
- Next Sentence Prediction
- Masked Language Modelにプラス、これもやる
- 文脈A、Bが正しいペア(文脈的に関係あるか)かどうかを判断する
ALBERT
- BERTの改善モデル
- パラメータが大幅に減った
- Sentence-Order Prediction
- 文脈A、Bが順番が正しいかを判断する
- A→BなのかB→Aなのか
- 学習自体はとても効率よくなるが、与えるデータを調整するだけなのでデメリットがない
正規分布
ベルヌーイ分布
https://kleinblog.net/bernoulli-distribution.html
エントロピー関連
https://kleinblog.net/math-entropy.html
SGDの式
バニラ
- 通常のSGD
$$ g = \frac{\partial L(\theta)}{\theta} $$ $$ \theta = \theta - g $$
Momentum
- 慣性を使って加速させる
$$ g = \frac{\partial L(\theta)}{\theta} $$ $$ m = \mu g + \gamma m $$ $$ \theta = \theta - m $$
- 問題によっては以下の表記で記号が反転するので注意! $$ g = \frac{\partial L(\theta)}{\theta} $$ $$ m = \gamma m - \mu g $$ $$ \theta = \theta + m $$
勾配を下る方(マイナス)にしたときにパラメータがより更新されるか考えてみるといい
NesterovのMomentum
- Momentumだと行きすぎるので、更新後の勾配を近似して予め引く
- Nesterovの加速勾配降下法やNesterov Accelerated Gradient (NAG) ともいう
$$ g = \frac{\partial L(\theta - m)}{\theta} $$ $$ m = \mu g + \gamma m $$ $$ \theta = \theta - m $$
Adagrad
- パラメータごとに最適な学習率を変える(Adaptive)
- 勾配が大きくなるほど学習率が低くなる
- 学習率は常に下がる方向への調整となる $$ g = \frac{\partial L(\theta)}{\theta} $$ $$ h = h - g \times g $$ $$ \theta = \theta - \mu \frac{g}{\sqrt{h} + \epsilon} $$
RMSProp
- Adagradは下がるのみだったが学習率を上げる方向にも調整できる
$$ g = \frac{\partial L(\theta)}{\theta} $$ $$ v = pv + (1 - p)g \times g $$ $$ \theta = \theta - \mu \frac{g}{\sqrt{v} + \epsilon} $$
Adam
- RMSPropの改良版
- 勾配の平均と分散を考慮していい感じに調整する
ワンショット学習
https://business.nikkei.com/article/report/20120118/226265/061500010/
活性化関数の式と微分とグラフ
転移学習とファインチューニング
- 転移学習は学習済みモデルに層を足して、新たなモデルを生成・学習すること
- ファインチューニングは学習済みモデルの重みを変更してチューニングすること 参考記事
SENet
- CNNにAttentionを取り入れたモデル
- SEブロックと言う手法が使われる
Flow-base
- 生成モデル
- VAEより精度が上がり、GANより学習が簡単
GANのモード崩壊対策
Minibatch Discrimination
- ミニバッチ内の画像がどれだけ似てるか?と言う情報もDescriminatorに与える
Wasserstein GAN
- 通常のGANはJensen-Shannon Divergence (JS Divergence)を最小化するように学習をしている
- JS Divergenceは分布の重なりが全くないと無限になってしまう
- Earth Mover’s Distance(EMD)と言う指標を代わりに取り入れる
- 分布を砂山に見立てて、もう一方の分布に全て砂を移すにはどれくらいかかるか?と言うイメージ
DCGANのLeaky ReLU
- DCGANではDiscriminatorの活性化関数にLeaky ReLUを使用している
- Discriminatorが先に学習が進みすぎると、1しか出力しなくなり実質勾配消失が起こるが、Leaky ReLUで多少緩和される
GANの評価方法
rechet Inception Distance(FID)
- InceptionV3と言うCNNに生成された画像を入力として与え、本物の画像と出力のベクトルを比較する
- ベクトルが似てたらGANの精度が高いと言うこと
Wavenet
- NNで音声合成をend2endで行えるモデル
- 従来は、楽譜を作る→音は別(ボコーダ)で鳴らすみたいにしてた
- PixcelCNNと言うCNNがベースになっており、ほぼリアルタイムで生成できるほど高速
- 従来は、時系列データなのでRNNベースだった(遅い)
- Dilated Causal Convolution
- Dilated Convolutionのように隙間を開けながら畳み込む
- 出力に近い層ほど隙間を開ける
- Residual構造
- Gated Activation Units
- 出力の波形は回帰ではなくクラス分類問題として扱っている
numpyの乱数メソッド
形状は全て$(N, M)$とする
平均(mu)と標準偏差(scale)を指定した乱数
np.random.normal(mu, scale, (N, M))
標準正規分布(平均0, 標準偏差1)の乱数
np.random.randn(N, M)
A以上, B未満の乱数
np.random.uniform(A, B, (N, M))
一様乱数(0.0以上、1.0未満)
np.random.rand(N, M) # タプルじゃないので注意!
np.random.rand_sample((N, M)) # こっちはタプル!
A以上, B未満の整数乱数
np.random.randint(A, B, (N, M))
リストやタプルからランダムに取り出す
np.random.choice(list, (N, M))
強化学習の基礎
- 現在の状態(s)の時にある行動(a)をとるべき確率を出力する関数を、方策($\pi$)と呼び$\pi$(s, a)で表す
- 強化学習は方策を求めることを目的としている
- 取りうる状態と行動はルールによって決まってしまっているから
- 行動に応じて、報酬(r)が手に入る
遅延報酬
- 強化学習における最も特徴的なことの一つ
- 報酬(結果)が良かったのか(正しかったのか)がすぐにはわからない
- 画像の分類などは、分類した瞬間に正しいかどうかわかる
多腕バンディット問題
- 強化学習の特殊なケース
- 遅延報酬がなく、すぐに結果がわかる
- スロットみたいなやつ。レバー引いたら結果がすぐ出る
- 1回ずつ試行し、報酬が得られる
- 報酬は確率的にしか得られない
- 同じスロットを回しても、その時の結果が良いか悪いかだけでは判断できない
探索と利用
- 探索は良い報酬が得られるやつを探すこと
- まだやったことない行動
- 利用は良い報酬が得られるやつを利用すること
- 探索と利用のトレードオフ
- どちらもバランスよくやらないといけない
- はじめに判明した良い報酬が得られるやつをすぐに「利用」しても、他にもっと報酬が得られるやつがあるかもしれない
状態価値関数$V^{\pi} (s)$
- 現在の状態sの時に将来的にどれだけの報酬が得られるかの指標
- 状態$s_t$の時に方策$\pi$に従って行動し続けた場合の累積報酬$R(t)$の
期待値
- 現在の状態は、将来的には
平均して
どれくらい報酬が得られそうか?
- 状態$s_t$の時に方策$\pi$に従って行動し続けた場合の累積報酬$R(t)$の
- $V \pi (s)$はベルマン方程式と言う関係を満たす
- 実際にはベルマン方程式を解くのは不可能に近いので、別のやり方を行う
- 動的計画法で理論的にはできるが無理
マルコフ決定過程(Markov decision process; MDP)
- 時刻$t$の時に状態$s_t$とし行動$a_t$を取った時に、報酬$r_t$が得られ状態$s_{t+1}$へと変化するようなモデル
- 現在の状態と行動から、次の状態が決定する
- 時刻$t$からエピソード終了まで行動し得られた、累積報酬は$R$や$G$で表す
- エピソードは、「スロットを回した」「チェスの試合が終わった」などの単位
状態価値関数の計算
-
理論的には以下の通り $$ V^{\pi} (s_t) = r_{t+1} + \gamma V^{\pi} (s_{t+1}) $$ $$ (現在の状態価値) = 次にもらえる報酬 + 次の状態価値 $$
-
しかしエピソードが終わらない可能性がある問題もある(車の運転など)
- そうすると報酬の合計が無限になってしまう
- 割引率$\gamma(<1)$を導入して割引累積報酬を求める
- 未来のことは不確実性が高い
- $\gamma$は未来の状態に行くほど累乗され、より割引きされる
- $\gamma = 0$の場合は直近の報酬のことしか考えないことと等しい
状態と行動の不確実性
- 同じ状態で同じ行動を取るとは限らない(確率的に決定される)
- 同じ状態で同じ行動を取ったとしても次の状態が同じとは限らない
- 車の運転や麻雀などは運の要素はその他の外的要因で同じになるとは限らない
- だからこそ全てを期待値で考える必要がある
- つまり全ての行動と次の状態を知らないといけない
- 現実的にむり
モンテカルロ法
- 解きたい問題のことを知らなくてもとりあえず学習できる(モデルフリー)
- 方策にしたがってランダムに動きまくる
- 実際に動くので信頼性が高い
- 報酬が得られたら、得られた累積報酬を記録しておく
- 何度も繰り返してその状態の時の累積報酬の平均を$V(s)$にする
- 十分に大きい回数繰り返せば必ず最適解が見つかる
- 大規模問題だときつい
TD(Temporal Difference)学習
- モンテカルロ法とベルマン方程式のいいとこ取り(中間)
- ベルマン方程式を近似する
- 今の状態を適当に見積もり、実際に行動して得られた状態と比較して修正する
- TD(0): 次の状態のみを考えて調整する
- $TD( \lambda )$は$\lambda$分先まで考えて調整する
- $TD( \infty )$(エピソード終了まで)はモンテカルロ法と同等(最後までエピソードをやって状態価値関数を更新)
- 行動するたびに状態価値関数を更新していきたい
- 状態価値関数と方策を同時に求めていきたい
行動価値関数$Q(s, a)$
- 状態sの時に行動aを取るのはどれくらい良いか
- 状態価値関数とほぼ同等の考え
- 互いに変形できる
- Qの方がプログラム的にも概念的にも扱いやすい
SARSA
-
実際に観測できたQ値と、今推定していたQ値の差をとって推定値を補正する
- TD学習の考え方そのもの $$ Q(s, a) = Q(s, a) + \alpha (r' + \gamma Q(s', a') - Q(s, a)) $$
-
$r'$は状態sのとき行動aをとり状態s'になったときに手に入った報酬
- $$R(s, a)と書くこともある$$
Q学習
- 方策πによらずに Qが最大になる行動aをとる $$ Q(s, a) = Q(s, a) + \alpha (r' + \gamma max\ Q(s', a') - Q(s, a)) $$
「SARSA」は方策に従って行動しQを更新していく、「Q学習」は方策によらずにQが最大になる行動を取る
- Qの最適化は「価値反復法」と言う
SARSA | Q学習 |
---|---|
方策ON(on-policy) | 方策OFF(off-policy) |
DQN(Deep Q Network)
- 深層強化学習の火付け役
- Qの最適化をNNにやらせる
- 状態$s$を入力すると行動価値関数$Q(s, a)$を出力するネットワーク
- Experience Replay
- 強化学習はデータが時系列(ゲームの進行状況とか)
- それではデータ間に非常に強い相関があるので似たようなデータすぎて学習がうまくいかない
- 状態、行動、報酬を全て記録した上でランダムサンプリングする(これがめちゃ効果ある)
off-policyの方法にしか使えない(On-policyでは方策によって行動が変わるので、順番を変えられない)
報酬のクリッピング
- 報酬を0, 1とかで固定する
- 圧勝したら多く報酬を与えるとかしない
- 報酬の設定が難しすぎて逆に効果が悪くなることが多いため
NoisyNet
- $\varepsilon -greedy$はランダム性を含んでいると言うことは、出力に完全に従うわけではなくノイズを入れていると解釈できる
- $\varepsilon -greedy$をやめて、NNにノイズを入れればNNだけで完結できる!
- 性能もめっちゃ上がる
方策ベースの方法(方策勾配法)
- SARSAやQ学習は状態sと行動aから行動価値関数$Q(s, a)$を解いていた
- sとaを入力してQを求めていた
- しかし、状態sを入力して行動aが出力されればそれでいいのではないか?
- つまり方策$\pi$をNNで求めればいい
- メリット
- 状態価値関数Vや行動価値関数Qを求めるための膨大なメモリが不要
- 連続的な行動でもOK(車がハンドルを切るとか)
- マルコフ決定過程でなくてもよい
- デメリット
- 基本on-policyでの学習になるので効率が悪い(= Experience Replayも使えない)
- 学習がむずすぎる(なので現在はQ学習が最も使われる)
- 収束の保証がない(Q学習はある)
- 有名なやつ
- Actor-Critic
- REINFORCE
- 自然方策勾配法
分散化
- A3C(Asynchronous Advantage Actor-Critic)
- NNのコピーを複数のworkerにコピーする(定期的に重みをworkerにコピーする)
- workerがそれぞれエピソード終了までプレイして、NNに勾配を返す(workerは独立しているので多様性が出る)
AlphaGo
https://kleinblog.net/alphago.html
ONNX
- tfやkeras、pytorchなどの異なるライブラリをクロスプラットフォーム的に横断できる
- tfをいったんONNXに変換してpytorchに戻すみたいな
- まだあまり完成度高くない
軽量化技術
- でかいモデルで学習して軽量化する
量子化
- DLは基本的に32bitでの計算をしている(float32)
- このbit数を8bitや1bitなどで計算すれば単純にモデルが軽くなる
- しかも精度はほぼ落ちない、むしろ上がることもある
- 1bitにする場合は特に、「binarization (2値化)」と呼んでいる
- 重みなどは全て0 or 1で表される
binarization (2値化)の時のメリット
- 全てを0, 1で表すと、$A \times B$と$A xnor B$が等しくなる
- 内積の計算がいらなくなる
- 「内積計算 = 全部足す = 1の数を数える」になる
- CPUにはpopcount(POPCNT)という命令があり、1を数えることができる
- 内積はXNORとPOPCNTの組み合わせで代用可能になる
- 数十倍高速化ができる
枝刈り(pruning)
- 量子化と違い、計算精度を落とすのではなく0に近い重みを削除(枝刈り)する(重みを0にする)
- 絶対値が0に近いものから消していくことを「magnitude-based pruning」と呼ぶ
蒸留(distillation)
- サイズの大きいAのモデルを学習し、その出力をAよりサイズの小さいBのモデルの教師データとして利用する
- 人間が教師データのラベルを設定するときは、[1, 0, 0, 0]のように完全に正解か不正解かの情報しか与えられない
- モデルの出力をラベルにすると[0.6, 0.1, 0.0, 0.3]といったように、NNが似てると判断したなどの情報が入る
- モデルAの
知識 knowledge
と言う - モデルのサイズが同じなら、単純に精度向上も期待できる
- モデルAの
- モデルAを教師モデル、モデルBを生徒モデルとも言う
- 過学習しづらい
- 蒸留が正則化項として働く
- 難しい問題も教師モデルを複数作っておいて、単一の生徒モデルで学習することができる (Knowledge Concentration)
- 犬に特化した教師モデル
- 車に特化した教師モデル
- これらを教師にする
- Adversarial Examplesに耐性ができる
Adversarial Examples
- 普通のNNは、入力にごく僅かな摂動(変化)を加えただけで結果を変えられてしまう
- CNNなら、多少のノイズで違うものと誤認してしまう
- 人の目では変化がわからないがCNNは大きく誤認識するようなデータや、それを生成する手法全般をAdversarial Examplesと言う
- ほとんどのNNに対して効果があり、回避が難しい
- セキュリティ分野や自動運転などへの影響が半端ない
- JSMA
- 任意のクラスに誤認識させる
防御方法
- 蒸留を使うと耐性ができる
- しかし、精度の維持とは若干トレードオフ
分散深層学習
- 大きいモデルの学習にはすごく時間がかかるので、複数のGPUや複数のマシンで並列処理、分散処理をしたい
データ並列
- 1度には処理しきれないデータを分割してそれぞれNNに通して最後に束ねる
- まとめてはGPUがおっつかないとき
- バッチサイズを大きくしているのと同じ効果が見込める
モデル並列
- 1つの画像すら処理できないような超巨大なモデルの時にモデルを分割して、それぞれを別のGPUで演算する
- モデルの分割を並列計算ができるように行うのがむずすぎる
機械学習
回帰
- 連続した値に対してそれを説明する線をひきたい。
最小2乗回帰
- 2乗することで、各点における正負の違いを考えなくて良い。純粋な距離として扱える。 $$ min_w {|| X_w - y ||_2}^2 $$
リッジ回帰
- 最小2乗回帰に正則化項としてL2ノルムを加える $$ min_w {|| X_w - y ||_2}^2 + \alpha {||w||_2}^2 $$
ラッソ回帰
- 最小2乗回帰に正則化項としてL1ノルムを加える $$ min_w {|| X_w - y ||_2}^2 + \alpha ||w|| $$
絶対平均誤差(MAE:Mean Absolute Error)
- 実測値と予測値の差の絶対値の平均値
平均二乗誤差(Mean squared error)
- 実測値と予測値の差の2乗値の平均値
- めっちゃ使う
中央絶対誤差(Median absolute error)
- 実測値と予測値の絶対誤差の中央値。
- 絶対誤差の外れ値の影響を受けにくい。
R2値(R2 score)
- 誤差ゼロの完全モデルで1.0、平均値予測同等で0.0となる。
- 回帰でのみ使う(分類には使えない)
- 平均値予測よりも劣悪な場合はスコアが負となる。
決定木における変数の重要度
- 変数の重要度=重み付け情報ゲインの総和
- 不純度の低下量が情報ゲイン
- 不純度は教師データにおける、正例と負例のバランス
- Giniimpurityかエントロピーで表される
Partial Dependent Plot(PDP)
- 各特徴量が予測値にどのように影響を与えているかを表した図
KNN
- 関数の形が事前に想定されないためノンパラメトリックな手法と言える
- 訓練時はデータの取り込みのみ、推論時にデータを参照し近いものを探すので、推論時の方が時間がかかる
kmeans
- 推論時は学習時にクラスタリングしたものに対して、最も近いクラスタを返却するのみ
エルボー法
- クラスタ数を決めるための方法の1つ
- エルボー図に基づく
- クラスタ数を変化させた時、クラスタの重心点とそのクラスタに属する各点の間の距離の総和をプロットしたもの
- クラスタ数が少ないほど距離の総和は大きくなり、多いほど少なくなる
- エルボー図に基づき、総和の低下が急速に進む箇所と緩やかに進む箇所、それらを分離する場所をクラスタ数の候補とする
- ちなみに、距離の総和はKMeans().inertia_で取得できる
数学/確率統計/Python
ポアソン分布
[参考](https://atarimae.biz/archives/7372#:~:text=%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83%E3%81%A8%E3%81%AF%E3%80%81(%E3%81%A9%E3%81%AE,%E3%82%8F%E3%82%8C%E3%82%8B%E7%A2%BA%E7%8E%87%E5%88%86%E5%B8%83%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82&text=%E3%81%93%E3%81%AE%E6%80%A7%E8%B3%AA%E3%81%8B%E3%82%89%E3%80%81%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83,%E8%80%83%E3%81%88%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
二項分布
loc, iloc
オッズ比
トレース
- 正方行列の対角成分の総和
MAP推定
- 最大事後確率と呼ばれる