2014-02-10 101 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