Python 機械学習 3章 分類問題
pythonはimport名とファイル名を同一にしたらバグる
ex) sklearn.pyというファイルにimport sklearnをしてはいけない。
ロジスティック回帰
重回帰分析と違うのは、出てくる値が量的か質的か。
量的というのは、具体的な値がでてくるということ。
質的というのはYes or Noといった2値などで分類するといった大きなくくりができるということ
オッズについて
尤度
連続確率分布においてもっともらしい値
最尤度 : もっともっともらしい値
もっともらしいとは、まぁ平均というか代表値みたいな感じ
ある確率があったら最尤度はまぁ大体この値になるかな、という値と一致する
ロジスティック回帰のコスト関数がy = 0のときとy = 1のときがあるのがわからない。
ロジスティック回帰は絶対どちらかしか取らない?
numpy clip関数
引数にarray, min, maxを取る。
arrayの中にmin以下、max以上のものがあれば値をmin, maxに合わせる。
外れ値等がある場合に値が大きくずれないようにするための処理
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]
... 以下続く
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y)
pythonの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につける
過学習
訓練データに対して適合させすぎてしまったために、実値に対してうまく予想ができないこと
正則化
過学習を防ぐためにバイアスを加えて、なめらかなグラフに直してあげること
L2正則化
以下の式をコスト関数に足すことによって、0に近づけることで過学習を少なくする
sklearn standardscaler
標準化を行ってくれる。
標準化の式は以下
各成分から平均を引いたものを標準偏差で割る
xi = 各成分, μ = 平均, σ = 標準偏差
SVM サポートベクトルマシン
● SVMのメリット
データの次元が大きくなっても識別精度が良い
最適化すべきパラメータが少ない
● SVMのデメリット
学習データが増えると計算量が膨大になる
基本的に2クラス分類に特化している
スケーリングが必要
(SVMでは距離を測定するので、大きい範囲をとる特徴量に引きずられないようにする)
ソフトマージン分類
あまりにも誤差を完璧に分類するような学習モデルを作成してしまうと、モデルは過学習に陥ってしまう。
それを避けるために、ある程度
の誤差は共有できるようなモデルを作成する。
マージンに対して、パラメータC(重み) × 分類誤差をかけることで許容誤差を算出する。
なお、Cが大きくなれば判定誤差側の重みが増えてより誤差を許容しない関数になり、Cが小さくなれば誤差を許容するような関数になる。
numpy vstack hstack
ndarrayを結合する関数
ndarrayとは N-dimensional arrayのことであり、N次元配列を表す。
numpyで使える汎用的なN次元配列
hstack(horizontal stack)
水平結合: 配列に対して水平方向の結合をする。
vstack(vertical stack)
垂直結合: 垂直方向の結合
決定木
訓練データセットの特微量に基づいて、質問を学習してデータの分類をする。
Irisデータセットなどにおいて、「がく片の長さ」を特微量に設定して質問を「がく片の長さが2.8cm以上か」とする。
このような質問を複数持つことによって、分類する。
これを葉を純粋にするという。
しかし非常に多くの質問を追加することで、よく過学習になってしまう事がある。
このため、決定木には深さ制限を設けて、決定木を剪定(prune)することがある。
情報利得/不純度
一つのノードに異なるサンプルが含まれる割合を数値化したものを不純度という。
情報利得は親ノードの不純度と子ノードの不純度の差を表す。
例えば親ノードの不純度が大きいが、子ノードの不純度が小さい場合情報利得は最大となる。
これは子ノードにおける質問が的確であるので、サンプルがうまく分類されているということを表している。
情報利得の式は以下のような形になる。
一般的には、情報利得は二分探索で行われる。
その際、不純度はジニ不純度/エントロピー/分類誤差の式によって導かれる。
エントロピーの式
ジニ不純度
matplotlib subplot
分割個数
3つの引数が存在するが、省略して記述することもできる。
ランダムフォレストとは
アンサンブル学習のバギングをベースに決定木を学習する方法
アンサンブル学習
複数の機械学習のモデルを使用する事により、強力なモデルを構築する方法
アンサンブル学習には「バギング」と「ブースティング」というやり方があります。
-
バギング
ブートストラップというやり方を用いて複数のモデルを並列的に学習させていく -
ブートストラップ
元データの一部のデータを復元抽出というやり方でサンプリングする。
バギングの一つのモデルで使用するデータは元データから無作為に指定されるため、同じデータが何回も呼ばれるケースが存在する。 -
ブースティング
複数モデルを直列に学習させていく方法
前に作ったモデルの結果を加味して、次のモデルを作成する。
これにより最終的に作成されるモデルの精度が高い
バギングは速度重視、ブースティングは精度重視だと覚えるとよい
このバギングをベースに決定木を複数集めたものをランダムフォレストと呼ぶ。
アンサンブル学習は多数決をベースにするので、複数の決定木の結果の多数決をモデルの結果とする。