Aidemy 2020/9/30
# はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、教師あり学習の二つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・ハイパーパラメータについて
・ロジスティック回帰、線形SVM、非線形SVMのハイパーパラメータ
#ハイパーパラメータ
##ハイパーパラメータとは
・ハイパーパラメータとは、機械学習モデルの中で、__「人が調整しないといけない領域(パラメータ)」__のこと。モデルの種類によってパラメータは異なる。(次項以降で個別に見ていく)
・ハイパーパラメータを人為的に調整することを__チューニング__という。
・モデル構築時にパラメータをチューニングすることができる。(方法は後述)
#ロジスティック回帰のハイパーパラメータ
##パラメータ C
・ロジスティック回帰のハイパーパラメータの一つに__C__というパラメータがある。(初期値1.0)
・Cは__「教師データにどれだけ忠実に境界線を引くか」__の指標になる。すなわち、Cの値が高ければ全ての教師データを分類できるような境界線を引くが、過学習に陥りやすいと言える。
・model=LogisticRegression(C=1.0) のようにして指定する。
##パラメータ penalty
・penalty__というパラメータは、「モデルが複雑になりすぎた際に、特徴量(L1)か全体の重み(L2)を減らして適切に汎化されるようにするもの」である。
・LogisticRegressionの引数に__penalty=L1 のように指定する。
##パラメータ multi_class
・multi_class__というパラメータは「複数のクラス分類を行う際の挙動」__を示している。
・ロジスティック回帰では、二項分類では「クラスに属するか/属さないか」の挙動である__ovr__と指定する。多項分類では「どれくらい属する可能性があるか」の挙動である__multinomial__と指定する。
##パラメータ random_state
・random_state__は「データの処理順を決める乱数のseed」__であり、これを固定することでデータの処理順(=学習の結果)も固定される。
#線形SVMのハイパーパラメータ
##各パラメータ
・C:内容も使い方も同じ。ただし、Cの値が変化するとロジスティック回帰よりも正解率に大きな影響が出る。
・penalty:ロジスティック回帰と同様。
・multi_class:線形SVMでは__ovr__と__crammer_singer__を指定できる。基本的にはovrの方が結果が良くなる。また、二項分類の時はこのパラメータを設定する必要はない。
・random_state:線形SVMでは、サポートベクターの決定時にもこの値が影響を及ぼし、結果が若干変わることがある。
#非線形SVMのハイパーパラメータ
##パラメータ C
・C:内容も使い方も同じ。ただし、ペナルティはCの値を調整することで行われる。
##パラメータ kernel
・kernel__は、非線形SVMの処理の要である「非線形分類を線形分類に直す」動作に使われるカーネル関数を指定する__パラメータ。指定できるのは「rbf」「poly」「linear」「sigmoid」「precomputed」の5つだが、デフォルト値であり正解率の高い「rbf」を使うことが多い。
・「rbf」「poly」は立体投影、「linear」は線形SVMと同じ動作(のため使うことはほぼない)、「sigmoid」はロジスティック回帰モデルと同じ動作、「precomputed」はデータが既に整形済みの時に使う。
##パラメータ decision_function_shape
・__decision_function_shape__は、multi_classと同様に、データがどのクラスに属するかを決めるときの挙動を示す。指定できるのは「ovo」と「ovr」である。
・ovoは、クラスを2つで1つの組み合わせにして、その全ての場合に対して各データを二項分類するやり方である。ovrはデータをそのクラスに属するかを(直接)分類する。ovoの方が計算量が多いので、動作が重くなりやすい。
##パラメータ random_state
・random_state:非線形SVCでは、乱数生成器を別に作成しなければならない。
import numpy as np
from sklearn.svm import SVC
#乱数生成器の作成
a = np.random.RandomState()
model = SVC(random_state = a)
#まとめ
・モデルの中で人為的に調整をしなければならないパラメータを__ハイパーパラメータ__といい、モデルの種類によって設定すべきハイパーパラメータは異なる。
・ロジスティック回帰、線形SVMのハイパーパラメータには__「C」「penalty」「multi_class」「random_state」がある。
・非線形SVMのハイパーパラメータには「C」「kernel」「desicion_function_shape」「random_state」__がある。
今回は以上です。ここまで読んでくださりありがとうございました。