Closed25

Python 機械学習 3章 分類問題

bayamasabayamasa

pythonはimport名とファイル名を同一にしたらバグる
ex) sklearn.pyというファイルにimport sklearnをしてはいけない。

bayamasabayamasa

ロジスティック回帰

重回帰分析と違うのは、出てくる値が量的か質的か。
量的というのは、具体的な値がでてくるということ。
質的というのはYes or Noといった2値などで分類するといった大きなくくりができるということ

https://gmo-research.jp/research-column/logistic-regression-analysis#:~:text=ロジスティック回帰分析は、いくつ,よく使われています。

bayamasabayamasa

尤度
連続確率分布においてもっともらしい値
最尤度 : もっともっともらしい値

もっともらしいとは、まぁ平均というか代表値みたいな感じ
ある確率があったら最尤度はまぁ大体この値になるかな、という値と一致する
https://www.medi-08-data-06.work/entry/yudo

bayamasabayamasa

ロジスティック回帰のコスト関数がy = 0のときとy = 1のときがあるのがわからない。
ロジスティック回帰は絶対どちらかしか取らない?

bayamasabayamasa

sklearn
二次元スライスにおけるコロンの使い方
iris = datasets.load_iris()
コロンは全部という意味。
なので二次元配列における最初の配列は全部、後の配列は2, 3を取るという感じにする。
X = iris.data[:, [2, 3]]

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]
 [5.4 3.7 1.5 0.2]
... 以下続く
bayamasabayamasa

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
pythonのunpackを使用して、戻り値を複数の引数に格納する。
https://note.nkmk.me/python-tuple-list-unpack/

test_size: データをtrain(訓練)用とtest(検証)用に分類してくれる。
今回は0.3なので7割訓練、3割検証に当ててくれる。

random_state: ランダムさをどのくらいにするか。
0 により、訓練データが常にランダムになる。
1, 2, 3と徐々に値を増やしていくことによってランダム性がすくなってくる。
つまり同じような値が出力される様になる。

stratify: 比率を調整するオプション
例えば分類の判定が0 = 赤, 1 = 青みたいな状態だったりする。
この時、データセットを仕込むときに値に偏りがでて0 が 7個, 1が 3個みたいになっていると困る。

そこで、0と1の値の比率を調整するためにstratify 階層化オプションをyにつける

https://note.nkmk.me/python-sklearn-train-test-split/

bayamasabayamasa

過学習
訓練データに対して適合させすぎてしまったために、実値に対してうまく予想ができないこと

bayamasabayamasa

学習不足のことを高バイアス、過学習のことを高バリアンスといったりする。

bayamasabayamasa

バイアスとバリアンスはトレードオフになる。
単純な学習モデルだとバイアスが大きくなりがち(学習不足)であり、複雑な学習モデルだとバリアンスは大きくなりがち(過学習)である。

bayamasabayamasa

正則化
過学習を防ぐためにバイアスを加えて、なめらかなグラフに直してあげること

L2正則化
以下の式をコスト関数に足すことによって、0に近づけることで過学習を少なくする

\frac{\lambda}{2}\sum_i^n|w_{i}|^{2}
bayamasabayamasa

SVM サポートベクトルマシン

● SVMのメリット
データの次元が大きくなっても識別精度が良い
最適化すべきパラメータが少ない

● SVMのデメリット
学習データが増えると計算量が膨大になる
基本的に2クラス分類に特化している
スケーリングが必要
(SVMでは距離を測定するので、大きい範囲をとる特徴量に引きずられないようにする)

bayamasabayamasa

SVMの目的
SVMの目的はマージンの最大化にある。
マージンとは超平面から最も近い訓練データの距離である。
超平面から最も近い訓練データをサポートベクトルと呼ぶ。

bayamasabayamasa

マージンを大きくとることにより、汎化誤差を小さくする。
ある新しいデータが来たときに、その値が境界線スレスレの値だった場合、その値をどっちに分類するかが悩ましい。
そのためサポートベクトル、つまり境界線から一番近い値と境界線の距離を最大化することで、判別が難しい訓練データもどちらの分類に所属させるかどうかがわかりやすくなり、分類を楽に行うことができる

bayamasabayamasa

ソフトマージン分類
あまりにも誤差を完璧に分類するような学習モデルを作成してしまうと、モデルは過学習に陥ってしまう。
それを避けるために、ある程度の誤差は共有できるようなモデルを作成する。
マージンに対して、パラメータC(重み) × 分類誤差をかけることで許容誤差を算出する。
なお、Cが大きくなれば判定誤差側の重みが増えてより誤差を許容しない関数になり、Cが小さくなれば誤差を許容するような関数になる。

min\left\{\frac{1}{マージン}+ C \times\sum_i\xi\right\}
bayamasabayamasa

numpy vstack hstack

ndarrayを結合する関数
ndarrayとは N-dimensional arrayのことであり、N次元配列を表す。
numpyで使える汎用的なN次元配列
https://deepage.net/features/numpy-ndarray.html

hstack(horizontal stack)
水平結合: 配列に対して水平方向の結合をする。

vstack(vertical stack)
垂直結合: 垂直方向の結合

bayamasabayamasa

決定木
訓練データセットの特微量に基づいて、質問を学習してデータの分類をする。
Irisデータセットなどにおいて、「がく片の長さ」を特微量に設定して質問を「がく片の長さが2.8cm以上か」とする。
このような質問を複数持つことによって、分類する。
これを葉を純粋にするという。

しかし非常に多くの質問を追加することで、よく過学習になってしまう事がある。
このため、決定木には深さ制限を設けて、決定木を剪定(prune)することがある。

bayamasabayamasa

情報利得/不純度

一つのノードに異なるサンプルが含まれる割合を数値化したものを不純度という。

情報利得は親ノードの不純度と子ノードの不純度の差を表す。
例えば親ノードの不純度が大きいが、子ノードの不純度が小さい場合情報利得は最大となる。
これは子ノードにおける質問が的確であるので、サンプルがうまく分類されているということを表している。

bayamasabayamasa

情報利得の式は以下のような形になる。

IG(D_{p}) = I(D_{p}) - \sum_{j=1}^{c}\frac{N_{j}}{N_{p}}I(D_{j})
bayamasabayamasa

一般的には、情報利得は二分探索で行われる。
その際、不純度はジニ不純度/エントロピー/分類誤差の式によって導かれる。
エントロピーの式

I_{H}(t) = - \sum_{c=1}^{C}p(c|t)\log_{2}p(c|t)

ジニ不純度

I_{G} = \sum_{c=1}^{C} p(c|t)(1 - p(c|t)) = 1 - \sum_{c=1}^{C}p(c|t)^{2}

bayamasabayamasa

ランダムフォレストとは
アンサンブル学習のバギングをベースに決定木を学習する方法

アンサンブル学習
複数の機械学習のモデルを使用する事により、強力なモデルを構築する方法
アンサンブル学習には「バギング」と「ブースティング」というやり方があります。

  • バギング
    ブートストラップというやり方を用いて複数のモデルを並列的に学習させていく

  • ブートストラップ
    元データの一部のデータを復元抽出というやり方でサンプリングする。
    バギングの一つのモデルで使用するデータは元データから無作為に指定されるため、同じデータが何回も呼ばれるケースが存在する。

  • ブースティング
    複数モデルを直列に学習させていく方法
    前に作ったモデルの結果を加味して、次のモデルを作成する。
    これにより最終的に作成されるモデルの精度が高い

バギングは速度重視、ブースティングは精度重視だと覚えるとよい
https://mathwords.net/bagging

このスクラップは2021/12/07にクローズされました