2014-02-10 33 views
5

我有一組4k文本文檔。 他們屬於10個不同的類。 我想看看隨機森林方法如何執行分類。 問題是我的特徵提取類提取了200k個特徵(字,雙字母,搭配等組合) 這是高度稀疏的數據,sklearn中的隨機森林實現不適用於稀疏數據輸入。用隨機森林對文本文檔進行分類

問:我在這裏有什麼選擇?減少功能的數量?怎麼樣 ? 問:是否有任何實現隨機森林在那裏使用稀疏數組。

我的相關代碼如下:

import logging 
import numpy as np 
from optparse import OptionParser 
import sys 
from time import time 
#import pylab as pl 

from sklearn.datasets import load_files 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.ensemble import RandomForestClassifier 
from special_analyzer import * 


data_train = load_files(RAW_DATA_SRC_TR) 
data_test = load_files(RAW_DATA_SRC_TS) 
# split a training set and a test set 
y_train, y_test = data_train.target, data_test.target 

vectorizer = CountVectorizer(analyzer=SpecialAnalyzer()) # SpecialAnalyzer is my class extracting features from text 
X_train = vectorizer.fit_transform(data_train.data) 



rf = RandomForestClassifier(max_depth=10,max_features=10) 
rf.fit(X_train,y_train) 
+0

我只在Java中使用RF,但似乎您需要爲每個文檔製作一個「標準」向量表示形式。在Java中,可以首先將其表示爲SortedMap ,其中字符串鍵是該功能,雙val是該文檔中術語的頻率。如果你像這樣矢量化所有東西,那麼將每個文檔表示爲一個標準的double []數組,那麼該算法就應該這樣做。換句話說,DOC1看起來像a,b和DOC2看起來像a,c,後面的規範/向量化doc 1應該變成a = 1,b = 1,c = 0,而DOC2會變成a = 1,b = 0, C = 1。 – markg

+1

來自[版本0.16.1的doc](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.fit)似乎是'sklearn。 ensemble.RandomForestClassifier。fit'現在接受稀疏矩陣作爲輸入:'參數:\t X:shape = [n_samples,n_features]的數組狀或稀疏矩陣' – jul

回答

2

選項1: 「如果變量的數量是非常大的,林可一旦與所有變量運行,那麼只運行再次使用的最重要來自第一次運行的變量。「

來自:http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm#giniimp

我不知道關於隨機森林sklearn有一個特點,重要選項。 R中的隨機森林實現基尼係數的平均下降以及精度的平均降低。

選項2: 做維數降低。使用PCA或其他降維技術將N維稠密矩陣更改爲更小的矩陣,然後使用此更小的稀疏矩陣進行分類問題。選項3: 刪除相關特徵。我相信隨機森林相比於多項式邏輯迴歸更適合相關特徵。這就是說......可能會出現這種情況,你有一些相關的功能。如果你有很多成對相關的變量,你可以放棄兩個變量之一,理論上你不應該失去「預測能力」。除了成對相關之外,還有多個相關性。退房:http://en.wikipedia.org/wiki/Variance_inflation_factor

+0

感謝您的快速反應Andrew,您是否有任何示例R代碼可以幫助去。我大多熟悉python。 – Yantra

+0

我還增加了一些關於相關變量的內容......這可以更大程度地減少變量的數量,並讓您對輸入信息有更多的瞭解。讓我知道這是否有任何工作/幫助 –

+0

我會嘗試你的建議,並在這裏發佈結果。謝謝。 – Yantra

6

有幾個選項:通過傳遞max_features=10000CountVectorizer只拿最10000個最流行的功能和結果與以陣列的方法轉換爲密numpy的數組:

X_train_array = X_train.toarray() 

否則降維以100點或300的尺寸與:

pca = TruncatedSVD(n_components=300) 
X_reduced_train = pca.fit_transform(X_train) 

但是在我的經驗,我從來不會射頻工作比一個良好調整的線性模型(更好,比如用GR logistic迴歸id搜索正則化參數)原始稀疏數據(可能與TF-IDF歸一化)。

+1

s/RandomizedPCA/TruncatedSVD –

+0

通過使用max_features我可以得到它去..但我想我找到相同的行爲,射頻不超過線性模型。 – Yantra

+0

您發現哪些參數對於良好的扭曲邏輯迴歸@ogrisel是最佳的? – tumbleweed