Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于随机森林的文本分类_Python_Scikit Learn_Sparse Matrix_Random Forest - Fatal编程技术网

Python 基于随机森林的文本分类

Python 基于随机森林的文本分类,python,scikit-learn,sparse-matrix,random-forest,Python,Scikit Learn,Sparse Matrix,Random Forest,我有一套4k文本文档。 他们属于10个不同的班级。 我想看看随机森林方法是如何进行分类的。 问题是我的特征提取类提取了200k个特征(单词、双字母组合、搭配等的组合) 这是高度稀疏的数据,sklearn中的随机林实现不适用于稀疏数据输入 我的选择是什么?减少功能的数量?怎样? 有没有使用稀疏数组的随机林的实现 我的相关代码如下: import logging import numpy as np from optparse import OptionParser import sys from

我有一套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)
备选案文1: 如果变量数量很大,则可以使用所有变量运行一次林,然后仅使用第一次运行中最重要的变量再次运行

发件人:

我不确定sklearn中的随机林是否有一个功能重要性选项。R中的随机林实现了基尼杂质的平均减少以及准确性的平均减少

备选案文2: 进行降维。使用PCA或其他降维技术将N维的稠密矩阵转换为较小的矩阵,然后使用该较小的稀疏矩阵进行分类

备选案文3:
删除相关功能。我相信,与多项式逻辑回归相比,随机森林对相关特征的鲁棒性更强。话虽如此。。。在这种情况下,您可能有许多相关的特性。如果你有很多两两相关的变量,你可以去掉其中一个,理论上你不应该失去“预测能力”。除了两两相关之外,还有多重相关。签出:

多个选项:通过将
max_features=10000
传递到
CountVectorizer
仅获取最常用的10000个功能,并使用to-array方法将结果转换为密集的numpy数组:

X_train_array = X_train.toarray()
否则,使用以下方法将维度减少到100或300个维度:

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

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

我只在Java中使用RF,但似乎您需要对每个文档进行“规范化”向量表示。在Java中,这可以首先表示为SortedMap,其中字符串键是特性,双val是该文档中术语的频率。如果像这样对所有内容进行矢量化,然后将每个文档表示为一个标准的double[]数组,那么算法应该可以做到这一点。换句话说,DOC1看起来像a,b,DOC2看起来像a,c,范数/向量化后的DOC1应该变成a=1,b=1,c=0,DOC2应该是a=1,b=0,c=1。从这一点来看,
sklearn.employee.RandomForestClassifier.fit
现在接受稀疏矩阵作为输入:
参数:X:array-like或形状的稀疏矩阵=[n_样本,n_特征]
感谢您的快速回复Andrew,您是否有任何示例R代码可以帮助我们继续……我对python非常熟悉。我还添加了一些关于相关变量的信息。。。这可以大大减少变量的数量,并让您对输入有更多的了解。让我知道这些方法是否有效/有用。我将尝试您的建议并在此处发布结果。谢谢。Re:选项2,使用
LinearSVC(惩罚=l1',C=some_值)进行特征选择。拟合变换(X)
是另一种降低维度的好方法。
我不确定sklearn中的随机林是否有一个特征重要性选项
它确实有
特征重要性
所以是的(不知道为什么,
\uuu
,但它有文档记录,所以必须公开).s/RandomizedPCA/TruncatedSVDby使用max_特征我可以让它继续运行..但我想我发现了同样的行为,RF不优于线性模型。你发现了哪些参数对于一个良好的逻辑回归@ogrisel是最佳的?这取决于数据。超参数没有普遍的好值,否则首先,运行网格搜索来优化它们是没有意义的。