我已经使用该模型在一组数据上训练分类器1000次迭代:
clf = GradientBoostingClassifier(n_estimators=1000, learning_rate=0.05, subsample=0.1, max_depth=3)
clf.fit(X, y, sample_weight=train_weight)
现在我想将迭代次数增加到2000.所以我这样做:
clf.set_params(n_estimators=2000, warm_start=True)
clf.fit(X, y, sample_weight=train_weight)
但是我收到以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-13-49cfdfd6c024> in <module>()
1 start = time.clock()
2 clf.set_params(n_estimators=2000, warm_start=True)
----> 3 clf.fit(X, y, sample_weight=train_weight)
4 ...
C:\Anaconda3\lib\site-packages\sklearn\ensemble\gradient_boosting.py in fit(self, X, y, sample_weight, monitor)
1002 self.estimators_.shape[0]))
1003 begin_at_stage = self.estimators_.shape[0]
-> 1004 y_pred = self._decision_function(X)
1005 self._resize_state()
1006
C:\Anaconda3\lib\site-packages\sklearn\ensemble\gradient_boosting.py in _decision_function(self, X)
1120 # not doing input validation.
1121 score = self._init_decision_function(X)
-> 1122 predict_stages(self.estimators_, X, self.learning_rate, score)
1123 return score
1124
sklearn/ensemble/_gradient_boosting.pyx in sklearn.ensemble._gradient_boosting.predict_stages (sklearn\ensemble\_gradient_boosting.c:2564)()
ValueError: ndarray is not C-contiguous
我在这里做错了什么?
答案 0 :(得分:2)
warm_start
。实际上有一个错误阻止了它的工作。
同时解决方法是将数组复制到C-contiguous数组:
X_train = np.copy(X_train, order='C')
X_test = np.copy(X_test, order='C')
参考:discussion和bug
答案 1 :(得分:0)
您通常无法在合适的调用之间修改sklearn分类器并期望它能够正常工作。估计量的数量实际上会影响模型内部对象的大小 - 因此它不仅仅是一些迭代(从编程的角度来看)。
答案 2 :(得分:0)
在我看来,问题是你没有将warm_start = True传递给构造函数。如果你这样做:
clf = GradientBoostingClassifier(n_estimators=1000, learning_rate=0.05, subsample=0.1, max_depth=3, warm_start=True)
您可以使用以下内容来安装其他估算工具:
clf.set_params(n_estimators=2000)
clf.fit(X, y, sample_weight=train_weight)
如果它不起作用,您可能应该尝试更新您的sklearn版本。