如何使用warm_start

zor*_*119 10 python scikit-learn

我想使用该warm_start参数将训练数据添加到我的随机林分类器中.我希望它像这样使用:

clf = RandomForestClassifier(...)
clf.fit(get_data())
clf.fit(get_more_data(), warm_start=True)
Run Code Online (Sandbox Code Playgroud)

但该warm_start参数是构造函数参数.所以我会这样做吗?

clf = RandomForestClassifier()
clf.fit(get_data())
clf = RandomForestClassifier (warm_start=True)
clf.fit(get_more_data)
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义.对构造函数的新调用是否会丢弃以前的训练数据?我想我错过了什么.

sas*_*cha 15

基本模式(取自Miriam的回答):

clf = RandomForestClassifier(warm_start=True)
clf.fit(get_data())
clf.fit(get_more_data())
Run Code Online (Sandbox Code Playgroud)

将是API正确的用法.

但这里有一个问题.

正如文档所说:

设置为True时,重复使用上一个调用的解决方案以适应并向整体添加更多估算器,否则,只需适合整个新林.

这意味着,唯一warm_start能为您做的就是添加新的DecisionTree.所有以前的树木似乎都没有受到影响!

让我们用一些来源检查一下:

  n_more_estimators = self.n_estimators - len(self.estimators_)

    if n_more_estimators < 0:
        raise ValueError('n_estimators=%d must be larger or equal to '
                         'len(estimators_)=%d when warm_start==True'
                         % (self.n_estimators, len(self.estimators_)))

    elif n_more_estimators == 0:
        warn("Warm-start fitting without increasing n_estimators does not "
             "fit new trees.")
Run Code Online (Sandbox Code Playgroud)

这基本上告诉我们,在接近新的拟合之前,你需要增加估算器的数量!

我不知道sklearn在这里的用途是什么.我不确定,如果拟合,增加内部变量和再次拟合是正确的用法,但我不知何故怀疑它(特别是因为n_estimators不是公共类变量).

你的基本方法(关于这个库和这个分类器)对你的核心学习可能不是一个好主意!我不会进一步追求这一点.

  • 我知道这已经过时了,但是 - 我如何使用保存的模型来解决这个问题?有可能吗? (2认同)

小智 8

只是为了增加出色的@sascha答案,此hackie方法有效:

rf = RandomForestClassifier(n_estimators=1, warm_start=True)                     
rf.fit(X_train, y_train)
rf.n_estimators += 1
rf.fit(X_train, y_train) 
Run Code Online (Sandbox Code Playgroud)

  • 我在一个循环中构建了这个逻辑,每次迭代地将 n_estimators 增加 100 棵树。我预计所有迭代都需要相同的计算时间,因为它们都在做相同的事情:再训练 100 个独立的树并将它们添加到集成中。然而时间线性增加...... (2认同)

man*_*sad 6

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))
Run Code Online (Sandbox Code Playgroud)

下面是warm_start 和partial_fit 之间的区别。

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

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

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


yat*_*atu 6

一切warm_start都归结为保留前一列火车的状态。


它与 a 的不同之处partial_fit在于,它的想法不是逐步学习小批量数据,而是重新使用先前状态下的训练模型。即,常规调用fit和已设置的拟合之间的区别warm_start=True在于估计器状态未清除,请参阅_clear_state

if not self.warm_start:
    self._clear_state()
Run Code Online (Sandbox Code Playgroud)

除其他参数外,其中还将初始化所有估计器:

if hasattr(self, 'estimators_'):
    self.estimators_ = np.empty((0, 0), dtype=np.object)
Run Code Online (Sandbox Code Playgroud)

warm_start=True因此,在每次后续调用中设置fit不会初始化可训练参数,而是从之前的状态开始并向模型添加新的估计器。


这意味着人们可以这样做:

grid1={'bootstrap': [True, False],
 'max_depth': [10, 20, 30, 40, 50, 60],
 'max_features': ['auto', 'sqrt'],
 'min_samples_leaf': [1, 2, 4],
 'min_samples_split': [2, 5, 10]}

rf_grid_search1 = GridSearchCV(estimator = RandomForestClassifier(), 
                               param_distributions = grid1,
                               cv = 3,
                               random_state=12)
rf_grid_search1.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

然后根据最佳参数拟合模型并设置warm_start=True

rf = RandomForestClassifier(**rf_grid_search1.best_params_, warm_start=True)
rf.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

GridSearch 然后我们只能执行say n_estimators

grid2 = {'n_estimators': [200, 400, 600, 800, 1000]}
rf_grid_search2 = GridSearchCV(estimator = rf,
                               param_distributions = grid2,
                               cv = 3, 
                               random_state=12,
                               n_iter=4)
rf_grid_search2.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

这里的优点是估计器已经适合以前的参数设置,并且每次后续调用 时fit,模型将从以前的参数开始,我们只是分析添加新的估计器是否会对模型有利。