PythonでLibSVMを使用した分類タスクの例が非常に必要です。入力がどのように見えるのか、どの関数がトレーニングを担当し、どの関数がテストを担当するのかわかりません
LIBSVMは、2つのリストを含むタプルからデータを読み取ります。最初のリストにはクラスが含まれ、2番目のリストには入力データが含まれています。 2つの可能なクラスを持つ単純なデータセットを作成するには、svm_parameterを作成して、使用するカーネルを指定する必要もあります。
>> from libsvm import *
>> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]])
>> param = svm_parameter(kernel_type = LINEAR, C = 10)
## training the model
>> m = svm_model(prob, param)
#testing the model
>> m.predict([1, 1, 1])
ここにリストされているコード例はLibSVM 3.1では機能しないため、多かれ少なかれ移植しました mossplixによる例 :
from svmutil import *
svm_model.predict = lambda self, x: svm_predict([0], [x], self)[0][0]
prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]])
param = svm_parameter()
param.kernel_type = LINEAR
param.C = 10
m=svm_train(prob, param)
m.predict([1,1,1])
この例は、1つのクラスSVM分類子を示していますが、LIBSVMワークフロー全体を示しながら、可能な限り簡単です。
ステップ1:NumPyとLIBSVMをインポート
import numpy as NP
from svm import *
ステップ2:合成データを生成:この例では、指定された境界内の500ポイント(注:かなりの数の実際のデータセットがLIBSVMで提供されます ウェブサイト )
Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)
ステップ3:次に、one-class分類器の非線形決定境界を選択します。
rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ]
ステップ4:次に、この決定境界でデータを任意に分割します。
Class I:あるものonまたはwithin任意のcircle
クラスII:すべてのポイント外部決定境界(円)
SVMモデルの構築はここから始まります。これより前のすべてのステップは、単に合成データを準備することでした。
ステップ5:svm_problemを呼び出して問題の説明を作成し、決定境界関数およびデータを渡して、この結果を変数にバインドします。
px = svm_problem(rx, Data)
ステップ6:非線形マッピングのカーネル関数を選択します
この例では、カーネル関数として[〜#〜] rbf [〜#〜]動径基底関数)を選択しました
pm = svm_parameter(kernel_type=RBF)
_(ステップ7:svm_modelを呼び出して問題の説明(px)&kernel(pm)
v = svm_model(px, pm)
ステップ8:最後に、トレーニング済みモデルオブジェクト( 'v')でpredictを呼び出して、トレーニング済み分類子をテストします
v.predict([3, 1])
# returns the class label (either '1' or '0')
上記の例では、バージョン.0of [〜#〜] libsvm [〜#〜]を使用しました(現時点での現在の安定リリースこの回答は投稿済み)。
最後に、w/r/tの質問の一部カーネル関数の選択について、サポートベクターマシンはない特定のカーネル関数に固有です-たとえば、別のカーネル(ガウス、多項式など)を選択した。
LIBSVMには、最も一般的に使用されるすべてのカーネル関数が含まれています。これは、考えられるすべての選択肢を確認し、モデルで使用するものを選択するための大きな助けです。これは、svm_parameterを呼び出して渡すだけですkernel_type(選択したカーネルの3文字の省略形)の値。
最後に、トレーニング用に選択するカーネル関数は、テストデータに対して使用されるカーネル関数と一致する必要があります。
@shinNoNoirに追加:
param.kernel_typeは、使用するカーネル関数のタイプを表します。0:線形1:多項式2:RBF 3:シグモイド
また、svm_problem(y、x)を覚えておいてください。ここで、yはクラスラベル、xはクラスインスタンスで、xとyはリスト、タプル、および辞書のみです。
これが私がマッシュアップしたダミーの例です:
import numpy
import matplotlib.pyplot as plt
from random import seed
from random import randrange
import svmutil as svm
seed(1)
# Creating Data (Dense)
train = list([randrange(-10, 11), randrange(-10, 11)] for i in range(10))
labels = [-1, -1, -1, 1, 1, -1, 1, 1, 1, 1]
options = '-t 0' # linear model
# Training Model
model = svm.svm_train(labels, train, options)
# Line Parameters
w = numpy.matmul(numpy.array(train)[numpy.array(model.get_sv_indices()) - 1].T, model.get_sv_coef())
b = -model.rho.contents.value
if model.get_labels()[1] == -1: # No idea here but it should be done :|
w = -w
b = -b
print(w)
print(b)
# Plotting
plt.figure(figsize=(6, 6))
for i in model.get_sv_indices():
plt.scatter(train[i - 1][0], train[i - 1][1], color='red', s=80)
train = numpy.array(train).T
plt.scatter(train[0], train[1], c=labels)
plt.plot([-5, 5], [-(-5 * w[0] + b) / w[1], -(5 * w[0] + b) / w[1]])
plt.xlim([-13, 13])
plt.ylim([-13, 13])
plt.show()
SciKit-learnによるSVM:
from sklearn.svm import SVC
X = [[0, 0], [1, 1]]
y = [0, 1]
model = SVC().fit(X, y)
tests = [[0.,0.], [0.49,0.49], [0.5,0.5], [2., 2.]]
print(model.predict(tests))
# prints [0 0 1 1]
_param = svm_parameter('-s 0 -t 2 -d 3 -c '+str(C)+' -g '+str(G)+' -p '+str(self.epsilon)+' -n '+str(self.nu))
_
以前のバージョンについてはわかりませんが、LibSVM 3.xxでは、メソッドsvm_parameter('options')
は1つの引数。
私の場合、C
、G
、p
およびnu
は動的な値です。コードに応じて変更を加えます。
オプション:
_ -s svm_type : set type of SVM (default 0)
0 -- C-SVC (multi-class classification)
1 -- nu-SVC (multi-class classification)
2 -- one-class SVM
3 -- epsilon-SVR (regression)
4 -- nu-SVR (regression)
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in training_set_file)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n: n-fold cross validation mode
-q : quiet mode (no outputs)
_
ドキュメントのソース: https://www.csie.ntu.edu.tw/~cjlin/libsvm/