python中scikit学习和mllib的差异
我对使用Spark 2.0.0为二元分类训练的SVM模型有一个问题。 我使用scikit学习和MLlib遵循相同的逻辑,使用完全相同的数据集。 对于scikit学习,我有以下代码:python中scikit学习和mllib的差异,python,apache-spark,scikit-learn,apache-spark-mllib,prediction,Python,Apache Spark,Scikit Learn,Apache Spark Mllib,Prediction,我对使用Spark 2.0.0为二元分类训练的SVM模型有一个问题。 我使用scikit学习和MLlib遵循相同的逻辑,使用完全相同的数据集。 对于scikit学习,我有以下代码: 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,
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]
对于我所做的:
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条记录。对于评估,在scikit学习模型上应用的交叉验证给出了98%的准确度,对于spark,ROC下的面积为0.5,PR下的面积为0.74,而
0.47训练错误
我还尝试清除阈值并将其设置回0.5,但这并没有返回任何更好的结果。有时,当我更改列车测试拆分时,我可能会得到除一个正确预测外的所有零或除一个正确零预测外的所有零。
有人知道如何解决这个问题吗
正如我所说,我多次检查我的数据集在这两种情况下是否完全相同。
clearThreshold()
注:实验性
清除阈值,以便predict将输出原始预测分数。它仅用于二进制分类
版本1.4.0中的新功能
如果只需要预测类,请删除此函数调用。
clearThreshold()
注:实验性
清除阈值,以便predict将输出原始预测分数。它仅用于二进制分类
版本1.4.0中的新功能
如果只需要预测类,请删除此函数调用。您使用的分类器不同,因此得到的结果也不同。Sklearn的SVC是一种带有RBF核的SVM;SVMWithSGD是一种使用SGD训练线性核的SVM。他们完全不同
如果您想匹配结果,那么我认为应该使用
sklearn.linear\u model.sgdclassizer(loss='铰链')
并尝试匹配其他参数(正则化、是否适合截距等),因为默认值不一样。您使用的分类器不同,因此得到的结果也不同。Sklearn的SVC是一种带有RBF核的SVM;SVMWithSGD是一种使用SGD训练线性核的SVM。他们完全不同
如果你想匹配结果,那么我认为应该使用
sklearn.linear\u model.sgdclassizer(loss='铰链')
,并尝试匹配其他参数(正则化、是否适合截距等),因为默认值不一样。我已经更新了我的帖子。谢谢你的澄清。我已经更新了我的帖子。谢谢你的澄清。但我想匹配“好”的结果。改变skicit学习方法只会破坏整个分类。有没有一个mllib库可以以同样的方式运行?@Kratos我不熟悉mllib;似乎有一个向mllib()添加内核支持向量机的请求,但它很旧,维护人员关闭了它。我猜其中一个问题是,带有RBF核的SVM不能很好地与训练示例的数量进行缩放(sklearn文档称复杂性大于二次)。如果你需要一个非线性分类器,我认为最好尝试随机森林(其他相关的方法,如梯度增强)或神经网络,但我想匹配“好”的结果。改变skicit学习方法只会破坏整个分类。有没有一个mllib库可以以同样的方式运行?@Kratos我不熟悉mllib;似乎有一个向mllib()添加内核支持向量机的请求,但它很旧,维护人员关闭了它。我猜其中一个问题是,带有RBF核的SVM不能很好地与训练示例的数量进行缩放(sklearn文档称复杂性大于二次)。如果你需要一个非线性分类器,我认为最好尝试随机森林(其他相关的方法,如梯度增强)或神经网络。