我使用scikit-learn 0.13.1在Kaggle上进行比赛。我正在使用决策树分类器,为了评估我的估计器,我遵循了通过train_testrongplit分割训练数据的技术,或者使用cross_val_score进行交叉验证。任何一种技术都表明估计器的准确率约为90%。然而,当我在实际测试数据上使用估计器时,获得的精度降低了大约30%。让我们假设训练数据是测试数据的一个很好的表示。
我还能做什么来评估估计器的准确性?
clf = tree.DecisionTreeClassifier( )
...
X_train, X_test, y_train, y_test = train_test_split(train, target, test_size=0.3, random_state=42)
...
clf.fit(X_train, y_train)
print "Accuracy: %0.2f " % clf.score(X_test, y_test)
...
scores = cv.cross_val_score(clf, train, target, cv=15)
print "Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() / 2)
这可能意味着最终评估数据的分布与开发集之间存在显著差异。
衡量你的决策树的过拟合会很有趣:在你的分割上,训练分数clf.score(X_train, y_train)
和测试分数clf.score(X_test, y_test)
之间的差异是什么?
纯决策树也应该被视为玩具分类器。它们具有非常差的泛化特性(并且可能过度拟合)。你应该尝试ExtraTreesClassifier
,增加n_estimators
的数量。从n_estimators=10
开始,如果数据集足够小,然后是50、100、500、1000。