Python で LibSVM を使用した分類タスクの例が急務です。入力がどのように見えるべきか、どの関数がトレーニングを担当し、どの関数がテストを担当するのかわかりません ありがとう
8 に答える
ここにリストされているコード例は 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 Web サイトで提供されています)
Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)
ステップ 3:ここで、 1 クラス分類器の非線形決定境界を選択します
rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ]
ステップ 4:次に、この決定境界でデータを任意に分割します。
クラス I :任意の円上または円内にあるもの
クラス II : 決定境界外のすべての点(円)
SVM モデルの構築はここから始まります。これより前のすべてのステップは、合成データを準備するためのものでした。
ステップ 5 : svm_problemを呼び出し、決定境界関数とdataを渡して問題の説明を作成し、この結果を変数にバインドします。
px = svm_problem(rx, Data)
ステップ 6:非線形マッピングのカーネル関数を選択する
この例では、カーネル関数としてRBF (動径基底関数) を選択しました。
pm = svm_parameter(kernel_type=RBF)
ステップ 7: svm_modelを呼び出して分類し、問題の説明(px) とカーネル(pm)
v = svm_model(px, pm)
ステップ 8:最後に、トレーニング済みのモデル オブジェクト ('v') でpredictを呼び出して、トレーニング済みの分類器をテストします。
v.predict([3, 1])
# returns the class label (either '1' or '0')
上記の例では、 LIBSVMのバージョン3.0を使用しました (この回答が投稿された時点での最新の安定版リリース)。
最後に、カーネル関数の選択に関する質問の一部について説明します。サポート ベクター マシンは、特定のカーネル関数に固有のものではありません。たとえば、別のカーネル (ガウス、多項式など) を選択した可能性があります。
LIBSVM には、最も一般的に使用されるすべてのカーネル関数が含まれています。これは、もっともらしい代替案をすべて確認し、モデルで使用するものを選択できるため、大きな助けになります。svm_parameterを呼び出して、kernel_type (a選択したカーネルの 3 文字の略語)。
最後に、トレーニング用に選択するカーネル関数は、テスト データに対して使用されるカーネル関数と一致する必要があります。
LIBSVM は、2 つのリストを含むタプルからデータを読み取ります。最初のリストにはクラスが含まれ、2 番目のリストには入力データが含まれます。svm_parameter を作成して、使用するカーネルを指定する必要がある 2 つの可能なクラスを含む単純なデータセットを作成します。
>> 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])
あなたは使用を検討するかもしれません
http://scikit-learn.sourceforge.net/
これには、libsvm の優れた python バインディングがあり、簡単にインストールできるはずです。
@shinNoNoir への追加:
param.kernel_type は、使用するカーネル関数のタイプを表します。0: 線形 1: 多項式 2: RBF 3: シグモイド
また、 svm_problem(y,x) : ここで y はクラス ラベル、x はクラス インスタンス、x と y はリスト、タプル、辞書のみであることに注意してください (numpy 配列ではありません)。
これは私がマッシュアップしたダミーの例です:
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()