Scikit Learn 中小正样本集的机器学习实验设计
Machine Learning Experiment Design with Small Positive Sample Set in Sci-kit Learn
我对有关如何使用非常有限的正集和大量负集训练集的任何提示感兴趣。
我有大约 40 个正面示例(关于特定主题的相当冗长的文章)和大约 19,000 个负面示例(大部分来自 sci-kit learn 新闻组数据集)。我还有大约 1,000,000 条推文可供使用……对我尝试训练的主题持否定态度。负集与正集的大小是否会对训练分类器产生负面影响?
我想在 sci-kit 学习中使用交叉验证。我需要将其分解为训练/测试开发/测试集吗?知道 sci-kit 中有一些预构建的库。您推荐或以前使用过的任何实施示例都会有所帮助。
谢谢!
第一个问题的答案是肯定的,它对结果的影响程度取决于算法。我的建议是密切关注基于 class 的统计数据,例如召回率和精确率(在 classification_report
中找到)。
对于RandomForest()
你可以看看this thread里面讨论
样本权重参数。一般来说sample_weight
是什么
您在 scikit-learn
.
寻找
对于 SVM
,请查看 this example 或 这个
示例.
对于NB
classifiers,这个应该由贝叶斯隐式处理
规则,但实际上您可能会看到一些糟糕的表现。
关于你的第二个问题,有待讨论,我个人将我的数据分成训练和测试部分,对训练集执行交叉验证以进行参数估计,对所有训练数据重新训练,然后在我的测试集上进行测试.但是,您拥有的数据量可能会影响拆分数据的方式(更多数据意味着更多选项)。
您可能会使用随机森林来解决您的 class化问题。基本上有 3 个参数来处理数据不平衡。 Class 权重、样本大小和截止值。
Class权重-a class的权重越高,错误率越低
Samplesize- 对少数 class 进行过度采样以改善 class 不平衡,同时对每棵树的缺陷进行采样[不确定 Sci-kit 是否支持这个,曾经是 R 中的参数]
Cutoff- 如果 >x% 树投票给少数class,class将其确定为少数class。对于 2-class 问题,在随机森林中 x 默认为 1/2。你可以为少数class.
设置一个较低的值
检查 https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
处的平衡预测误差
对于第 2 个问题,如果您使用的是随机森林,则不需要单独设置 train/validation/test。随机森林不根据验证集选择任何参数,因此不需要验证集。
同样在Random Forest的训练过程中,训练每棵树的数据都是从训练数据中放回抽样得到的,因此每个训练样本大约有1/3的树没有被使用。我们可以使用这 1/3 树的投票来预测随机森林 classification 的开箱概率。因此,对于 OOB 准确性,您只需要一个训练集,而不需要验证或测试数据来预测看不见的数据的性能。检查 https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm 处的袋外错误以供进一步研究。
我对有关如何使用非常有限的正集和大量负集训练集的任何提示感兴趣。
我有大约 40 个正面示例(关于特定主题的相当冗长的文章)和大约 19,000 个负面示例(大部分来自 sci-kit learn 新闻组数据集)。我还有大约 1,000,000 条推文可供使用……对我尝试训练的主题持否定态度。负集与正集的大小是否会对训练分类器产生负面影响?
我想在 sci-kit 学习中使用交叉验证。我需要将其分解为训练/测试开发/测试集吗?知道 sci-kit 中有一些预构建的库。您推荐或以前使用过的任何实施示例都会有所帮助。 谢谢!
第一个问题的答案是肯定的,它对结果的影响程度取决于算法。我的建议是密切关注基于 class 的统计数据,例如召回率和精确率(在 classification_report
中找到)。
对于
RandomForest()
你可以看看this thread里面讨论 样本权重参数。一般来说sample_weight
是什么 您在scikit-learn
. 寻找
对于
SVM
,请查看 this example 或 这个 示例.对于
NB
classifiers,这个应该由贝叶斯隐式处理 规则,但实际上您可能会看到一些糟糕的表现。
关于你的第二个问题,有待讨论,我个人将我的数据分成训练和测试部分,对训练集执行交叉验证以进行参数估计,对所有训练数据重新训练,然后在我的测试集上进行测试.但是,您拥有的数据量可能会影响拆分数据的方式(更多数据意味着更多选项)。
您可能会使用随机森林来解决您的 class化问题。基本上有 3 个参数来处理数据不平衡。 Class 权重、样本大小和截止值。
Class权重-a class的权重越高,错误率越低
Samplesize- 对少数 class 进行过度采样以改善 class 不平衡,同时对每棵树的缺陷进行采样[不确定 Sci-kit 是否支持这个,曾经是 R 中的参数]
Cutoff- 如果 >x% 树投票给少数class,class将其确定为少数class。对于 2-class 问题,在随机森林中 x 默认为 1/2。你可以为少数class.
设置一个较低的值检查 https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
处的平衡预测误差对于第 2 个问题,如果您使用的是随机森林,则不需要单独设置 train/validation/test。随机森林不根据验证集选择任何参数,因此不需要验证集。
同样在Random Forest的训练过程中,训练每棵树的数据都是从训练数据中放回抽样得到的,因此每个训练样本大约有1/3的树没有被使用。我们可以使用这 1/3 树的投票来预测随机森林 classification 的开箱概率。因此,对于 OOB 准确性,您只需要一个训练集,而不需要验证或测试数据来预测看不见的数据的性能。检查 https://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm 处的袋外错误以供进一步研究。