機械学習「クラス分類」とは?(学習メモ)
機械学習「クラス分類」について学んだことをメモします。
- クラス分類
- クラス分類の例
- アリゴリズム「サポートベクターマシン(SVM)」
- アリゴリズム「カーネル法」
- クラス分類の分析手順
- データの準備
- クラス分類のためのモデル作成
- クラス分類のための学習
- クラス分類のための予測
- クラス分類のための評価
クラス分類の例
クラス分類の代表的な例としては、以下のようなものがある。
・顧客データによる与信審査
・メールの内容による迷惑メール判断
・がん検診によるがん診断
・手書き数字の認識
・画像の認識
など
アリゴリズム「サポートベクターマシン(SVM)」
サポートベクターマシン(SVM, Support Vector Machine)は、カテゴリを識別する境界線を、マージンが最大になるように引く分析手法。
たとえば、つぎの図にある点を2つのグループに分類することを考える。グループのことをクラスという。
2つのクラス、すなわち、グループに分けるときに、境界線の引き方はいくつかあるが、、 それぞれのクラスの中で、境界線に近い点(サポートベクターという)との距離(マージン)が最大になるように境界線を引く。
境界線に近い点(サポートベクター)を計算すればよい、という考え方により、計算量を減らすことができる。
サポートベクターマシンでは、 ソフトマージンとハードマージンという考え方がある。
・ソフトマージン
データがマージンの中に入る可能性がある。マージンの中に入ったら、ペナルティC を与える
・ハードマージン
データはマージンの中に入らないことを前提
このペナルティ 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 については、何も言わなくてもインポートするものとする。
分析の手順は、教師あり機械学習の手順通り。
データの準備
分析の手順と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)
混同行列は、クラス分類の結果をまとめた行列(表)。
モデルの予測結果に対して、正しく、または誤って分類した数の表。
・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' )
押していただけると励みになります!