1

私は、Spark 2.0.0を使ってバイナリ分類のために訓練されたSVMモデルに問題があります。 まったく同じデータセットを使って、scikit-learnとMLlibを使って同じロジックを辿ってきました。scikit-learnとmllibの予測の違いpython

svc_model = SVC() 
svc_model.fit(X_train, y_train) 

print "supposed to be 1" 
print svc_model.predict([15 ,15,0,15,15,4,12,8,0,7]) 
print svc_model.predict([15.0,15.0,15.0,7.0,7.0,15.0,15.0,0.0,12.0,15.0]) 
print svc_model.predict([15.0,15.0,7.0,0.0,7.0,0.0,15.0,15.0,15.0,15.0]) 
print svc_model.predict([7.0,0.0,15.0,15.0,15.0,15.0,7.0,7.0,15.0,15.0]) 

print "supposed to be 0" 
print svc_model.predict([18.0, 15.0, 7.0, 7.0, 15.0, 0.0, 15.0, 15.0, 15.0, 15.0]) 
print svc_model.predict([ 11.0,13.0,7.0,10.0,7.0,13.0,7.0,19.0,7.0,7.0]) 
print svc_model.predict([ 15.0, 15.0, 18.0, 7.0, 15.0, 15.0, 15.0, 18.0, 7.0, 15.0]) 
print svc_model.predict([ 15.0, 15.0, 8.0, 0.0, 0.0, 8.0, 15.0, 15.0, 15.0, 7.0]) 

、それが返されます:スパークのために

supposed to be 1 
[0] 
[1] 
[1] 
[1] 
supposed to be 0 
[0] 
[0] 
[0] 
[0] 

がやっている:scikitについては は、私は次のコードを持って学ぶ返し

model_svm = SVMWithSGD.train(trainingData, iterations=100) 

print "supposed to be 1" 
print model_svm.predict(Vectors.dense(15.0,15.0,0.0,15.0,15.0,4.0,12.0,8.0,0.0,7.0)) 
print model_svm.predict(Vectors.dense(15.0,15.0,15.0,7.0,7.0,15.0,15.0,0.0,12.0,15.0)) 
print model_svm.predict(Vectors.dense(15.0,15.0,7.0,0.0,7.0,0.0,15.0,15.0,15.0,15.0)) 
print model_svm.predict(Vectors.dense(7.0,0.0,15.0,15.0,15.0,15.0,7.0,7.0,15.0,15.0)) 

print "supposed to be 0" 
print model_svm.predict(Vectors.dense(18.0, 15.0, 7.0, 7.0, 15.0, 0.0, 15.0, 15.0, 15.0, 15.0)) 
print model_svm.predict(Vectors.dense(11.0,13.0,7.0,10.0,7.0,13.0,7.0,19.0,7.0,7.0)) 
print model_svm.predict(Vectors.dense(15.0, 15.0, 18.0, 7.0, 15.0, 15.0, 15.0, 18.0, 7.0, 15.0)) 
print model_svm.predict(Vectors.dense(15.0, 15.0, 8.0, 0.0, 0.0, 8.0, 15.0, 15.0, 15.0, 7.0)) 

supposed to be 1 
1 
1 
1 
1 
supposed to be 0 
1 
1 
1 
1 

私のポーを維持しようとしている私のテストデータは3521レコードと私のトレーニングデータ8356レコードをバランスさせています。評価のために、シキット学習モデルに適用された交差検証は98%の精度を与え、ROC下の面積を0.5とすると、PR下の値は0.74であり、 0.47の訓練誤差です。

また、しきい値をクリアして0.5に戻そうとしましたが、これ以上の結果は得られませんでした。ときどき私が列車テストの分割を変更しているときには、1つの正しい予測を除いて、すなわち1つの正しいゼロ予測を除いてすべてゼロを得るかもしれない。 誰もこの問題にアプローチする方法を知っていますか?

私は、私のデータセットが両方のケースで全く同じであることを何度もチェックしました。それは意志出力生予測スコアを予測するよう

答えて

3

異なる分類子を使用しているため、異なる結果が表示されています。 SklearnのSVCはRBFカーネルを持つSVMです。 SVMWithSGDは、SGDを使用してトレーニングされたリニアカーネルを持つSVMです。彼らは全く異なっている。

結果が一致するようにするには、sklearn.linear_model.SGDClassifier(loss='hinge')を使用し、デフォルトが同じではないため、他のパラメータ(正規化、傍受に合わせるかどうかなど)を一致させることをお勧めします。

+0

しかし、私は "良い"結果に一致したい。 skicit学習法を変更すると全体の分類が壊れてしまいます。同じ方法で実行できるmllibライブラリがありますか? – Kratos

+0

@Kratos私はmllibに精通していません。カーネルSVMをmllib(https://issues.apache.org/jira/browse/SPARK-4638)に追加するというプルリクエストがあるようですが、それは古いものであり、管理者はそれを閉じました。私は問題の1つは、RBFカーネルを持つSVMは、トレーニングの例の数にうまく対応していないということです(sklearn docsは複雑さが二次的であると言う)。私は、ランダムなフォレスト(勾配ブースティングのような他の関連する方法)やニューラルネットワークを試してみるほうがよいと考えています。 –

+0

ありがとうございました。私は本当に立ち往生した:) – Kratos

関連する問題