【问题标题】:Train scikit SVM, customize score assessment训练 scikit SVM,自定义分数评估
【发布时间】:2013-07-04 03:47:35
【问题描述】:

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

干杯, 艾尔

【问题讨论】:

    标签: python svm scikit-learn


    【解决方案1】:

    您可以手动训练除一个观察之外的所有内容,使用 numpy 索引将其丢弃。然后您可以使用any of sklearn's helpers 来评估分类。例如:

    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 有 a helper to do leave-one-outanother helper to get cross-validation scores

    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)
    

    请参阅the user's guide 了解更多信息。 cross_val_score 实际上为每个折叠返回一个分数(这在 IMO 中有点奇怪),但由于我们每次观察都有一个折叠,如果它是错误的,它只会是 0,如果它是正确的,它会是 1。

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

    【讨论】:

    • @larsmans 没什么好奇怪的,只是我通常使用 CV 得到一个完整的预测向量,然后计算准确度/混淆矩阵/关于该完整预测的任何内容。只是一种稍微不同的方式。
    猜你喜欢
    • 2015-05-04
    • 2023-04-09
    • 2013-10-31
    • 2013-04-14
    • 1970-01-01
    • 2019-04-13
    • 2020-06-22
    • 2017-06-21
    • 2016-05-16
    相关资源
    最近更新 更多