递归错误:混合 SKlearn 模型时超出最大递归深度



我正在尝试混合不同的SciKit学习模型,以便我可以平均他们的预测。

这是我创建的Ensemble类:

from sklearn.base import BaseEstimator, TransformerMixin, RegressorMixin, clone
class AverageEnsembler(BaseEstimator, RegressorMixin, TransformerMixin):
def __init__(self, models):
self.models = models
def fit(self, X, y):
self.models_ = [clone(x) for x in self.models]
for mod in self.models_:
mod.fit(X, y)

def predict(self, X):
predictions = np.column_stack([self.predict(X) for mod in self.models_])
return np.mean(predictions, axis=1)

我以这种方式初始化了以下模型:

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=.005, max_iter=5000)
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=10)
from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor(n_estimators=100, min_samples_leaf=5)
from sklearn.ensemble import GradientBoostingRegressor
gbr = GradientBoostingRegressor(n_estimators=3000, learning_rate=0.04, max_depth=3, 
max_features='sqrt', min_samples_leaf=15, min_samples_split=10)
scores = np.sqrt(-1 * cross_val_score(estimator=gbr, X=X, y=y, scoring='neg_mean_squared_error', 
cv=10))

无论如何,每当我尝试调用predict()方法时,我都会收到此错误。 我已经尝试了不同模型的不同组合,但没有效果。 当我安装它们时,我从未在任何单个模型上收到此错误。

这是回溯:

averaged_models = AverageEnsembler(models=[ridge, forest, xgb])
averaged_models.fit(X_linear, y)
averaged_models.predict(X_linear)

---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-341-1a5f198918ce> in <module>
----> 1 averaged_models.predict(X_linear)
<ipython-input-286-404e1a1b5a0a> in predict(self, X)
14 
15     def predict(self, X):
---> 16         predictions = np.column_stack([self.predict(X) for mod in self.models_])
17         return np.mean(predictions, axis=1)
<ipython-input-286-404e1a1b5a0a> in <listcomp>(.0)
14 
15     def predict(self, X):
---> 16         predictions = np.column_stack([self.predict(X) for mod in self.models_])
17         return np.mean(predictions, axis=1)
... last 2 frames repeated, from the frame below ...
<ipython-input-286-404e1a1b5a0a> in predict(self, X)
14 
15     def predict(self, X):
---> 16         predictions = np.column_stack([self.predict(X) for mod in self.models_])
17         return np.mean(predictions, axis=1)
RecursionError: maximum recursion depth exceeded

你不是说这样吗:

class AverageEnsembler(BaseEstimator, RegressorMixin, TransformerMixin):
def __init__(self, models):
self.models = models
def fit(self, X, y):
self.models_ = [clone(x) for x in self.models]
for mod in self.models_:
mod.fit(X, y)

def predict(self, X):
predictions = np.column_stack([mod.predict(X) for mod in self.models_])
return np.mean(predictions, axis=1)

您正在无限递归中调用自己的预测方法。

最新更新