機械学習記11日目 ~ ロジスティック回帰
ロジスティック回帰は、クラスを分類する判断に「0」か「1」(正か負)ではなく、「確率」を用います。例えば、与えられたデータがクラス1である確率は80%、そうでない確率は20%のように判断します。つまり、たとえ正の可能性があったとしても、確率が低い場合は決定境界の重みベクトルを修正できます。
ロジスティック回帰では、このように確立でクラスを分離するわけですが、実際のデータで確立をそのまま計算すると、-150%の確立や1200%の確立などが求められてしまいます。
そこで、0%~100%の範囲内にデータを押し込めてしまう関数「シグモイド関数」を利用します。シグモイド関数は、次のような関数です(図1)。
シグモイド関数の出力は、0~1の間をなめらかに移動します。つまり、この関数を間に入れることで、常に出力を0~1の間にして、0.5なら50%、0.8%なら80%のように判断するわけです。
▶LogisticRegression
ロジスティック回帰で機械学習を行うには、scikit-learnのLogisticRegressionを使います。書式は図2のようになります。
LogisticRegressionの引数にある「penalty」と「C」は「正則化項」と呼ばれます。正則化とは、モデルの「複雑さ」が過剰に増えないように「ペナルティ」を設ける手法なのですが、ここで正則化の話をする前に、「過学習」の話をしておきます。
過学習とは、学習データに限りなくフィットするように学習させた結果、逆に評価データ(未知のデータ)を与えた時に精度が落ちてしまう現象のことです。そして過学習にならないようにするには、正則化を行うと良いらしいのです。
モデルの「複雑さ」を表す指標には「L1ノルム正則化」と「L2ノルム正則化」があり、係数である引数Cの値を多くすると正則化が強く働きます。
今回は、これらのパラメータは使わず(正則化は行わず)機械学習を行ってみます。利用するデータは、irisデータセットではなくdigitsデータセットにします。
▶LogisticRegressionによる学習と評価
基本的な手順は、これまでと全く同じです。
digitsデータセットを次のように分割します。
上記のコードの拡大
ロジスティック回帰の学習モデルを生成し、学習を行います。
評価用データで予測を行います。
これで学習が完了したので、精度を評価します。
評価用の正解ラベルを表示してみます。
予測したラベルを表示します。
irisデータセットと違って予想の正解、不正解を目視で確認するのは大変ですね。そこで、どのくらい正解したのか、scikit-learnのconfusion_matrix関数で調べましょう。
縦軸が0~9までの正解です。横軸がその数字が0~9のうち何なのかを学習モデルが予測した数です。0は0と予測したものが45個、その他の数字に予測したものはありません。1は、1と予測したものが47個、6と予想したものが2個、8と予測したものが3個ありました。