scikit-learnの説明書

このページでは、厳密な数学的理論はさておき、実務として使う場合に必要な知識をまとめています。

はじめに

定義

目的変数を\( y \)、説明変数を\( \mathbf x = (x_1 ~ x_2 ~ \cdots ~ x_n) \)、学習によって決まる値(パラメータ、重み)を\( \mathbf w = (w_0 ~ w_1 ~ w_2 ~ \cdots ~ w_n) \)とする。 転置記号は省略する。

パラメータ表の赤字はscikit-learnのデフォルト値で、特に指定がなければこの値となる。

モデルの選定

ハイパーパラメータの調整

ハイパーパラメータ(モデルの設定値)は基本的にデフォルト値で問題ない。 デフォルト値で精度が出ない場合に少しずつ変更していくのが良い。 ただし、正直言ってほとんどの場合はハイパーパラメータをいじったところで大きく精度が変わることはない。 精度を上げたいなら、まずはデータの品質向上や前処理など、特徴量エンジニアリングに注力するべきである。 Gabbage In, Gabbage Out(ゴミを入れればゴミが出る)の精神を忘れずに。

Linear Regression

LogisticRegression

概要

目的変数が確率、または二値である場合に使用できる比較的シンプルなモデル。 多クラス分類にも対応している。 パラメータ\( \mathbf w \)は各説明変数が目的変数に与える影響度をそのまま表す。 L1正則化(penalty='l1')を適用することで不要な説明変数を炙り出すこともできる。

詳細

$$f(\mathbf x) = \frac{1}{1 + e^{-(w_0 + w_1 x_1 + w_2 x_2 + ... + w_n x_n)}}$$

※ 多クラス分類の場合は各クラス\( k \)に対して以下の式で確率を計算する。(ソフトマックス)

$$f_k(\mathbf x) = \frac{e^{w_{0,k} + w_{1,k} x_1 + w_{2,k} x_2 + ... + w_{n,k} x_n}}{\sum_{k=1}^{K} e^{w_{0,k} + w_{1,k} x_1 + w_{2,k} x_2 + ... + w_{n,k} x_n}}$$

主要なパラメータ 説明
penalty l2, l1, elasticnet, none 正則化の種類。
  • l2:L2正則化。\( || \mathbf w ||^2 \)。パラメータが大きくなりすぎないように制限をかける。基本はこれ。
  • l1:L1正則化。\( | \mathbf w | \)。L2正則化よりもっとキツイ制限をかける。予測に寄与しない説明変数に係るパラメータ(係数)はほぼ0になるため、特徴選択したいときに有用。
  • elasticnet:L1正則化+L2正則化。L1とL2の比率はl1_ratioで指定できる。
  • none:正則化を行わない。無制限にパラメータが大きくなるため、過学習の危険性あり。
C 1.0 正則化の強さ。正則化項に係る分数の分母の値なので、値を小さくするとより強いパラメータ制限がかかる。
solver lbfgs, liblinear, newton-cg, newton-cholesky, sag, saga 最適化アルゴリズム。 penalty='l2'またはpenalty=Noneのときはlbfgsで良い。 penalty='l1'またはpenalty='elastic'のときはsagaで良い。
max_iter 100 最適化アルゴリズムの最大反復回数。 少ないと学習が収束する前に計算が終わってしまうが、多いと計算時間が長くなる。 基本的に1000回あれば十分収束する印象。
l1_ratio None penalty='elasticnet'のときの、L1正則化の強さ。 0.5なら、\( 0.5 \times L1 + 0.5 \times L2 \)。 0.3なら、\( 0.3 \times L1 + 0.7 \times L2 \)。

Support Vector Classifier (SVC)

$$f( \mathbf x) = \textrm{sgn} \left( \mathbf w \mathbf x + b \right) = \textrm{sgn} \left( \sum_{i=1}^{N} \alpha_i y_i K(\mathbf x_i, \mathbf x) + b \right)$$

※ sgn関数(符号関数)は、入力が正なら1、負なら-1を返す関数。\( \mathbf x_i \)は学習データ、\( y_i \)は学習データのラベル、\( \alpha_i \)はラグランジュ乗数、\( K(\mathbf x_i, \mathbf x) \)はカーネル関数。