我想通过scikit-learn的随机森林分类器算法运行大约900,000行信息。问题是,当我尝试创建模型时,我的计算机完全冻结,所以我想尝试的是每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
答案 0 :(得分:2)
如果我错了,请随意纠正我,但我认为你没有使用最新版本的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。
答案 1 :(得分:2)
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为true时,现有的拟合模型属性an用于在随后的拟合调用中初始化新模型。 请注意,这仅适用于某些模型和某些参数,甚至某些数量的参数值。例如,在构建随机森林时,可以使用warm_start将更多的树添加到森林中(增加n_estimators),但不减少其数量。
partial_fit也保留了两次调用之间的模型,但是有所不同:使用warm_start更改参数,并且两次调用之间的数据保持一致(或多或少);使用partial_fit,数据更改和模型参数的最小批量将保持固定。
在某些情况下,您想使用warm_start来适应不同但密切相关的数据。例如,最初可能适合数据的一个子集,然后对整个数据集上的参数搜索进行微调。为了进行分类,需要执行一系列warm_start调用才能匹配的所有数据都必须包括每个类的样本。
答案 2 :(得分:1)
scikit-learn工具中的一些算法' partial_fit()'方法,这是你正在寻找的。有随机森林算法这样做,但是,我相信scikit-learn算法不是这样的算法。
但是,这个问题和答案可能有一个适合您的解决方法。你可以在不同的子集上训练森林,并在最后组装一个真正的大森林: Combining random forest models in scikit learn
答案 3 :(得分:1)
另一种方法类似于Andreus'答案是单独种植森林中的树木。
我这样做了一段时间:基本上我在训练数据的不同分区上一次训练了一些DecisionTreeClassifier
个。我通过酸洗保存了每个模型,之后我将它们加载到一个列表中,该列表已分配给estimators_
对象的RandomForestClassifier
属性。您还必须注意适当地设置其余的RandomForestClassifier
属性。
I ran into memory issues when I built all the trees in a single python script。如果你使用这种方法并遇到这个问题,我就可以解决这个问题了。