如何使用warm_start

时间:2017-03-13 06:47:52

标签: python scikit-learn

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

clf = RandomForestClassifier(...)
clf.fit(get_data())
clf.fit(get_more_data(), warm_start=True)

warm_start参数是构造函数参数。那我该做这样的事情吗?

clf = RandomForestClassifier()
clf.fit(get_data())
clf = RandomForestClassifier (warm_start=True)
clf.fit(get_more_data)

这对我没有意义。不会对构造函数的新调用丢弃以前的训练数据吗?我想我错过了什么。

4 个答案:

答案 0 :(得分:12)

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

clf = RandomForestClassifier(warm_start=True)
clf.fit(get_data())
clf.fit(get_more_data())

将是API正确的用法。

但这里有一个问题。

正如文档所说:

  

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

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

让我们用some sources检查:

  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.")

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

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

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

答案 1 :(得分:5)

为了增加优秀的@ 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) 

答案 2 :(得分: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为true时,现有的拟合模型属性an用于在随后的拟合调用中初始化新模型。 请注意,这仅适用于某些模型和某些参数,甚至某些数量的参数值。例如,在构建随机森林时,可以使用warm_start将更多的树添加到森林中(增加n_estimators),但不减少其数量。

partial_fit也保留了两次调用之间的模型,但是有所不同:使用warm_start更改参数,并且两次调用之间的数据保持一致(或多或少);使用partial_fit,数据更改和模型参数的最小批量将保持固定。

在某些情况下,您想使用warm_start来适应不同但密切相关的数据。例如,最初可能适合数据的一个子集,然后对整个数据集上的参数搜索进行微调。为了进行分类,需要执行一系列warm_start调用才能匹配的所有数据都必须包括每个类的样本。

答案 3 :(得分:1)

所有warm_start都归结为保留前一列火车的状态


它与partial_fit的不同之处在于,其思想不是逐步学习少量数据,而是重用已训练模型的先前状态。即,常规调用fit与已设置warm_start=True的拟合之间的差异是未清除估算器状态,请参见_clear_state

if not self.warm_start:
    self._clear_state()

除其他参数外,还会初始化所有估算器:

if hasattr(self, 'estimators_'):
    self.estimators_ = np.empty((0, 0), dtype=np.object)

因此,在随后每次对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)

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

rf = RandomForestClassifier(**rf_grid_search1.best_params_, warm_start=True)
rf.fit(X_train, y_train)

然后我们可以对GridSearchn_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)

这样做的好处是,估计量已经适合于先前的参数设置,并且随后每次调用fit时,模型将从先前的参数开始,我们只是在分析是否要添加新的估算器将使模型受益。