2

我计划使用 scikit svm 进行类预测。我有一个由大约 100 个实验组成的两类数据集。每个实验都封装了我的数据点(向量)+ 分类。根据http://scikit-learn.org/stable/modules/svm.html训练 SVM应该是直截了当的。我必须将所有向量放入一个数组中并生成另一个具有相应类标签的数组,训练 SVM。但是,为了运行留一法误差估计,我需要省略一个特定的向量子集——一个实验。如何使用可用的评分功能实现这一目标?

干杯,埃尔

4

1 回答 1

5

您可以手动训练除一个观察之外的所有内容,使用 numpy 索引将其删除。然后你可以使用任何 sklearn 的助手来评估分类。例如:

import numpy as np
from sklearn import svm

clf = svm.SVC(...)
idx = np.arange(len(observations))
preds = np.zeros(len(observations))
for i in idx:
    is_train = idx != i
    clf.fit(observations[is_train, :], labels[is_train])
    preds[i] = clf.predict(observations[i, :])

或者,scikit-learn 有一个 helper 来做 leave-one-out另一个 helper 来获得交叉验证分数

from sklearn import svm, cross_validation
clf = svm.SVC(...)
loo = cross_validation.LeaveOneOut(len(observations))
was_right = cross_validation.cross_val_score(clf, observations, labels, cv=loo)
total_acc = np.mean(was_right)

有关更多信息,请参阅用户指南cross_val_score实际上为每个折叠返回一个分数(这在 IMO 中有点奇怪),但由于我们每次观察都有一个折叠,如果它是错误的,这将是 0,如果它是正确的,则为 1。

当然,leave-one-out 非常慢,并且启动时具有糟糕的统计特性,因此您可能应该使用它KFold

于 2013-07-06T05:13:13.047 回答