将随机森林分类分解成python中的碎片?

Posted

技术标签:

【中文标题】将随机森林分类分解成python中的碎片?【英文标题】:Break up Random forest classification fit into pieces in python? 【发布时间】:2015-08-24 21:38:36 【问题描述】:

我有近 900,000 行信息要通过 scikit-learn 的随机森林分类器算法运行。问题是,当我尝试创建模型时,我的计算机完全死机,所以我想尝试每 50,000 行运行一次模型,但我不确定这是否可行。

所以我现在的代码是

# This code freezes my computer
rfc.fit(X,Y)

#what I want is
model = rfc.fit(X.ix[0:50000],Y.ix[0:50000])
model = rfc.fit(X.ix[0:100000],Y.ix[0:100000])
model = rfc.fit(X.ix[0:150000],Y.ix[0:150000])
#... and so on

【问题讨论】:

【参考方案1】:

如果我错了,请随时纠正我,但我假设您没有使用最新版本的 scikit-learn(撰写本文时为 0.16.1),您在 Windows 机器上并使用n_jobs=-1(或三者的组合)。所以我的建议是首先升级scikit-learn 或设置n_jobs=1 并尝试拟合整个数据集。

如果失败,请查看warm_start 参数。通过将其设置为 True 并逐渐增加 n_estimators,您可以在数据子集上安装更多树:

# First build 100 trees on the first chunk
clf = RandomForestClassifier(n_estimators=100, warm_start=True)
clf.fit(X.ix[0:50000],Y.ix[0:50000])

# add another 100 estimators on chunk 2
clf.set_params(n_estimators=200)
clf.fit(X.ix[0:100000],Y.ix[0:100000])

# and so forth...
clf.set_params(n_estimators=300)
clf.fit(X.ix[0:150000],Y.ix[0:150000])

另一种可能性是在每个块上安装一个新的分类器,然后简单地对所有分类器的预测进行平均,或者将树合并到一个大的随机森林中,例如 described here。

【讨论】:

我在 Windows 机器上,但 pip freeze 显示我有 scikit 16.1 版,我的 n_jobs 设置为默认值 1。我不明白为什么它需要 4gb 的内存。 X 的形状是什么,例如你的特征向量有多少特征/属性? 您知道warm_start 是否类似于partial_fit 只是用户必须注意增加估算器的数量吗?【参考方案2】:

与 Andreus 的回答中所链接的方法类似的另一种方法是单独种植森林中的树木。

我不久前做过这个:基本上我在训练数据的不同分区上一次训练了多个 DecisionTreeClassifier 的一个。我通过酸洗保存了每个模型,然后将它们加载到分配给RandomForestClassifier 对象的estimators_ 属性的列表中。您还必须注意适当地设置其余的 RandomForestClassifier 属性。

I ran into memory issues when I built all the trees in a single python script。如果您使用此方法并遇到该问题,则有一种解决方法,我在链接的问题中发布。

【讨论】:

【参考方案3】:
from sklearn.datasets import load_iris
boston = load_iris()
X, y = boston.data, boston.target

### RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=10, warm_start=True)
rfc.fit(X[:50], y[:50])
print(rfc.score(X, y))
rfc.n_estimators += 10
rfc.fit(X[51:100], y[51:100])
print(rfc.score(X, y))
rfc.n_estimators += 10
rfc.fit(X[101:150], y[101:150])
print(rfc.score(X, y))

下面是warm_start和partial_fit的区别。

当在同一个数据集上重复拟合一个估计器时,但是对于多个参数值(例如在网格搜索中找到最大化性能的值),可以重用从先前参数值中学习的模型的各个方面,节约时间。当 warm_start 为真时,现有拟合模型属性用于在后续调用拟合中初始化新模型。 请注意,这仅适用于某些模型和某些参数,甚至某些参数值的顺序。例如,可以在构建随机森林时使用 warm_start 来向森林中添加更多树(增加 n_estimators),但不会减少它们的数量。

partial_fit 还保留调用之间的模型,但有所不同:使用 warm_start,参数会发生变化,并且数据在 fit 调用之间(或多或少)是恒定的;使用 partial_fit,小批量数据变化和模型参数保持不变。

在某些情况下,您希望使用 warm_start 来适应不同但密切相关的数据。例如,最初可能适合数据的一个子集,然后在整个数据集上微调参数搜索。对于分类,要拟合的一系列 warm_start 调用中的所有数据都必须包括来自每个类的样本。

【讨论】:

【参考方案4】:

scikit-learn 中的一些算法实现了“partial_fit()”方法,这正是您要寻找的。有随机森林算法可以做到这一点,但是,我相信 scikit-learn 算法不是这样的算法。

但是,此问题和答案可能有适合您的解决方法。你可以在不同的子集上训练森林,最后组装一个非常大的森林: Combining random forest models in scikit learn

【讨论】:

以上是关于将随机森林分类分解成python中的碎片?的主要内容,如果未能解决你的问题,请参考以下文章

随机森林总结

python中的随机森林:分类问题中的最终概率

分类算法 - 随机森林

单标签多类分类随机森林python

随机森林

如何将随机森林分类器应用于所有数据集,在 python 中一次一小部分