2014-11-04 45 views
0

我正在尝试为一个项目生成一些“哪个引擎工作得最好”的数据。我的一般想法是做一些非常简单的事情,选择一个引擎,做一个交叉验证,生成所有交叉验证结果的列表,最大的交叉验证结果是“最好的”。所有测试都在同一套教学数据上完成。这是我的想法的一小部分。然后我会把它放到一个循环中,而不是将simple_clf设置为svm.SVC()有一个引擎循环,并为每个引擎执行其余的代码。基础数据包含特征,记分包含相应的得分值0至9,该特定基础数据项应该生成。scikit-learn cross_validation需要更多关于得分结果的信息

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 

我的问题是,分数不适用于我应该提供什么是“最好的”。分数可以提供.mean()和.std()给我打印。但我不想只是引擎的结果返回完全匹配,而是“密切”匹配。就我而言,close表示数字分数在预期分数的1以内。这就是说,如果预期得分是3,那么2,3或4将被认为是比赛并且是好的结果。

我查看了文档,看起来scikit-learn的最新出版版本中增加了度量包,可以将自定义分数函数传递给网格搜索,但我不确定这是否会足以满足我的需要。因为我也需要能够将它传递给cross_val_score函数,而不仅仅是grid_search,不是吗?无论它不是一种选择,我都被锁定在我必须使用的scikit-learn版本中。

我还注意到在最新的出血边缘版本cross_val_predict的参考,这似乎是我所需要的,但我又被锁定到我使用的版本。

在交叉验证的“良好”定义不是其使用的完全匹配默认值时,在出血性边缘之前做了什么?当然有事情做完了。我只需要指出正确的方向。

由于公司IT政策,我被困在scikit-learn0.11版中,只能使用已批准的软件,而且前一次批准的版本是我唯一的选择。

这是我改变的东西,使用有用的提示来查看0.11文档中的cross_val_score,并发现它可以获得自定义分数函数,并且只要它与参数匹配就可以编写自己的分数函数。这是我现在的代码。这会做什么我要找的,就是生成的不只是基于一个确切的比赛,但结果也当“亲密”,其中接近距离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.15.2,目前发布的版本。 – 2014-11-04 20:25:13

+0

不幸的是,我在0.11卡住了,无处可达0.15.2。其次,自定义记分员只能从度量包提供的选择中获得,那就是你必须使用其中一个记分员。而且他们都提供了比我需要的方式更多的简单预测+/- 1预期是好的定义。直到0.16我才能写出自己的分数函数。除非我错过了一个度量包评分者可以如何通过参数工作。 – bsoplinger 2014-11-04 20:53:10

+0

你为什么坚持使用旧版本?你可以在本地安装一个新的。另外,你可以在0.11中使用你自己的分数函数,界面就不一样了。顺便说一句,也许你会有兴趣研究skll项目。 – 2014-11-05 00:20:14

回答

2

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

+0

企业IT政策。只能使用他们已批准的软件。这就是为什么我卡住了。我将查看cross_val_score的文档,我从来没有想过要在那里看到旧版本的score函数,因为我被困在了GridSearch中。 – bsoplinger 2014-11-05 15:21:26

+0

同样适用于旧的GridSeachCV,它支持相同的参数。另外:说说你的安全批准者;) – 2014-11-05 17:11:30

相关问题