2016-03-07 84 views
0

我試圖預測客戶端提出的特定服務票證是否需要更改代碼。具有比數據點更多功能的隨機森林

我有訓練數據。

我有一個問題描述和標籤周圍17K數據點(Y代碼變化需要和N爲無需更改代碼)

我做了TF-IDF,它給了我27K功能。所以我試圖用這個17k x 27k矩陣來適應RandomForestClassifier(sklearn python)。

我在測試集上得分非常低,而訓練的準確性非常高。

精密列車集:89% 精密的測試設置:21%

有人能提出任何變通辦法?

我現在用這個模型:

sklearn.RandomForestClassifier(n_jobs=3,n_estimators=100,class_weight='balanced',max_features=None,oob_score=True) 

請幫幫忙!

編輯: 我有11k訓練數據900正面(偏斜)。我嘗試過LinearSVC稀疏化,但不像截斷SVD(潛在語義索引)那樣工作。 maxFeatures = None在測試集上表現比沒有表現更好。

我也試過SVM,邏輯(l2和l1),ExtraTrees。 RandonForest仍然工作得最好。 現在,在積極92%的精度,但召回只有3%

任何其他建議,將不勝感激!

更新: 特性工程幫助了很多。我從空中抽取特徵(字符數,字長,他們的差異,比率,問題所報告的星期幾,月中的某天等),現在我在19%至20%的回憶率下> 95 % 準確性。

食物爲您的想法使用word2vec平均向量作爲自由文本,而不是tf-idf或一袋文字的深層功能?

+0

第一個建議是從不優化到測試集,這是一個災難的祕訣。對於參數優化,您應該始終使用某種形式的驗證集,即使用訓練集的交叉驗證來選擇參數,重新訓練整個訓練集,然後在測試集上進行測試。 – ncfirth

+0

謝謝@ncfirth!我分裂它就像你說的,我能夠檢測到使用ngrams_range(1,2)給我比以前更好的結果...我的精確度已經提高(> 95%),但我仍然陷在召回率爲3%的困境中。我需要至少12-15%。我試圖玩概率閾值,但他們在精確度上(召回> 10%,精確度<35%)。還有什麼我可以做的嗎? –

+0

您是否嘗試過使用召回作爲交叉驗證中的評分方法?選擇參數來增加召回可能會有所幫助。 – ncfirth

回答

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中的懲罰參數,但有時稱爲稀疏參數)來調整所選功能的數量。

+0

這是我以前不知道的好東西。謝謝,但還沒有太大的改進。我嘗試了截斷SVD,結果好得多。我將嘗試編輯現在的問題以提供更多信息。 –

1

[編輯]

隨機森林處理比數據點相當精細更多的功能。 RF是例如用於例如用於微陣列研究100:5000數據點/特徵比率或以例如5000:500,000比率的單核苷酸多態性(SNP)研究。

我與@ncfirth提供的診斷不同意,但建議的變量選擇的治療反正可能會有幫助。

您的默認隨機森林並沒有嚴重過度配備。注意RF模型的非交叉驗證訓練集預測性能是沒有意義的,因爲任何樣本都將終止在它自己定義的終端節點/葉子中。但整體的整體模型仍然強勁。 如果你想改變max_depthmin_samples_split,訓練精度可能會下降,但那不是重點。隨機森林模型或許多其他集合模型的非交叉驗證訓練誤差/精度根本不估計任何有用的東西。

[我做編輯之前混淆max_features與n_estimators,SRY我主要使用R]

設置max_features = 「無」 不是隨機的森林,而是 '袋裝樹'。您可能會受益於稍低的max_features,這可能會提高正規化和速度,可能不會。我會嘗試降低max_features到27000/3和sqrt(27000)之間的某個地方,典型的最佳範圍。

通過特徵選擇可以實現更好的測試集預測性能。您可以運行一個RF模型,將最重要的特徵保留5-50%,然後重新運行具有較少特徵的模型。 「L1 lasso」ncfirth表示的變量選擇也可能是一個可行的解決方案。

您的預測性能指標精度在不平衡數據的情況下或者假陰性和假陽性的成本相當不同時可能不是最佳。

如果您的測試集仍然比預測袋外交叉驗證訓練集預測得差得多,那麼您可能會遇到任何受監督的ML模型依賴的問題,或者您可能需要將整個數據處理在外部交叉驗證循環中,爲了避免過度樂觀估計預測性能,例如由於例如變量選擇步驟。

+0

我認爲我們說的是同樣的事情,「任何樣本將終止於它自己定義的終端節點/葉子」是過度訓練數據的一個例子。如果考慮'min_samples_split'和'max_depth'(使用'sklearn'參數名稱),也可以使用來自非交叉驗證隨機森林的統計信息。例如,如果'max_depth = 4',那麼你關於終端節點的陳述將不會成立。 – ncfirth

+0

*「基本上模型已經學習了數據上的噪音而不是信號。」* - 我會說不一定。訓練集預測性能不會揭示隨機森林集合是否過度適合。射頻是套袋的一個特殊變體,套袋集合中的個體學習者通常相當不穩定(高方差/低偏差)。這實際上是套裝套裝的主要優勢,而不是問題。請參閱有關'max_depth'和'min_samples_split'的編輯。 –

+1

我的直覺是,當我看到許多功能和測試集精度的大幅度下降過度擬合時。我建議在這種情況下使用'max_features =「none」'增加過度擬合的風險,因爲找到最佳分割可能確實會導致學習噪音。不幸的是,我們永遠不會知道沒有數據! +1爲一個很好解釋的答案。 – ncfirth