使用随机林分类文本文档

时间:2014-02-10 22:22:21

标签: python scikit-learn sparse-matrix random-forest

我有一组4k文本文档。 他们属于10个不同的类别。 我试图看看随机森林方法如何进行分类。 问题是我的特征提取类提取了200k的特征。(单词,双字母组合,搭配等组合) 这是高度稀疏的数据,sklearn中的随机森林实现不适用于稀疏数据输入。

Q值。我有什么选择?减少功能数量?怎么样 ? 问:是否存在使用稀疏数组的随机林的实现。

我的相关代码如下:

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)

2 个答案:

答案 0 :(得分:6)

有几个选项:通过将max_features=10000传递给CountVectorizer,将结果转换为密集的numpy数组,只使用最多10000个最受欢迎的功能:

X_train_array = X_train.toarray()

否则,使用以下方法将维度降低到100或300维度

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

然而根据我的经验,我无法使RF工作比原始稀疏数据(可能使用TF-IDF规范化)的良好调整的线性模型(例如使用网格搜索正则化参数的逻辑回归)更好。

答案 1 :(得分: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