添加特征如何降低模型的性能?

机器算法验证 机器学习 分类 大车
2022-03-14 17:05:18

语境:

我正在建立一个模型来预测来自 NYPD 数据的犯罪类型(7 类)。

features = ['occurrence_hour', 'borough_labels', 'time_to_entry']
X_train, y_train = train[features], train['offense_labels']
X_test, y_test = test[features], test['offense_labels']

from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy_score(y_test, y_pred)
0.437

使用这些简单的特征,我们达到了 43.7% 的准确率。现在,如果我们添加一个星期几的特征,准确率会下降到 38.1%(另外:40.6% 的条目属于“大盗窃”类别,所以我们可以通过猜测“大盗窃”来达到 40.6% 的准确率)。

features = ['occurrence_hour', 'borough_labels', 'time_to_entry', 'day_of_week']
X_train, y_train = train[features], train['offense_labels']
X_test, y_test = test[features], test['offense_labels']

from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy_score(y_test, y_pred)
0.381

那么我的问题是:添加信息怎么可能降低决策树的准确性?这是否应该仅用于提高我们的预测能力?

3个回答

这取决于。

使用您的数据,创建一个只是随机噪声的新变量。如果将其作为预测变量添加到模型中,您很可能会注意到您的准确度下降。这是因为,虽然它是添加的信息,但它与您提供的其他信息的相关性并不好。

可能很难将周末和节假日与一周中的其他日子区分开来,它只会变成噪音。因此,您可以将周末/节假日与一周其他时间的二进制数据作为犯罪的预测指标来获得更好的结果。

它还可能有助于创建数据的矩阵图并查看“星期几”是否出现任何模式(如果可能,您可能希望抖动该数据)。

编辑:

我用我手头的示例数据集进行了尝试。

事实证明,添加白噪声似乎有一个有趣的副作用。它似乎总是在改进模型(在边际上,并且随着添加额外的白噪声变量而收益递减)。它似乎也对显着变量产生影响,使它们变得越来越重要(以及它们可能具有的任何相互作用)。

话虽如此,我也有与所需输出几乎没有相关性的数据,并且将该变量添加到数据集中会使较大的模型变得更糟。数据集的示例如下。FactX2以前的测试已经证实,RespY在单个单元上多次测量时,两者之间存在良好的线性关系。测量随时间的变化提供了完全不同的响应。

FactX1  FactX2  RespY
-0.012  0.078   0.033
-0.016  0.059   -0.039
-0.034  0.082   -0.022
NA      NA      0.021
-0.055  -0.002  -0.028
-0.057  0.085   0.072
-0.053  -0.012  0.001
-0.053  0.050   0.054
-0.053  0.078   0.007
-0.035  0.061   0.031

如果您使用此数据构建模型,则使用FactX2总是使为负数。我之前认为这是因为它已经变成了噪音,并且在这个数据集中根本不能很好地预测任何事情。R2

我看到您(明智地)保留了单独的训练和测试数据集。如果没有您的数据,我无法自己进行测试,但我希望如果您在训练数据上进行测试,当您添加额外变量时,您会获得更好(或至少不会更差)的准确性。只有在测试数据上,您才能看到准确性的下降。你看到的是过度拟合。

即使您从一个相当大的数据集开始,在决策树的每个拆分处,您查看的点数也更少。当您到达树的更深分支时,可能只有几个点需要分类。偶然地,一个(新添加的)变量可以很好地将这些点分成不同的类,但这种分割并不能推广到其他数据。这正是您保留单独测试集的原因。测试集可帮助您检测这种过度拟合。

顺便说一句,我们在这里关注的不是准确性,而是精度。在其他条件相同的情况下,周二的数据只有本周剩余时间的七分之一。现在假设我们正在查看均值的标准误。然后是标准误;σμ=σN. 所以,让我们输入一些数字。假设σμ=0.5N=196, 和NTues=28. 然后σ=σμN=7, 和σμTues=σNTues=7281.323或者σμTues=2.65σμ,也就是说,在这种假设的情况下,估计整周数据的平均值的标准误差要少得多(因数为17),而不是只使用一天的数据。