機械学習のためにデータを収集して学習を実行する人のために、経験的な知見をメモしたいと思う。
機械学習に詳しくない人は、「データを片っ端から学習データに加えればうまくいくんだろう」と思っているかもしれない。
しかし、学習データに加える比率を調整したほうが学習がうまくいきやすい。
既に多くの人が指摘しているので、ここではそれらへのリンクを示すことで代用したい。
アンバランスなデータ
アンバランスなデータの場合、損失関数の定義の中で影響してしまう。
それは、学習が損失関数の定義の中で、trainデータの集合が重要になってくるからです。
例:SVM の損失関数の定義 サポートベクターマシン
損失関数の紹介
アンバランスなサンプルの損失関数への影響
仮にポジティブサンプルが1%、ネガティブサンプルが99%のデータセットで、なんの工夫もなしに学習すると無意味な学習結果になってしまいます。
全てに対してFalseを返せば、なんと99%の精度で当てたことになります。
でも、それってほしいものじゃないね。
ですから、学習データの頻度を自分の問題に適するように考えて調整してください。
世の中には、既に有用な記事を書いてくださっている方々がいます。
例:
不均衡データのクラス分類
https://www.slideshare.net/sfchaos/ss-11307051
追記(2020.12.01)
[sklearn.svm.SVC]
(https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
には class_weight という引数にbalanced
という値を与えることで、その問題を解決することができます。
class_weight dict or ‘balanced’, default=None
Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The “balanced” mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y))