随机森林具有比数据点更多的功能

时间:2016-03-07 08:24:35

标签: python-2.7 scikit-learn random-forest tf-idf

我正在尝试预测客户端提出的特定服务票证是否需要更改代码。

我有训练数据。

我有大约17k个数据点,包含问题描述和标记(Y表示需要更改代码,N表示没有代码更改)

我做了TF-IDF,它给了我27k的功能。所以我尝试用这个17k x 27k矩阵拟合RandomForestClassifier(sklearn python)。

我在测试集上得分非常低,而训练准确度非常高。

列车精度: 89% 测试集的精确度: 21%

有人可以建议任何解决方法吗?

我现在正在使用这个模型:

{{1}}

请帮忙!

修改 我有11k训练数据,有900个正面(倾斜)。我尝试过LinearSVC稀疏化,但没有像Truncated SVD(潜在语义索引)那样有效。 maxFeatures = None在测试集上的性能优于没有它的情况。

我也尝试过SVM,logistic(l2和l1),ExtraTrees。 RandonForest仍然是最好的。 现在,在积极因素上达到92%的精确度,但召回仅为3%

任何其他建议将不胜感激!

更新 特征工程帮了很大忙。我把特征从空中拉出来(字母,字数,它们,差异,比率,报告问题的星期几,月份等),现在我用>回忆19-20%。 95%的准确度。

关于使用word2vec平均向量作为自由文本的深层特征而不是tf-idf或词袋的想法的食物???

2 个答案:

答案 0 :(得分:1)

好像你已经过度训练了。基本上,该模型已经在数据而不是信号上学习了噪声。有几种方法可以解决这个问题,但似乎很明显你的模特已经过度适应,因为你正在喂它的功能非常多。

修改 看起来我可能太快就无法跳到过度拟合的结局,但这可能仍然如此(留给读者的练习!)。但是,功能选择仍可提高模型的通用性和可靠性。

开始删除scikit-learn中的功能的好地方是here。使用稀疏性是执行特征选择的一种相当常见的方法:

from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel
import numpy as np

# Create some data
X = np.random.random((1800, 2700))
# Boolean labels as the y vector
y = np.random.random(1800)
y = y > 0.5
y = y.astype(bool)

lsvc = LinearSVC(C=0.05, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)

print X_new.shape

返回形状(1800, 640)的新矩阵。您可以通过更改C参数(在scikit-learn中称为惩罚参数,但有时称为稀疏参数)来调整所选要素的数量。

答案 1 :(得分:1)

<强> [编辑]

随机林处理比数据点更多的功能。 RF是例如用于例如微阵列研究100:5000数据点/特征比或单核苷酸多态性(SNP)研究,例如5000:500,000比例。

我不同意@ncfirth提供的诊断,但建议的处理变量选择可能会有所帮助。

你的默认随机森林没有严重过度装修。注意RF模型的非交叉验证训练集预测性能是没有意义的,因为任何样本都将以它自己定义的终端节点/叶子结束。但整体集合模型仍然很强大。 [edit] 如果您要更改max_depthmin_samples_split,则训练精度可能会下降,但这不是重点。随机森林模型或许多其他集合模型的非交叉验证训练误差/精度根本无法估计任何有用的东西。

[我之前编辑混淆max_features与n_estimators,sry我主要使用R]

设置max_features =&#34;无&#34;不是随机的森林,而是“袋装的树木”。您可能会受益于较低的max_features,这可以改善正规化和速度,也许不会。我会尝试将max_features降低到27000/3和sqrt(27000)之间,这是典型的最佳范围。

您可以通过功能选择获得更好的测试集预测性能。您可以运行一个RF模型,保留最重要的5-50% 重要 功能,然后使用较少的功能重新运行模型。 &#34; L1 lasso &#34; ncfirth建议的变量选择也可能是一个可行的解决方案。

您的预测性能指标精度在不平衡数据或假阴性和假阳性成本差别很大的情况下可能不是最佳的。

如果您的测试集仍然预测比袋外交叉验证的训练集差得多,那么您的I.I.D. assumptions可能会遇到任何受监督的ML模型依赖的问题,或者您可能需要将其包裹起来在外部交叉验证循环中的整个数据处理,以避免由于例如由于例如的预测性能的过度乐观估计变量选择步骤。