解释 Scikit-Learn 模型输出,额外的树分类器不同的措施

Interpreting Scikit-Learn model output, extra trees classifier differing measures

我有一组数据,我正在使用 Extra Trees Classifier 开发预测模型,如以下代码所示,初始代码集显示 et_scores 看起来非常令人失望 运行 fit 见下文,看起来更好,然后我做了一个学习图,看起来不太热。总而言之,相当混乱。 初始代码:

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

在我看来,我应该能够更好地解释这些东西,有人能帮忙吗?

你在这里体验到的是不同的交叉验证方法和分类器参数导致不同的分数。

在您的第一个实验中,您将 cross_val_score method with your own 75%/25% random split. The cross_val_score method uses the StratifiedKFold 方法的结果与 K 为 3 的结果进行比较以确定折叠。 StratifiedKFold 或多或少保留了数据的顺序,而您的随机拆分通过随机抽样删除了数据中的任何自然顺序。这可以解释分数的差异,尤其是当您的数据对自然顺序有一定依赖性时。例如,如果您的数据按时间戳排序,则数据的特征可能会随时间发生变化。当训练集和测试集来自不同的时间段时,这会导致得分较低,StratifiedKFold 采样就是这种情况。

在第二个实验中,您使用分类器的默认参数和 5 折交叉验证,这再次导致不同的结果。例如,默认情况下 ExtraTreeClassifier 使用 10 个估计器,但在您的第一个实验中您使用了 200 个估计器 - 并且您改变了 max_depth 参数。对于解释,max_depth 参数决定了树的复杂性,并且只训练了 10 棵树,大量的叶子会导致过度拟合,这正是您在验证图中看到的效果。最好的考试分数实际上是0.6而不是0.315,你应该取最高分而不是最后的分数。

我希望这有助于解释乐谱和理解差异。作为下一步,我将检查数据的顺序,如果它是暂时的,我将通过可视化来调查它。如果您最终希望在要预测的数据中也出现这种漂移,则不应使用随机抽样 - 如果您确信您的训练集反映了所有变化,则可以在测试前打乱数据或设置StratifiedKFold 的 shuffle 参数为真。对于分类器,我宁愿从普通的 RandomForestClassifier 开始并将 n_estimators 设置为 100,然后再查看 ExtraTrees。