妊婦がプログラマーになるまで

プログラミング未経験ワーママが産休からPythonで機械学習を学ぶ記録を記します。

機械学習「クラス分類」とは?(学習メモ)

機械学習「クラス分類」について学んだことをメモします。
f:id:damion_n:20210921140308p:plain

クラス分類

クラス分類は、入力データが所属するカテゴリを予測するアルゴリズム

代表的なクラス分類の分析手法には、以下のようなものがある。

サポートベクターマシン
・決定木
ベイズ分類器



クラス分類の例

クラス分類の代表的な例としては、以下のようなものがある。

・顧客データによる与信審査
・メールの内容による迷惑メール判断
・がん検診によるがん診断
・手書き数字の認識
・画像の認識
など



アリゴリズム「サポートベクターマシンSVM)」

サポートベクターマシン(SVM, Support Vector Machine)は、カテゴリを識別する境界線を、マージンが最大になるように引く分析手法。

たとえば、つぎの図にある点を2つのグループに分類することを考える。グループのことをクラスという。
f:id:damion_n:20210921140745p:plain

2つのクラス、すなわち、グループに分けるときに、境界線の引き方はいくつかあるが、、 それぞれのクラスの中で、境界線に近い点(サポートベクターという)との距離(マージン)が最大になるように境界線を引く。
f:id:damion_n:20210921140823p:plain

境界線に近い点(サポートベクター)を計算すればよい、という考え方により、計算量を減らすことができる。



サポートベクターマシンでは、 ソフトマージンとハードマージンという考え方がある。
・ソフトマージン
 データがマージンの中に入る可能性がある。マージンの中に入ったら、ペナルティC を与える
f:id:damion_n:20210921141013p:plain

・ハードマージン
 データはマージンの中に入らないことを前提
f:id:damion_n:20210921141034p:plain

このペナルティ C は、正則化パラメーターともいい、ハイパーパラメーター(スラック変数ともいう)として定義する。
・C が小さい
 誤分類のペナルティが小さい → ソフトマージン志向 → 汎用化につながるが、誤分類の可能性が高くなる
・C が大きい
 誤分類のペナルティが大きい → ハードマージン志向 → 汎用化が失われ、過学習の可能性が高くなる



アリゴリズム「カーネル法

サポートベクターマシンアルゴリズムは、前記のように、直線を使って、クラスを分類する、というものだが、直線だけで分類できない点の配置も出てくる。そういった場合に有効なのが、カーネル法である。平たく言うと、カーネル法は2次元、3次元...など次元を変えて境界線を作り、分類する計算手法。
カーネル法では、説明変数(特徴量)を人が気にしなくても分類できるようになる。回帰分析のときは、相関係数を出して、相関の高いものを説明変数にしたが、サポートベクターマシンでは、説明変数になりえるすべての変数を使う。逆に、どの変数が分類に効いているのかは、わからない。

カーネル法を使った関数には、いくつかある。
・線形カーネル
多項式カーネル
・RBFカーネル(ガウスカーネル)
・双曲線カーネル

一般的には、RBFカーネルを使う場合が多い。scikit-learnの関数でも、デフォルトはRBFカーネルになっている。



RBF カーネルでは、前記の正則化パラメーター C とあわせて、カーネル係数 γ を決めることが必要。 カーネル係数γの値によって、どのような分類になるかが決まる。

・γ が小さい
 単純な境界 → 分類が粗くなる → ざっくりとした分類
・γ が大きい
 複雑な境界 → 分類が細かくなる → モデルが複雑

RBF カーネルでは、ちょうどよい 正則化パラメーター Cとカーネル係数γ を決めていく。このような、ハイパーパラメーターは、あらかじめ人間が決めてあげる必要がある。



クラス分類の分析手順

サポートベクターマシンによる分析は、scikit-learn ライブラリでは、sklearn.svm を使う。
インポートは、以下の通り。

from sklearn import svm

なお、NumPy, pandas, Matplotlib, Seaborn については、何も言わなくてもインポートするものとする。
分析の手順は、教師あり機械学習の手順通り。
f:id:damion_n:20210921143632p:plain



データの準備

分析の手順とAPI

サポートベクターマシンによる分析は、scikit-learn ライブラリでは、sklearn.svm を使います。
インポートは、
from sklearn import svm
です。

なお、NumPy, pandas, Matplotlib, Seaborn については、何も言わなくてもインポートするものとします。

分析の手順は、教師あり機械学習の手順通りです。



図 分析と手順

■ データの準備
分析すべきデータをCSVファイルで準備する。
必要に応じて、欠損値の処理、外れ値の処理などの前処理を行う。
なお、scikit-learn のサポートベクターマシンは、欠損値を許さないため、欠損値に対しては、何らかの処理が必要になる。
サポートベクターマシンを使った分類では、とくに相関係数をみる必要はない。すべての説明変数を使うことができる。
ただし、マシンのリソースなどの関係で、変数を減らしたいときには、主成分分析などを使って変数の数を減らす。または、目的変数が連続値の場合は、単純に、相関係数を見て、相関がなさそうなところから減らしていく。



クラス分類のためのモデル作成

まずは、クラス分類のためのモデルを作る。
サポートベクターマシンで、分類用のRBFカーネルを使い、 次のようなコードで作ることができる。

sklearn.svm.SVC(
    C=1.0, # 正則化パラメーター(>0)
    kernel='rbf',  # アルゴリズム['linear'|'poly'|'rbf'|'sigmoid'|'precomputed'|自作)
    degree=3, # kernel='poly' のときの次数
    gamma='scale',  # kernel=['rbf'|'poly'|'sigmoid'] のときのカーネル係数
    random_state=None # 確率推定のためにデータをシャッフルするときに使用される擬似乱数ジェネレーターのシード
)

クラス分類のための学習

学習は、モデルの fit() 関数を使う。

fit(
    X, # 説明変数
    y, # 目的変数 
    sample_weight=None # 重さ
)

なお、説明変数 X は、変数がひとつであったとしても、2次元の配列や、データフレームでなければならない。



クラス分類のための予測

予測は、モデルの predict() 関数を使う。

predict(
    X # 説明変数
)

predict() 関数で、説明変数X から、目的変数 y を計算してくれる。



クラス分類のための評価

モデルを評価する指標には以下のものがある。

・正解率
・混同行列(Confusion Matrix) から算出する指標
・クラス分類レポートにある指標



・正解率
 実測値と予測値をもとに、正しく分類された割合。

sklearn.metrics.accuracy_score(
    y_true, # 実測値 
    y_pred, # 予測値
    normalize=True, # 正規化
    sample_weight=None 
)

ただし、正解率だけでは、過学習の危険性があるため、モデルの精度は計れない。
したがって、評価の指標としては、つぎの混同行列に基づいた指標、適合率、精度 (Precision)、再現率 (Recall)、 F値 (F-measure, F-score, F1 Score) といったものを確認していく。
とくに、二値分類のときは、AUC と ROC 図 を使って、視覚的に確認することもできる。



・混同行列(Confusion Matrix)
 混同行列は、クラス分類の結果をまとめた行列(表)。
 モデルの予測結果に対して、正しく、または誤って分類した数の表。
f:id:damion_n:20210921144450p:plain

・TP(True Positive): Positive と予測して、実際に Positive だった数
・FN(False Negative): Negative と予測したが、実際は Positive だった数 (失報、見逃し)
・FP(False Positive): Positive と予測したが、実際は Negative だった数 (誤報)
・TN(True Negative): Negative と予測して、実際に Negative だった数

なお、Trueは、予測が正しかったことを意味する。Falseは、予測が正しくなかったことを意味する。
Positive や Negative は、予測すべき値。

混同行列は、以下の confusion_matrix() 関数で作成できる。

sklearn.metrics.confusion_matrix(
    y_true, # 実測値 
    y_pred, # 予測値
    labels=None, # ラベルのリスト
    normalize=True, # 正規化
    sample_weight=None 
)

よく使われる評価指標には、以下のものがある。

・正解率 (Accuracy) = (TP + TN) / (TP + FP + FN + TN)
  全体のデータ中に、TP を TP に、TN を TN に、正しく分類できた割合。高いほど、性能がよい。
  sklearn.metrics.accuracy_score() 関数で取得可

・適合率、精度 (Precision) = TP / (TP + FP)
  正と分類したものの中で実際に正だった割合。高いほど、間違った分類が少ない。

・再現率 (Recall) = 真陽性率 (TPR, True positive rate) = 感度 (Sensitivity) = TP / (TP + FN)
  本来、正と予測するデータが、どの程度、正と予測できたかの割合。高いほど、性能がよい。間違えて正と判断する割合が少ない。ただし、適合率と再現率とはトレードオフの関係にある。

F値 (F-measure, F-score, F1 Score) = 2 / (1 / Precision + 1 / Recall)
  適合率(Precision) と再現率(Recall) のバランスが保たれているかの指標。適合率(Precision) と再現率(Recall) の調和平均。高いほど、バランスが取れている。




・クラス分類レポート
混同行列は、目的変数が2値だけではなく、3つ、4つと、複数のクラスに分けることができる。
3つ以上のクラスに分けたときに、どの変数を正(True)とするのかで、前記の指標が違ってくる。
そこで、metrics.classification_report() 関数が用意されている。
これは、前記の混同行列から計算される指標のうち、以下の値を出力する。

・適合率, 精度 (Precision)
・再現率 (Recall) = 真陽性率 (TPR, True positive rate)
F値 (F-measure, F-score, F1 Score)

二値分類のときはもちろんのこと、三値以上の分類の評価指標も可能。

sklearn.metrics.classification_report(
    y_true, # 実測値
    y_pred, # 予測値
    labels=None,  # ラベルのリスト
    target_names=None, # ラベルの表示名
    sample_weight=None, # 
    digits=2, # 出力時に丸める桁数
    output_dict=False,  # 出力を辞書にする
    zero_division='warn'
)

f:id:damion_n:20210921144741p:plain






押していただけると励みになります!

にほんブログ村 資格ブログ スキルアップへ
にほんブログ村