2013-08-06 16 views
7

私は、バナーを見る人によるクリックと変換のデータを使って自分のSVMアルゴリズムを教えようとしています。主な問題は、クリックがすべてのデータの約0.2%であることです。そのため、クリック数に大きな不均衡があります。テスト段階でシンプルなSVMを使用すると、常に「ビュー」クラスのみが予測され、決して「クリック」や「変換」は行われません。平均で99.8%の正解(不均衡のため)が得られますが、「クリック」や「コンバージョン」にチェックを入れると右の予測が0%になります。どのように不均衡を考慮に入れてSVMアルゴリズムを調整する(または別のアルゴリズムを選択する)ことができますか?クラスの不均衡が大きいデータを使用して機械学習アルゴリズムを教える方法はありますか? (SVM)

+0

をアップサンプリングオプション少数クラスですか? –

+0

アップサンプリングで何を意味するのか詳しく教えてください。 – rvnikita

+0

[skalarnロジスティック回帰と不均衡なクラスとの可能な重複](http://stackoverflow.com/questions/14863125/sklearn-logistic-regression-with-unbalanced-classes) –

答えて

24

ここで最も基本的なアプローチは、いわゆる「クラス重み付け方式」を使用することです。古典的なSVM形式では、ミス分類カウントを制御するためにパラメータCが使用されます。クラス1とクラス2にはそれぞれC1C2のパラメータを使用できます。与えられたCためC1C2の最も一般的な選択は、n1n2がそれぞれクラス1及び2のサイズです

C1 = C/n1 
C2 = C/n2 

を置くことです。だからあなたは、より頻繁ではないクラスをミス分類するためにSVMを「罰する」ことができます。

多くの既存のライブラリ(libSVMなど)は、class_weightパラメータを使用してこのメ​​カニズムをサポートしています。 sklearnにPythonとsklearn特に

print __doc__ 

import numpy as np 
import pylab as pl 
from sklearn import svm 

# we create 40 separable points 
rng = np.random.RandomState(0) 
n_samples_1 = 1000 
n_samples_2 = 100 
X = np.r_[1.5 * rng.randn(n_samples_1, 2), 
      0.5 * rng.randn(n_samples_2, 2) + [2, 2]] 
y = [0] * (n_samples_1) + [1] * (n_samples_2) 

# fit the model and get the separating hyperplane 
clf = svm.SVC(kernel='linear', C=1.0) 
clf.fit(X, y) 

w = clf.coef_[0] 
a = -w[0]/w[1] 
xx = np.linspace(-5, 5) 
yy = a * xx - clf.intercept_[0]/w[1] 


# get the separating hyperplane using weighted classes 
wclf = svm.SVC(kernel='linear', class_weight={1: 10}) 
wclf.fit(X, y) 

ww = wclf.coef_[0] 
wa = -ww[0]/ww[1] 
wyy = wa * xx - wclf.intercept_[0]/ww[1] 

# plot separating hyperplanes and samples 
h0 = pl.plot(xx, yy, 'k-', label='no weights') 
h1 = pl.plot(xx, wyy, 'k--', label='with weights') 
pl.scatter(X[:, 0], X[:, 1], c=y, cmap=pl.cm.Paired) 
pl.legend() 

pl.axis('tight') 
pl.show() 

を、使用して

あなたは単にclass_weight='auto'を設定して、自動重み付けをオンにすることができます。

Visualization of above code from sklearn documentation

+0

ありがとう、それは私が探しているものです。私はこの回答に投票するために15ポイントを持っていればいいと思っています:) – rvnikita

+0

私はあなたがまだ "回答を受け入れる"オプションを確認できることを確信しています:) – lejlot

1

本論文では、様々な技術を説明します。あなたはバランス持つまで一つの簡単な(しかし、SVMのための非常に悪い方法では)ちょうど少数クラス(複数可)を複製している:

http://www.ele.uri.edu/faculty/he/PDFfiles/ImbalancedLearning.pdf

+0

完全性のために - 少数派クラスを複製することは絶対にありません。クラスウェイトを使用するのと同じですが、同時にトレーニング(およびテスト)時間に関しては完全に非効率です。 – lejlot

+0

私はlejlotのコメントを反映するために私の元の答えを編集しました。 – denson

関連する問題