Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中训练集和测试集的SVM精度较低_Python_Matlab_Machine Learning_Scikit Learn_Octave - Fatal编程技术网

python中训练集和测试集的SVM精度较低

python中训练集和测试集的SVM精度较低,python,matlab,machine-learning,scikit-learn,octave,Python,Matlab,Machine Learning,Scikit Learn,Octave,我正在将一些用于支持向量机(SVM)的matlab/octave脚本移植到python中,但是使用sklearn方法的两个脚本中的一个精度很差 将一些数据加载到垃圾邮件检测模型中 在matlab中,在训练集和测试集中,(代码片段见下文)都能给我99%的准确率 在python中,如果我只使用它们的线性内核,它会给我约56%,如果我为线性内核预计算Gram矩阵,它会给我约44%。(数据和代码-ex6_spam.py-) 奇怪的是,ex6.py中使用的完全相同的方法为我提供了2D数据点的正确分类。它在

我正在将一些用于支持向量机(SVM)的matlab/octave脚本移植到python中,但是使用sklearn方法的两个脚本中的一个精度很差

将一些数据加载到垃圾邮件检测模型中

在matlab中,在训练集和测试集中,(代码片段见下文)都能给我99%的准确率

在python中,如果我只使用它们的线性内核,它会给我约56%,如果我为线性内核预计算Gram矩阵,它会给我约44%。(数据和代码-
ex6_spam.py
-)

奇怪的是,
ex6.py
中使用的完全相同的方法为我提供了2D数据点的正确分类。它在那里的行为几乎与matlab/octave脚本相同

我在
ex6_spam.py中没有做太多工作-我加载了一个培训集:

mat = scipy.io.loadmat('spamTrain.mat')
X = mat["X"]
y = mat["y"]
我将其输入到
sklearn.svm.svm().fit()

我做了一个预测:

p = model.predict(X)
matlab/倍频程等效为

load('spamTrain.mat');

C = 0.1;
model = svmTrain(X, y, C, @linearKernel); # see the link to svmTrain.m above

p = svmPredict(model, X);

然而,结果却大相径庭。你知道为什么吗?我没有机会在另一台计算机上运行它,但可能?

嗯,您必须小心参数/默认值。(1) 默认情况下,matlab具有
autoscale=true
,但在scikit learn中并非如此。因此,如果您的数据尚未标准化,您必须这样做。(2) 也许还有其他区别,一些实现使用C,一些使用1/C。我不确定这里是什么情况。(3) 我打赌matlab在内部也依赖于liblinear或libsvm,所以一切都只是参数调整!(你的
代码链接已失效)谢谢@sascha!(1) 根据文档中是否存在一个单词,这些功能仅采用0或1的值,因此使用C=10(或1e10)而不是C=0时,缩放不会有多大作用(2)。结果几乎相同!(~68%,如果我有C=1e-7或1e-16)(3)matlab问题。依赖于LIbVist/LyBrd/其他库,但是我移植的Matlab脚本使用了(由斯坦福大学的Andrew Ng或他的团队编写的)Coursera练习,它也不调用任何东西,@ SasCHa,我规范/缩放了特征,看看是否会显著地改变结果。但是我的精度范围与我前面提到的相同=/如果您对获得更好的性能感兴趣,那么除了通过交叉验证调整参数之外,您没有什么可以做的(尤其是C;有时精确的优化公式会有所不同;例如,哪些变量是正则化的->这意味着1/C可能不够,即使C是原始方法中的最佳值)。此外,还可以使用其他内核(而非线性内核)更改模型复杂性。但我不确定这是否是您想要的。通常这会有所帮助,但非常依赖于数据。嗯,您必须小心参数/默认值。(1)默认情况下,matlab具有
autoscale=true
,scikit学习中并非如此。因此,如果您的数据尚未标准化,您必须这样做。(2)可能还有其他差异,一些实现使用C,一些使用1/C。我不确定这里的情况是什么。(3)我打赌matlab在内部也依赖于liblinear或libsvm,所以一切都只是参数调整!(你的
一段代码
链接死了)谢谢@sascha!(1)根据文档中是否存在一个单词,这些功能只接受值0或1,因此缩放不会有多大作用(2)C=10(或1e10)而不是C=0.1,结果几乎是相同的(68%,如果我有C=1E-7或1E-16)(3)Matlab PROB。它依赖于LIbVist/LyBLRAND/其他库,但是我移植的MATLAB脚本使用了(由斯坦福大学的Andrew Ng或他的团队编写)。对于Coursera练习,不调用任何其他sealso,@sascha,我规范化/缩放了功能,只是为了看看这是否会显著改变结果,但我的精度范围与我前面提到的相同=/好吧,如果您对获得更好的性能感兴趣,除了通过cro调整参数之外,您没有什么可以做的ss验证(特别是C;有时精确的优化公式不同;例如,哪些变量是正则化的->这意味着1/C可能不够,即使C是原始方法中的最佳值)。此外,也有可能使用其他内核而不是线性内核来更改模型的复杂性。但我不确定这是否是您想要的。通常这会有所帮助,但非常依赖于数据。
load('spamTrain.mat');

C = 0.1;
model = svmTrain(X, y, C, @linearKernel); # see the link to svmTrain.m above

p = svmPredict(model, X);