我有一个大数据集(100 万 x 50),我想预测一个特定的类。我曾想过将数据集以 20k 为一组进行隔离。然后训练一个分类器(比如说随机森林或基本的 SVM)。然后我如何通过提供额外的数据集来改进该分类器。换句话说,我如何保留在迭代 i 中创建的随机森林并在迭代i +1中用作起始模型来改进 python 中的模型?
如何在 python 中改进现有的机器学习分类器?
最简单,也可能是最好的方法是每次添加更多数据时重新构建模型。
如果您想在现有模型的基础上进行构建,一种方法是平均多个随机森林模型。因此,您在 20k 上构建模型,对其进行测试,然后决定通过在单独的 20k 集合上构建另一个随机森林模型并将模型参数结果与之前的模型进行平均来构建它。这基本上是一种描述不佳的集成方法。看看这个:http ://scikit-learn.org/stable/modules/ensemble.html 。
答案取决于您将数据分成块的动机。它的范围可以从“使用在线培训”到“使用集成方法”到“不要将数据分成块”。这里有几个可供考虑的选项。
正如@Hobbes 建议的那样,您可以在不同的数据子集上训练多个模型,然后将它们组合起来。这将使您可以在不同的机器上并行训练模型。学习的函数与在完整数据集上训练单个模型不同。
如果使用线性 SVM,您可以简单地继续训练模型。假设您在前 20k 积分上进行训练,然后再获得 20k 积分。使用第一个模型初始化优化,然后使用完整的 40k 点集进行训练。像随机梯度下降这样的在线方法是在大型数据集上训练 SVM 的好方法。SGD 一次处理一个点,因此不需要将数据分成块。如果完整的数据集可用,您可能会通过将其全部扫描而不是将其分成块来获得更快的收敛。
我冒昧地猜测您没有直接在 1M 数据点上使用内核化 SVM。但是,您可以通过使用内核执行特征空间映射来近似一个,然后在特征空间中训练线性 SVM。例如,Nyström 技术使用数据点的随机子样本来近似映射。一种选择是使用所有数据学习特征空间映射,然后增量训练线性 SVM。另一种方法是仅使用第一个数据块来学习映射。如果所有块都同样代表完整数据集并且添加新数据不会更改映射,则这是有效的。
对于随机森林,这种情况并不那么简单,因为各个树以贪婪的方式选择分层拆分。为最初的 20k 点选择的拆分可能与在全部 40k 点可用时选择的拆分不匹配。但是,要回去修改它们并不容易。然而,许多论文提出了可以在这种情况下使用的随机森林的在线变体。搜索“增量”或“在线”随机森林应该会出现相关结果。