我有一组数据,我正在使用Extra Trees Classifier开发一个预测模型,正如下面的代码所示,在最初的代码集上显示et_scores看起来非常令人失望我跑得很合适,请看下面的内容,它看起来很像更好,然后我做了一个学习图,事情看起来不太热。总而言之,令人困惑。 初始代码:
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.cross_validation import cross_val_score
#split the dataset for train and test
combnum['is_train'] = np.random.uniform(0, 1, len(combnum)) <= .75
train, test = combnum[combnum['is_train']==True], combnum[combnum['is_train']==False]
et = ExtraTreesClassifier(n_estimators=200, max_depth=None, min_samples_split=10, random_state=0)
labels = train[list(label_columns)].values
tlabels = test[list(label_columns)].values
features = train[list(columns)].values
tfeatures = test[list(columns)].values
et_score = cross_val_score(et, features, labels.ravel(), n_jobs=-1)
print("{0} -> ET: {1})".format(label_columns, et_score))
给我:
['Campaign_Response'] -> ET: [ 0.58746427 0.31725003 0.43522521])
不太热! 然后根据我提供的数据:
et.fit(features,labels.ravel())
et.score(tfeatures,tlabels.ravel())
Out[16]:0.7434136771300448
没那么糟糕 那么关于训练数据:
et.score(features,labels.ravel())
Out[17]:0.85246473144769563
同样,相当不错,但与之前的分数无关? 然后跑:
from sklearn.learning_curve import validation_curve
def plot_validation_curve(estimator, X, y, param_name, param_range,
ylim=(0, 1.1), cv=5, n_jobs=-1, scoring=None):
estimator_name = type(estimator).__name__
plt.title("Validation curves for %s on %s"
% (param_name, estimator_name))
plt.ylim(*ylim); plt.grid()
plt.xlim(min(param_range), max(param_range))
plt.xlabel(param_name)
plt.ylabel("Score")
train_scores, test_scores = validation_curve(
estimator, X, y, param_name, param_range,
cv=cv, n_jobs=n_jobs, scoring=scoring)
train_scores_mean = np.mean(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
plt.semilogx(param_range, train_scores_mean, 'o-', color="r",
label="Training score")
plt.semilogx(param_range, test_scores_mean, 'o-', color="g",
label="Cross-validation score")
plt.legend(loc="best")
print("Best test score: {:.4f}".format(test_scores_mean[-1]))
接下来是:
clf = ExtraTreesClassifier(max_depth=8)
param_name = 'max_depth'
param_range = [1, 2, 4, 8, 16, 32]
plot_validation_curve(clf, features,labels.ravel(),
param_name, param_range, scoring='roc_auc')
给我一个似乎不反映先前信息的图表和图例:
Best test score: 0.3592
最后sklearn指标给了我
Accuracy:0.737
Classification report
precision recall f1-score support
0 0.76 0.79 0.78 8311
1 0.70 0.66 0.68 6134
avg / total 0.74 0.74 0.74 14445
在我看来,我应该能够更好地解释这些东西,任何人都可以帮忙吗?
答案 0 :(得分:4)
您在此遇到的是,不同的交叉验证方法和分类器参数会导致不同的分数。
在您的第一个实验中,您将cross_val_score方法的结果与您自己的75%/ 25%随机分割进行比较。 cross_val_score方法使用K为3的StratifiedKFold方法来确定折叠。 StratifiedKFold或多或少保留数据的顺序,而随机分割通过随机抽样删除数据中的任何自然顺序。这可以解释分数的差异,特别是当您的数据依赖于自然顺序时。例如,如果您的数据按时间戳排序,则数据的特征可能会随着时间的推移而发生变化。当列车和测试集来自不同的时间段时,这导致较差的分数,这将是StratifiedKFold采样的情况。
在第二个实验中,您使用分类器的默认参数和5倍的交叉验证,这又会导致不同的结果。例如,默认情况下,ExtraTreeClassifier使用10个估算器,但在第一个实验中,您使用了200个估算器 - 并且您改变了max_depth参数。对于解释,max_depth参数确定树的复杂性,并且仅训练10棵树,大量叶子导致过度拟合,这正是您在验证图表中看到的效果。最佳考试成绩实际为0.6而不是0.315,你应该取最高分而不是最后一分。
我希望这有助于对分数的解释和对差异的理解。接下来我会检查数据的排序,如果是暂时的,我会通过可视化对其进行调查。如果您希望最终在预测的数据中出现这种漂移,则不应使用随机抽样 - 如果您确信您的训练集反映了所有变化,您可以在测试之前对数据进行混洗或设置StratifiedKFold的shuffle参数为true。对于分类器,我宁愿从一个简单的RandomForestClassifier开始,并在查看ExtraTrees之前将n_estimators设置为100。