1

我試圖使用sk-learn的RandomForestClassifier進行二進制分類任務(正面和負面的例子)。我的訓練數據包含1.177.245個具有40個特徵的示例,採用了sklearn.dataset的load_svmlight_file加載的SVM-light格式(稀疏矢量)。它產生一個「特徵值」(1.177.245 * 40)的稀疏矩陣和一個「目標類別」(1s和0s,其中的1.177.245)陣列。我不知道這是否令人擔憂,但訓練數據有3552個積極因素,其餘都是消極的。因爲sk-learn的RFC不接受稀疏矩陣,所以我使用.toarray()將稀疏矩陣轉換爲密集數組(如果我說的是正確的?大量的0表示不存在的特徵),則使用.toarray()將其轉換爲密集數組。在轉換爲數組之前和之後,我打印矩陣並且似乎正在進行。scikit-learn RandomForestClassifier產生'意外'結果

當我開始分類,並開始其擬合數據,它長期藉此:

[Parallel(n_jobs=40)]: Done 1 out of 40 | elapsed: 24.7min remaining: 963.3min 
[Parallel(n_jobs=40)]: Done 40 out of 40 | elapsed: 27.2min finished 

(是輸出正確的那些963分鐘大約需要2個半......?)

然後我使用joblib.dump轉儲它。 當我重新加載:

RandomForestClassifier: RandomForestClassifier(bootstrap=True, compute_importances=True, 
     criterion=gini, max_depth=None, max_features=auto, 
     min_density=0.1, min_samples_leaf=1, min_samples_split=1, 
     n_estimators=1500, n_jobs=40, oob_score=False, 
     random_state=<mtrand.RandomState object at 0x2b2d076fa300>, 
     verbose=1) 

並測試其真實trainingdata(包括出750.709例子,完全一樣的格式作爲訓練數據),我得到的「意外」的結果。確切地說, testdata中只有一個例子被分類爲true。當我在一半的初始訓練數據上訓練並在另一半進行測試時,我根本沒有任何積極的。

現在我沒有理由相信發生了什麼事情,這只是我得到奇怪的結果,而且我認爲這一切都做得非常快。可能無法進行比較,但使用rt-rank(也包含1500次迭代,但有一半內核)在相同數據上訓練RFClassifier需要12小時以上...

任何人都可以指導我是否擁有有什麼理由相信某些東西不按照它應有的方式工作?這可能是訓練數據中積極與否定的比例嗎?乾杯。

+0

其實我只是在寫這篇文章的時候看到了正面對負面的確切比例,而對我來說這似乎是相當合理的,這就是原因。也許我的特徵不足以區分大量的消極因素和少數積極因素? – graus

+0

儘管有[處理RF分類器中的不平衡數據集]的技術(http://www.stat.berkeley.edu/tech-reports/666.pdf),但我認爲它們中的任何一個都沒有在scikit-學習呢。 –

回答

4

事實上,這個數據集非常不平衡。我建議你對這些否定例子進行二次抽樣(例如,隨機抽取n_positive_samples),或者過分抽取正例(後者更昂貴,但可能產生更好的模型)。

你是否確定所有的特徵都是數值特徵(數值越大意味着現實生活中的某些特徵)?如果它們中的一些是分類整數標記,則應該將這些特徵分解爲一個k布爾編碼,而不是隨機森林的scikit-learn實現不能直接處理分類數據。

+0

確實,極端不平衡似乎是造成0偏差的原因。我做了一個快速測試,通過降低負值並複製正值,並預測了更多的正值。 – graus

+0

@ogrisel是否可以在scikit-learn中進行下采樣?我似乎沒有找到任何地方的n_positive_samples參數。 – MaVe

+0

在scikit-learn中沒有內置的重採樣器(但是),但是您可以使用標準的numpy花式索引。 – ogrisel