对于相同的数据集(此处为 Bupa)和参数,我得到不同的准确度。
我忽略了什么?
R 实现:
data_file = "bupa.data"
dataset = read.csv(data_file, header = FALSE)
nobs <- nrow(dataset) # 303 observations
sample <- train <- sample(nrow(dataset), 0.95*nobs) # 227 observations
# validate <- sample(setdiff(seq_len(nrow(dataset)), train), 0.1*nobs) # 30 observations
test <- setdiff(seq_len(nrow(dataset)), train) # 76 observations
svmfit <- svm(V7~ .,data=dataset[train,],
type="C-classification",
kernel="linear",
cost=1,
cross=10)
testpr <- predict(svmfit, newdata=na.omit(dataset[test,]))
accuracy <- sum(testpr==na.omit(dataset[test,])$V7)/length(na.omit(dataset[test,])$V7)
我得到准确度:0.94
但是当我在 python (scikit-learn)
中执行以下操作时import numpy as np
from sklearn import cross_validation
from sklearn import datasets
import pandas as pd
from sklearn import svm, grid_search
f = open("data/bupa.data")
dataset = np.loadtxt(fname = f, delimiter = ',')
nobs = np.shape(dataset)[0]
print("Number of Observations: %d" % nobs)
y = dataset[:,6]
X = dataset[:,:-1]
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.06, random_state=0)
clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
scores = cross_validation.cross_val_score(clf, X, y, cv=10, scoring='accuracy')
我得到准确度 0.67
请帮助我。
最佳答案
我发现这篇文章有同样的问题——scikit-learn 和 e1071 绑定(bind)的 libSVM 之间的准确度大不相同。我认为问题在于 e1071 缩放训练数据然后保留缩放参数以用于预测新观察。 Scikit-learn 不会这样做,而是让用户意识到需要对训练数据和测试数据采用相同的缩放方法。我只是在遇到和阅读后才想到检查这个this guide来自 libSVM 背后的好人。
虽然我没有你的数据,str(svmfit)
应该给你缩放参数(Bupa
列的均值和标准差)。您可以使用它们在 Python 中适本地缩放您的数据(请参阅下面的想法)。或者,您可以在 Python 中一起缩放整个数据集,然后进行测试/训练拆分;无论哪种方式现在都应该给你相同的预测。
def manual_scale(a, means, sds):
a1 = a - means
a1 = a1/sds
return a1
关于python - python (Scikit-Learn) 和 R (e1071) 的精度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743791/