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)
有几个选项:通过传递只需要最10000个最流行的功能max_features=10000来CountVectorizer,结果与转换为密numpy的阵列到阵列的方法:
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:“如果变量数量非常大,则可以使用所有变量运行一次森林,然后仅使用第一次运行中最重要的变量再次运行。”
来自: 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
| 归档时间: | 
 | 
| 查看次数: | 6784 次 | 
| 最近记录: |