使用随机林分类文本文档

Yan*_*tra 5 python sparse-matrix random-forest scikit-learn

我有一组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)
Run Code Online (Sandbox Code Playgroud)

ogr*_*sel 6

有几个选项:通过传递只需要最10000个最流行的功能max_features=10000CountVectorizer,结果与转换为密numpy的阵列到阵列的方法:

X_train_array = X_train.toarray()
Run Code Online (Sandbox Code Playgroud)

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

pca = TruncatedSVD(n_components=300)
X_reduced_train = pca.fit_transform(X_train)
Run Code Online (Sandbox Code Playgroud)

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


And*_*idy 4

选项 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