我正在尝试为一个项目生成一些“哪个引擎工作得最好”的数据。我的一般想法是做一些非常简单的事情,选择一个引擎,做一个交叉验证,生成所有交叉验证结果的列表,最大的交叉验证结果是“最好的”。所有测试都在同一套教学数据上完成。这是我的想法的一小部分。然后我会把它放到一个循环中,而不是将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("")
自定义分数是在0.15.2,目前发布的版本。 – 2014-11-04 20:25:13
不幸的是,我在0.11卡住了,无处可达0.15.2。其次,自定义记分员只能从度量包提供的选择中获得,那就是你必须使用其中一个记分员。而且他们都提供了比我需要的方式更多的简单预测+/- 1预期是好的定义。直到0.16我才能写出自己的分数函数。除非我错过了一个度量包评分者可以如何通过参数工作。 – bsoplinger 2014-11-04 20:53:10
你为什么坚持使用旧版本?你可以在本地安装一个新的。另外,你可以在0.11中使用你自己的分数函数,界面就不一样了。顺便说一句,也许你会有兴趣研究skll项目。 – 2014-11-05 00:20:14