2015-05-28 43 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 也許我們應該添加一個版本,而管道的例子嗎?