Python 2.7 Scikit learn RandomForestClassifier()功能选择,仅选择列车集?

Python 2.7 Scikit learn RandomForestClassifier()功能选择,仅选择列车集?,python-2.7,machine-learning,scikit-learn,classification,Python 2.7,Machine Learning,Scikit Learn,Classification,我正在使用scikit学习进行机器学习 我有800个样本和2048个特征,因此我想减少我的特征,希望获得更好的精度 这是一个多类问题(0-5类),其特征包括1和0:[1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0…..0] 我使用的是集成方法,RandomForestClassifier() 我应该只选择训练数据吗? 如果我使用此代码,是否足够: X_train, X_test, y_train, y_test = train_test_split( X, y, test_s

我正在使用scikit学习进行机器学习

我有800个样本和2048个特征,因此我想减少我的特征,希望获得更好的精度

这是一个多类问题(0-5类),其特征包括
1
0
[1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0…..0]

我使用的是集成方法,
RandomForestClassifier()

我应该只选择训练数据吗?

如果我使用此代码,是否足够

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = .3 )

clf = RandomForestClassifier( n_estimators = 200,
                              warm_start   = True,
                              criterion    = 'gini',
                              max_depth    = 13
                              )

clf.fit( X_train, y_train ).transform( X_train )

predicted       = clf.predict( X_test )
expected        = y_test
confusionMatrix = metrics.confusion_matrix( expected, predicted )
因为准确度没有提高。代码中的一切都正常吗,还是我做错了什么


我将非常感谢您的帮助。

我不确定我是否正确理解了您的问题,因此我将回答我认为我理解的问题=)

首先,降低功能的维度(例如从2048降到500)可能无法提供更好的结果。这完全取决于模型捕获数据几何体的能力。例如,如果通过捕捉特定几何体并将其“线性化”的非线性方法来降维,而不是直接在原始数据上使用此线性模型,则可以使用线性模型获得更好的结果。但这是因为数据本质上是非线性的,线性模型不好,因此在原始空间中捕捉该几何体(想象二维中的圆)

在您给出的代码中,您没有减少维度,而是将数据拆分为两个数据集(特征维度相同,2048,只是更改了样本数)。大多数情况下,在较小的数据集上进行训练会导致最差的准确性(数据=信息,如果你遗漏了一些信息,就会丢失信息)。但是分割数据可以让你特别测试过度拟合,这是非常重要的。但是一旦选择了最佳参数(参见交叉验证),您就应该了解您拥有的所有数据


考虑到你的0.7*800=560个样本,我认为13的深度相当大,你可能会过度拟合。如果要提高精度,您可能需要首先使用此参数

如果特征多于样本,则降维或特征选择是绝对可取的。您可以在
sklearn.decomposition
中查看和其他模块,以减少功能的数量。scikit学习文档中还有一个关于的有用部分

拟合
sklearn.decomposition.PCA
后,您可以检查
explained\u variation\u ratio\u
,以确定要减少到的特征数量(
n\u components
),这里的PCA的目的是找到减少的特征数量,以捕获原始特征空间中的大部分差异。有些人可能希望保留累积
解释的方差比\uu
高于0.9、0.95等的特征,有些人则希望删除那些
解释的方差比\uu
突然下降的特征。然后用你喜欢的
n_组件重新安装
PCA
transform
你的
X_序列
X_测试
,并如上所述安装你的分类器。

1)通常减少特征空间对准确度没有帮助,使用规则化的分类器会产生更好的结果。 2) 要进行特征选择,您需要两种方法:一种是减少特征集,另一种是执行实际监督任务(此处为分类)

你试过只用标准分类器吗?显然,您尝试了RF,但我也尝试了线性方法,如LinearSVC/LogisticRegression或内核SVC

如果要进行特征选择,需要执行以下操作:

feature_selector=LinearSVC(惩罚class='l1')#或可能以SelectKBest()开头 特征选择器。列车(X列车、y列车)

X\u列\u减少=特征\u选择器。变换(X\u列) X_测试_减少=特征_选择器.变换(X_测试)

分类器=RandomForestClassifier().fit(X\u序列减少,y\u序列)

预测=分类器。预测(X_测试减少)

或者使用管道,如下所示: 也许我们应该在示例中添加一个没有管道的版本


[从最初提出此问题的邮件列表中交叉发布]

赫伯,您介意吗,同时发布您从
sklearn.\uuu版本\uuuu
,以及从
clf.set_参数(oob_分数=True)中获得的值。
(X_火车,y_火车)
的拟合(…).oob_分数
<代码>(X,y)
?谢谢。也可以查看>>>——即Breiman(Berkeley)关于引导聚合方法的论文,该方法通过设计避免了过度拟合工件,并在
.fit(X\u测试,y\u测试).oob\u score
lim->
.fit(X,y).oob\u score
和其他重要的东西上证明了极限定理,这些都是基于射频的集成方法特有的。在2048D二进制空间中解决问题的目标本身并不受“维数”的影响。深入了解RF的优势(可能限制
最大深度,但增加“森林宽度”(多样性))会有所帮助。