我正在为支持向量机(SVM)移植一些matlab / octave脚本到python,但是我使用sklearn方法在两个脚本之一中的准确性很差。
ex6_spam.py
加载了一些数据训练垃圾邮件检测模型。
在matlab中,SVM code provided, svmTrain.m,
(参见下面的代码片段)在训练和测试集中提供了约99%的准确率。
在python中,如果我只使用线性内核,sklearn.svm.SVM().fit()
给我约56%,如果我预先计算线性内核的Gram矩阵,则约为44%。 (数据和代码 - ex6_spam.py
- are here。)
奇怪的是,ex6.py
中使用的完全相同的piece of code给了我正确的2D数据点分类。它的行为几乎与matlab / octave脚本相同。
我在ex6_spam.py
做的不多 - 我加载了训练集:
mat = scipy.io.loadmat('spamTrain.mat')
X = mat["X"]
y = mat["y"]
我将其提供给sklearn.svm.SVM().fit()
:
C = 0.1
model = svmt.svmTrain(X, y, C, "linear")
# this results in
# clf = svm.SVC(C = C, kernel=kernelFunction, tol=tol, max_iter=max_passes, verbose=2)
# return clf.fit(X, y)
我做了一个预测:
p = model.predict(X)
matlab / octave等价物是
load('spamTrain.mat');
C = 0.1;
model = svmTrain(X, y, C, @linearKernel); # see the link to svmTrain.m above
p = svmPredict(model, X);
然而,结果却截然不同。有什么想法吗?我没有机会在另一台计算机上运行它,但也许that's a possible reason?