我试图生成一些"哪种引擎效果最好"我正在进行的项目的数据。我的一般想法是做一些非常简单的事情,选择引擎,进行交叉验证,生成所有交叉验证结果的列表,最好的是最好的。"所有测试均在同一组教学数据上完成。这是我的想法的片段。然后我将它放入一个循环中,而不是将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( "" )
答案 0 :(得分:2)
您可以找到cross_val_score
here 0.11
的文档
您可以提供自定义存储功能作为score_func
参数,界面只是不同。除此之外:为什么你会“锁定”你当前的版本?它们通常向后兼容两个版本。