为什么我的分类器的交叉验证结果如此不同?

时间:2015-01-20 20:14:45

标签: python machine-learning cross-validation

我正在使用scikit-learn在python中创建一个预测模型,我正在尝试交叉验证以获得有效的F1分数。但是,根据我的简历方法,我得到了非常不同的结果。似乎这样的问题通常是由于过度拟合或数据不好,但在这种情况下,不应该解释我的方法即使在不同的分割中如何给出一致的内部结果,但总是彼此不同。 x是我的数据集,y是标签,rf_best是我的分类器。例如:

cv_scores = cross_val_score(rf_best, x, y, cv=5, scoring='f1')
avg_cv_score = np.mean(cv_scores)

print cv_scores
avg_cv_score

返回

Out[227]:
[ 0.39825853  0.55969686  0.58727599  0.64060356  0.41976476]
0.52111993918160837

while(将cv从5个拆分更改为ShuffleSplit函数)

cv = ShuffleSplit(len(y), n_iter=5, test_size=0.25, random_state=1)

cv_scores = cross_val_score(rf_best, x, y, cv=cv, scoring='f1')
avg_cv_score = np.mean(cv_scores)

print cv_scores
avg_cv_score

返回

Out[228]:
[ 0.88029259  0.86664242  0.8898564   0.87900669  0.86130213]

0.87542004725953615

我确定分类器并没有很好地表现这一点,而且我也不知道如何使用5个shufflesplits过度拟合,特别是当我反复重复运行时。这个:

scores = []
for train, test in KFold(len(y), n_folds=5): #.25 tt split
    xtrain, xtest, ytrain, ytest = x[train], x[test], y[train], y[test]

    rf_best.fit(xtrain, ytrain)    
    scores.append(f1_score(ytest, rf_best.predict(xtest)))

print scores
np.mean(scores)

返回

Out[224]:
[0.3365789517232205, 0.39921963139526107, 0.47179614359341149, .56085913206027882, 0.3765470091576244]

0.42900017358595932

接近同一事物的3种方法怎么能如此一致地返回这样不同的结果?即使我更改随机种子或测试集大小,结果也与上面发布的结果类似。谢谢你的时间。

0 个答案:

没有答案