Python 解释Scikit学习模型输出、额外树和不同度量

Python 解释Scikit学习模型输出、额外树和不同度量,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,我有一组数据,我正在使用额外的树分类器开发一个预测模型,如下面的代码所示,在最初的代码集上,et_分数看起来非常令人失望,我运行了拟合,见下文,它看起来更好,然后我做了一个学习图,事情看起来不太热。总的来说,这很令人困惑。 初始代码: from sklearn.ensemble import ExtraTreesClassifier from sklearn.cross_validation import cross_val_score #split the dataset for train

我有一组数据,我正在使用额外的树分类器开发一个预测模型,如下面的代码所示,在最初的代码集上,et_分数看起来非常令人失望,我运行了拟合,见下文,它看起来更好,然后我做了一个学习图,事情看起来不太热。总的来说,这很令人困惑。 初始代码:

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))
没那么热! 然后根据我提供的数据:

 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

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

您在这里的经验是,不同的交叉验证方法和分类器参数会导致不同的分数

在您的第一个实验中,您将该方法的结果与您自己的75%/25%随机分割进行比较。cross_val_score方法使用K值为3的方法来确定褶皱。StratifiedKFold或多或少地保留了数据的顺序,而您的随机拆分通过随机采样删除了数据中的任何自然顺序。这或许可以解释分数的差异,尤其是当你的数据与自然顺序有某种依赖性时。例如,如果您的数据是按时间戳排序的,那么数据的特征可能会随着时间的推移而改变。当训练集和测试集来自不同的时间段时,这会导致较差的分数,分层取样就是这种情况

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

我希望这有助于解释分数和理解差异。作为下一步,我将检查数据的顺序,如果是暂时的,我将通过可视化进行研究。如果您预期最终要预测的数据也会出现这种漂移,则不应使用随机抽样-如果您确信您的训练集反映了所有变化,则可以在测试前对数据进行洗牌,或将StratifiedKFold的洗牌参数设置为true。对于分类器,我宁愿从一个普通的RandomForestClassifier开始,在查看外部树之前,将n_估计量设置为100

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