2015-05-28 45 views
2

我正在使用scikit-learn进行机器学习。Scikit学习RandomForestClassifier()功能选择,只需选择火车设置?

我有800个具有2048个特征的样本,因此我想减少我的特征以获得更好的准确性。

它是一种多类问题(类0-5),并且特征包含1的和0的:[1,0,0,0,1,1,1,1,1,0,0,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) 

原因精度没有得到更高。代码中的一切都好吗,还是我做错了什么?

我会非常感谢您的帮助。

+0

你不介意,香草,发帖也十分重视你**'sklearn .__ version__'获得[从邮件列表,这本来就是问交叉转贴] **,也从'clf.set_params (oob_score = True).fit(...).oob_score_'为'(X_train,y_train)'resp。 **'(X,y)'**?谢谢。 – user3666197

+0

也可以查看>>> http://stackoverflow.com/a/30471026/3666197 - 即** Breiman(伯克利)关于bootstrap-aggregation方法的论文,**通过设计避免过度拟合**和一个经验证的极限定理,它是基于RF的集合方法特有的.fit(X_test,y_test).oob_score_' lim->'.fit(X,y).oob_score_'等重要事物。解决** 2048D ** - 二进制“{0 | 1}”空间内的问题的目标本身不会受到“维度”的影响。更深入地了解RF的优势(可能有限的'max_depth',但**增加“森林宽度”(多样性)**)可以提供帮助。 – user3666197

回答

1

我不知道我理解正确你的问题,所以我会回答什么,我想我明白=)

首先,减少你的特征尺寸(从2048到500例)可能无法为您提供有更好的结果。这完全取决于您的模型的能力来捕捉数据的几何形状。例如,如果通过非线性方法减少维数,并捕获特定几何并将其“线性化”,而不是直接在原始数据上使用此线性模型,则可以通过线性模型获得更好的结果。但是,这是因为你的数据本质上是非线性的,因此线性模型并不好,因此在原始空间中可以捕捉到这个几何体(想象一下2D中的圆)。

在你给出的代码中,虽然没有减少维数,但是将数据分成两个数据集(特征维数相同,2048,只是样本数发生了变化)。大部分时间对较小数据集进行训练会导致最差的准确性(数据=信息,当您遗漏某些数据时会丢失信息)。但是分割数据可以让你测试过度拟合,这是非常重要的。但一旦选择了最佳参数(请参阅交叉验证),您应该了解您拥有的所有数据!

考虑到你的0.7 * 800 = 560样本,我认为13的深度相当大,你可能会过度使用。如果你想提高你的准确性,你可能想先玩这个参数!

0

如果您具有比样本更多的特征,则降低维度或特征选择是明智的。你可以看看Principal Component Analysissklearn.decomposition中的其他模块,以减少功能的数量。在scikit-learn文档中还有一个关于Feature Selection的有用部分。

配件sklearn.decomposition.PCA后,你可以检查explained_variance_ratio_确定特征的建议数量(n_components),以减少(PCA这里的关键是要找到的特征数量减少捕获大部分方差在你的原始特征空间)。有些人可能希望保留具有高于0.9,0的累积explained_variance_ratio_的功能。95等,有些人喜欢放弃功能,超出该功能突然下降。然后改装PCAn_components你喜欢,你transformX_trainX_test,并符合如上的分类。

1

1)通常降低了功能空间不准确的帮助,并使用正则分类会导致更好的结果。 2)要做特征选择,你需要两种方法:一种减少特征集,另一种做实际监督任务(分类在这里)。

你有没有尝试过使用标准的分类?显然你尝试了射频,但我也尝试线性方法,如LinearSVC/LogisticRegression或内核SVC。

如果你想要做的特征选择,你需要做的是这样的:

feature_selector = LinearSVC(点球= 'L1')#OR可能与SelectKBest() feature_selector.train(X_train启动,y_train)

X_train_reduced = feature_selector.transform(X_train) X_test_reduced = feature_selector.transform(X_test)

分类= RandomForestClassifier()。拟合(X_train_reduced,y_train)

预测= classifier.predict(X_test_reduced)

或者您使用的管道,如下:http://scikit-learn.org/dev/auto_examples/feature_selection/feature_selection_pipeline.html 也许我们应该添加一个版本,而管道的例子吗?