Machine learning scikit学习随机分类器产生';意外';后果

Machine learning scikit学习随机分类器产生';意外';后果,machine-learning,classification,scikit-learn,random-forest,Machine Learning,Classification,Scikit Learn,Random Forest,我正在尝试使用sk learn的RandomForestClassifier进行二元分类任务(正面和负面示例)。我的训练数据包含1.177.245个示例和40个特征,采用SVM轻型格式(稀疏向量),我使用sklearn.dataset的load_svmlight_文件加载。它生成一个稀疏的“特征值”(1.177.245*40)矩阵和一个“目标类”(1和0,其中1.177.245)数组。我不知道这是否令人担忧,但培训数据有3552个正面,其余都是负面的 由于sk learn的RFC不接受稀疏矩阵,

我正在尝试使用sk learn的RandomForestClassifier进行二元分类任务(正面和负面示例)。我的训练数据包含1.177.245个示例和40个特征,采用SVM轻型格式(稀疏向量),我使用sklearn.dataset的load_svmlight_文件加载。它生成一个稀疏的“特征值”(1.177.245*40)矩阵和一个“目标类”(1和0,其中1.177.245)数组。我不知道这是否令人担忧,但培训数据有3552个正面,其余都是负面的

由于sk learn的RFC不接受稀疏矩阵,因此我使用.toarray()将稀疏矩阵转换为密集数组(如果我说的是对的话?许多0表示缺少的特性)。我在转换为数组之前和之后打印矩阵,看起来一切正常

当我启动分类器并开始将其拟合到数据时,需要花费这么长的时间:

[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.5分钟…)

然后使用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)
RandomForestClassifier:RandomForestClassifier(引导=True,计算重要性=True,
标准=基尼,最大深度=无,最大特征=自动,
最小密度=0.1,最小样本叶=1,最小样本分割=1,
n_估计值=1500,n_工作=40,oob_得分=False,
随机_状态=,
详细=1)
并在真实的培训数据(由750.709个示例组成,格式与培训数据完全相同)上进行测试,我得到了“意外”的结果。确切地说;testingdata中只有一个示例被归类为true。当我在一半的初始训练数据上进行训练,在另一半上进行测试时,我没有得到任何积极的结果

现在我没有理由相信所发生的事情有任何问题,只是我得到了奇怪的结果,而且我认为这一切都做得非常快。进行比较可能是不可能的,但是使用rt rank(也有1500次迭代,但有一半的核)在相同的数据上训练RFClassifier需要12个多小时


有谁能告诉我,我是否有任何理由相信某些事情没有按预期的方式运行?这可能是训练数据中正面和负面的比率吗?干杯。

事实上,这个数据集非常不平衡。我建议您对负面示例进行二次采样(例如,随机选取
n个正面示例
),或对正面示例进行过采样(后者成本更高,但可能产生更好的模型)


另外,您是否确定所有特征都是数字特征(较大的值在现实生活中意味着某些东西)?如果其中一些是分类整数标记,则应将这些功能分解为k个布尔编码之一,而不是scikit学习随机林的实现无法直接处理分类数据。

确实,此数据集非常不平衡。我建议您对负面示例进行二次采样(例如,随机选取
n个正面示例
),或对正面示例进行过采样(后者成本更高,但可能产生更好的模型)


另外,您是否确定所有特征都是数字特征(较大的值在现实生活中意味着某些东西)?如果其中一些是分类整数标记,则应将这些功能分解为k个布尔编码中的一个,而不是scikit学习随机林的实现无法直接处理分类数据。

实际上,我在写这篇文章时只查找了正反比,在我看来,这就是原因。也许我的功能不够好,无法区分大量的否定和少数的肯定?虽然有一些技巧,但我认为在scikit learn中还没有实现任何一种。实际上,我只是在写这篇文章时查找了肯定和否定的确切比率,在我看来,这就是原因。也许我的功能还不够好,无法区分大量的负面和少数正面?虽然有一些技术,但我认为在scikit learn中还没有实现任何技术。事实上,极端的不平衡似乎确实是0-bias的原因。我做了一个快速测试,对阴性样本进行下采样,复制阳性样本,并预测了更多的阳性样本。@ogrisel在scikit learn中可以进行下采样吗?我似乎在任何地方都找不到n_positive_samples参数。scikit learn中没有内置的重采样器(目前),但您可以使用标准的numpy fancy索引。事实上,极端的不平衡似乎确实是0偏差的原因。我做了一个快速测试,对阴性样本进行下采样,复制阳性样本,并预测了更多的阳性样本。@ogrisel在scikit learn中可以进行下采样吗?我似乎在任何地方都找不到n_positive_samples参数。scikit learn中没有内置的重采样器,但您可以使用标准的numpy索引。