【发布时间】:2014-03-08 11:43:47
【问题描述】:
我有一组 4k 文本文档。 它们属于 10 个不同的类别。 我想看看随机森林方法是如何进行分类的。 问题是我的特征提取类提取了 20 万个特征。(单词、bigrams、搭配等的组合) 这是高度稀疏的数据,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)
【问题讨论】:
-
我只在 Java 中使用过 RF,但您似乎需要对每个文档进行“标准化”矢量表示。在 Java 中,这可以首先表示为 SortedMap
,其中字符串键是特征,双精度值是该文档中术语的频率。如果你像这样对所有内容进行矢量化,然后将每个文档表示为标准的 double[] 数组,那么算法应该做到这一点。换句话说,DOC1 看起来像 a,b 而 DOC2 看起来像 a,c,规范化/矢量化后的 doc 1 应该变成 a=1,b=1,c=0 并且 DOC2 会变成 a=1,b=0, c=1. -
从the doc of version 0.16.1看来
sklearn.ensemble.RandomForestClassifier.fit现在接受稀疏矩阵作为输入:Parameters: X : array-like or sparse matrix of shape = [n_samples, n_features]
标签: python scikit-learn sparse-matrix random-forest