scikit-learn cross_validation需要有关结果得分的更多信息

时间:2014-11-04 16:36:29

标签: python scikit-learn

我试图生成一些"哪种引擎效果最好"我正在进行的项目的数据。我的一般想法是做一些非常简单的事情,选择引擎,进行交叉验证,生成所有交叉验证结果的列表,最好的是最好的。"所有测试均在同一组教学数据上完成。这是我的想法的片段。然后我将它放入一个循环中,而不是将simple_clf设置为svm.SVC(),而是有一个引擎循环,并为每个引擎执行其余的代码。基础数据在featurevecs中,并且scorenums包含特定基础数据项应该生成的对应分数值0到9。

    X_train, X_test, y_train, y_test = train_test_split(
        featurevecs, scorenums, test_size = 0.333, random_state = 0 )
    # this would be in a loop of engine types but I'm just making sure basic code works
    simple_clf = svm.SVC()
    simple_clf = grid_search.GridSearchCV( simple_clf, CLFPARAMS, cv = 3 )
    simple_clf.fit( X_train, y_train )
    kf = cross_validation.KFold( len( X_train ), k = 5 )
    scores = cross_validation.cross_val_score( simple_clf, X_test, 
                                               y_test, cv = kf )
    print scores.mean(), scores.std() / 2
    # loop would end here

我的问题是,分数并不适用于我应该提供的最好的内容。" s#34;最好。"分数可以提供.mean()和.std()供我打印。但是,我不希望引擎的结果返回完全匹配,而且还要关闭"关闭"比赛。在我的情况下,关闭意味着数字分数在预期分数的1之内。也就是说,如果预期得分为3,则2,3或4将被视为匹配且结果良好。

我查看了文档,似乎scikit-learn的最新前沿版本添加了metrics包,允许将自定义得分函数传递给网格搜索,但我不确定是否会足以满足我的需要。因为我还需要能够将它传递给cross_val_score函数,而不仅仅是grid_search,不是吗?无论它不是一个选项,我都会被锁定到我必须使用的scikit-learn版本。

我还注意到最新前沿版本中对cross_val_predict的引用,这似乎正是我所需要的,但我再次被锁定在我使用的版本中。

在#34; good"的定义之前做了什么?对于cross_validation,它使用的确切匹配默认值是不是?当然有些事情已经完成。我只需要指出正确的方向。

由于公司的IT政策,我坚持使用0.11版本的scikit-learn,只能使用经批准的软件,而且之前批准的版本对我来说是唯一的选择。

这里是我改变了什么,使用有用的提示来查看0.11文档中的cross_val_score并发现它可以获得自定义分数函数,并且只要它匹配参数我就可以编写自己的分数函数。这是我现在的代码。这会做我想要的,那就是产生的结果不仅基于完全匹​​配,而且基于"关闭" close定义为1。

# KLUDGE way of changing testing from match to close
SCORE_COUNT = 0
SCORE_CROSSOVER_COUNT = 0

def my_custom_score_function( y_true, y_pred ):
    # KLUDGE way of changing testing from match to close
    global SCORE_COUNT, SCORE_CROSSOVER_COUNT
    if( SCORE_COUNT < SCORE_CROSSOVER_COUNT ):
        close_applies = False
    else:
        close_applies = True
    SCORE_COUNT += 1
    print( close_applies, SCORE_CROSSOVER_COUNT, SCORE_COUNT )

    deltas = np.abs( y_true - y_pred )
    good = 0
    for delta in deltas:
        if( delta == 0 ):
            good += 1
        elif( close_applies and ( delta == 1 ) ):
            good += 1

    answer = float( good ) / float( len( y_true ) )
    return answer

主程序的代码段:

        fold_count = 5
        # KLUDGE way of changing testing from match to close
        # set global variables for custom scorer function
        global SCORE_COUNT, SCORE_CROSSOVER_COUNT
        SCORE_COUNT = 0
        SCORE_CROSSOVER_COUNT = fold_count

        # do a simple cross validation
        simple_clf = svm.SVC()
        simple_clf = grid_search.GridSearchCV( simple_clf, CLFPARAMS, cv = 3 )
        simple_clf.fit( X_train, y_train )
        print( '{0} '.format( test_type ), end = "" )
        kf = cross_validation.KFold( len( X_train ), k = fold_count )
        scores = cross_validation.cross_val_score( simple_clf, X_train, y_train,
                                                   cv = kf,
                                                   score_func = my_custom_score_function )
        print( 'Accuracy (+/- 0) {1:0.4f} (+/- {2:0.4f}) '.format( scores, scores.mean(),
                                                                   scores.std() / 2 ), 
                                                                   end = "" )
        scores = cross_validation.cross_val_score( simple_clf, X_train, y_train,
                                                   cv = kf,
                                                   score_func = my_custom_score_function )
        print( 'Accuracy (+/- 1) {1:0.4f} (+/- {2:0.4f}) '.format( scores, scores.mean(),
                                                                   scores.std() / 2 ), 
                                                                   end = "" )
         print( "" )

1 个答案:

答案 0 :(得分:2)

您可以找到cross_val_score here 0.11的文档 您可以提供自定义存储功能作为score_func参数,界面只是不同。除此之外:为什么你会“锁定”你当前的版本?它们通常向后兼容两个版本。