1

我试图使用sk-learn的RandomForestClassifier进行二进制分类任务(正面和负面的例子)。我的训练数据包含1.177.245个具有40个特征的示例,采用了sklearn.dataset的load_svmlight_file加载的SVM-light格式(稀疏矢量)。它产生一个“特征值”(1.177.245 * 40)的稀疏矩阵和一个“目标类别”(1s和0s,其中的1.177.245)阵列。我不知道这是否令人担忧,但训练数据有3552个积极因素,其余都是消极的。因为sk-learn的RFC不接受稀疏矩阵,所以我使用.toarray()将稀疏矩阵转换为密集数组(如果我说的是正确的?大量的0表示不存在的特征),则使用.toarray()将其转换为密集数组。在转换为数组之前和之后,我打印矩阵并且似乎正在进行。scikit-learn RandomForestClassifier产生'意外'结果

当我开始分类,并开始其拟合数据,它长期借此:

[Parallel(n_jobs=40)]: Done 1 out of 40 | elapsed: 24.7min remaining: 963.3min 
[Parallel(n_jobs=40)]: Done 40 out of 40 | elapsed: 27.2min finished 

(是输出正确的那些963分钟大约需要2个半......?)

然后我使用joblib.dump转储它。 当我重新加载:

RandomForestClassifier: RandomForestClassifier(bootstrap=True, compute_importances=True, 
     criterion=gini, max_depth=None, max_features=auto, 
     min_density=0.1, min_samples_leaf=1, min_samples_split=1, 
     n_estimators=1500, n_jobs=40, oob_score=False, 
     random_state=<mtrand.RandomState object at 0x2b2d076fa300>, 
     verbose=1) 

并测试其真实trainingdata(包括出750.709例子,完全一样的格式作为训练数据),我得到的“意外”的结果。确切地说, testdata中只有一个例子被分类为true。当我在一半的初始训练数据上训练并在另一半进行测试时,我根本没有任何积极的。

现在我没有理由相信发生了什么事情,这只是我得到奇怪的结果,而且我认为这一切都做得非常快。可能无法进行比较,但使用rt-rank(也包含1500次迭代,但有一半内核)在相同数据上训练RFClassifier需要12小时以上...

任何人都可以指导我是否拥有有什么理由相信某些东西不按照它应有的方式工作?这可能是训练数据中积极与否定的比例吗?干杯。

+0

其实我只是在写这篇文章的时候看到了正面对负面的确切比例,而对我来说这似乎是相当合理的,这就是原因。也许我的特征不足以区分大量的消极因素和少数积极因素? – graus

+0

尽管有[处理RF分类器中的不平衡数据集]的技术(http://www.stat.berkeley.edu/tech-reports/666.pdf),但我认为它们中的任何一个都没有在scikit-学习呢。 –

回答

4

事实上,这个数据集非常不平衡。我建议你对这些否定例子进行二次抽样(例如,随机抽取n_positive_samples),或者过分抽取正例(后者更昂贵,但可能产生更好的模型)。

你是否确定所有的特征都是数值特征(数值越大意味着现实生活中的某些特征)?如果它们中的一些是分类整数标记,则应该将这些特征分解为一个k布尔编码,而不是随机森林的scikit-learn实现不能直接处理分类数据。

+0

确实,极端不平衡似乎是造成0偏差的原因。我做了一个快速测试,通过降低负值并复制正值,并预测了更多的正值。 – graus

+0

@ogrisel是否可以在scikit-learn中进行下采样?我似乎没有找到任何地方的n_positive_samples参数。 – MaVe

+0

在scikit-learn中没有内置的重采样器(但是),但是您可以使用标准的numpy花式索引。 – ogrisel