2016-08-16 7 views
0

私はscikit SVMを使用していますが、sample_weightsをカスタマイズして、分類子に渡してSVMをテストしたいと思います。通常の実装では、sample_weightsがデフォルト値の1です。 (sample_weightは、ユーザーがいくつかのサンプルに他のサンプルよりも大きな影響を及ぼすことを可能にします)。ワークフローは標準です - 各モデルをトレーニングサブセットに合わせて、保有する開発セットで各モデルをテストして、私のコードはこれです:私はclfを再定義することで分類器を再初期化する必要があります使用するカーネルをテストしていたPythonのScikitクラシファイア `.fit`メソッドを呼び出すと何かが繰り返し実行されますか?

clf = svm.SVC(kernel = 'rbf', gamma = .001) ## initialize the model- i only do this once! 

clf.fit(X_train, y_train) ## fit the model/do the optimization 
accuracy[name + "_no_weights"] = clf.score(X_test, y_test) ## store results 

clf.fit(X_train, y_train, sample_weight = sample_weight_test) ## fit the model/do the optimization w/ different regularization 
accuracy[name + "_w_weights"] = clf.score(X_test, y_test) ## store results 

気付いた場合。ポイントは、私は両方のケースで同じ分類子を訓練していますが、私は分類子を再初期化しません。したがって、2回目に.fitというパラメータが既に初期化されている(ランダムではなく、以前のトレーニングから)ということがあります。これは、第2の方法が不公平な利点を有する可能性があることを意味し、最適化の出発点は良好な決定境界に非常に近いものであった。

これはどのように動作するのか、ご意見がありますか?

答えて

1

これはSVMには関係ありません。常にSVMはグローバルな最小値に収束します。 SVMは「良いソリューションの周りで始まる」わけではありません.SVMはニューラルネットワークではありません。良い初期化は必要ありません。言い換えれば、あなたはあなたが望む回数だけコールすることができ、クラシファイアを再初期化する必要はありません。 sklearnの場合、.fitメソッドは現在のラグランジュ乗数を渡すことさえないので、SVMソルバーの外部の低レベル実装を呼び出します。

+0

Ahh ..二次最適化問題には、ユニークなグローバルな分がありますか?あなたの声明の証拠でしょうか?また、素晴らしい答え。あなたは最高の場合のシナリオでは常にそれが問題だと言っています。 – travelingbones

+0

@travelingbones svm-problemの解決策は必ずしも一意ではありませんが、ここでは重要ではありません。凸最適化問題であるという事実は、大域的最小値に近似する多くのアルゴリズムをもたらす。しかし、これは一部のアルゴリズム(既製のQPソルバ、Coordinate-descent、SMOなど)にのみ当てはまります。現在よく使用されているSGDベースの方法(巨大なデータによく使用される)は、いくつかのメタパラメータ(最も単純です:反復/エポックと学習率が不十分です)によっては失敗する可能性があります。 – sascha

+1

@travelingbonesこのような証拠は、数値分析のためのあらゆる本で見つけることができます。凸関数には、(値の点で)ユニークなものがあります(厳密には、座標上のユニークなものも同様です)。 saschaが示唆していることとは反対に、これはsvmの問題にも当てはまります。しかし、数値的な近似と精度の欠如のために、実際の実装は実際のグローバルな解に収束するのではなく、単に「十分に近い」ものです(これは反復的な最適化にも当てはまります)。 – lejlot

関連する問題