機械学習記11日目 ~ ロジスティック回帰

 ロジスティック回帰は、クラスを分類する判断に「0」か「1」(正か負)ではなく、「確率」を用います。例えば、与えられたデータがクラス1である確率は80%、そうでない確率は20%のように判断します。つまり、たとえ正の可能性があったとしても、確率が低い場合は決定境界の重みベクトルを修正できます。

 ロジスティック回帰では、このように確立でクラスを分離するわけですが、実際のデータで確立をそのまま計算すると、-150%の確立や1200%の確立などが求められてしまいます。

 そこで、0%~100%の範囲内にデータを押し込めてしまう関数「シグモイド関数」を利用します。シグモイド関数は、次のような関数です(図1)。

f:id:hackU0001:20190302113853p:plain

f:id:hackU0001:20190302113941p:plain

図1.シグモイド関数

 

 シグモイド関数の出力は、0~1の間をなめらかに移動します。つまり、この関数を間に入れることで、常に出力を0~1の間にして、0.5なら50%、0.8%なら80%のように判断するわけです。

 

▶LogisticRegression

 ロジスティック回帰で機械学習を行うには、scikit-learnのLogisticRegressionを使います。書式は図2のようになります。

f:id:hackU0001:20190302115723p:plain

図2.LogisticRegressionの書式

f:id:hackU0001:20190302120446p:plain


 LogisticRegressionの引数にある「penalty」と「C」は「正則化項」と呼ばれます。正則化とは、モデルの「複雑さ」が過剰に増えないように「ペナルティ」を設ける手法なのですが、ここで正則化の話をする前に、「過学習」の話をしておきます。

 過学習とは、学習データに限りなくフィットするように学習させた結果、逆に評価データ(未知のデータ)を与えた時に精度が落ちてしまう現象のことです。そして過学習にならないようにするには、正則化を行うと良いらしいのです。

 モデルの「複雑さ」を表す指標には「L1ノルム正則化」と「L2ノルム正則化」があり、係数である引数Cの値を多くすると正則化が強く働きます。

 今回は、これらのパラメータは使わず(正則化は行わず)機械学習を行ってみます。利用するデータは、irisデータセットではなくdigitsデータセットにします。

 

▶LogisticRegressionによる学習と評価

 基本的な手順は、これまでと全く同じです。

f:id:hackU0001:20190302121545p:plain

 

  digitsデータセットを次のように分割します。

f:id:hackU0001:20190302122311p:plain

 上記のコードの拡大

f:id:hackU0001:20190302122910p:plain

 

 ロジスティック回帰の学習モデルを生成し、学習を行います。

f:id:hackU0001:20190302123518p:plain

 

 評価用データで予測を行います。

f:id:hackU0001:20190302124235p:plain

 

 

これで学習が完了したので、精度を評価します。
f:id:hackU0001:20190302123950p:plain

 

 評価用の正解ラベルを表示してみます。

 

f:id:hackU0001:20190302124754p:plain

f:id:hackU0001:20190302124546p:plain

図3.評価用の正解ラベル

 

 予測したラベルを表示します。

f:id:hackU0001:20190302125007p:plain

f:id:hackU0001:20190302125243p:plain

図4.予測したラベル

 

 irisデータセットと違って予想の正解、不正解を目視で確認するのは大変ですね。そこで、どのくらい正解したのか、scikit-learnのconfusion_matrix関数で調べましょう。

f:id:hackU0001:20190302125834p:plain

図5.confunction_matrix関数

 

 縦軸が0~9までの正解です。横軸がその数字が0~9のうち何なのかを学習モデルが予測した数です。0は0と予測したものが45個、その他の数字に予測したものはありません。1は、1と予測したものが47個、6と予想したものが2個、8と予測したものが3個ありました。