我正在使用 sklearn 模块来寻找最合适的模型和模型参数。但是,我在下面遇到了意外的索引错误:
> IndexError Traceback (most recent call
> last) <ipython-input-38-ea3f99e30226> in <module>
> 22 s = mean_squared_error(y[ts], best_m.predict(X[ts]))
> 23 cv[i].append(s)
> ---> 24 print(np.mean(cv, 1))
> IndexError: tuple index out of range
我想做的是找到最合适的回归量及其参数,但我遇到了上述错误。我查看了 SO 并尝试了 this solution但仍然会出现同样的错误。任何想法来修复这个错误?谁能指出我为什么会发生此错误?有什么想法吗?
我的代码:
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from xgboost.sklearn import XGBRegressor
from sklearn.datasets import make_regression
models = [SVR(), RandomForestRegressor(), LinearRegression(), Ridge(), Lasso(), XGBRegressor()]
params = [{'C': [0.01, 1]}, {'n_estimators': [10, 20]}]
X, y = make_regression(n_samples=10000, n_features=20)
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
cv = [[] for _ in range(len(models))]
fold = KFold(5,shuffle=False)
for tr, ts in fold.split(X):
for i, (model, param) in enumerate(zip(models, params)):
best_m = GridSearchCV(model, param)
best_m.fit(X[tr], y[tr])
s = mean_squared_error(y[ts], best_m.predict(X[ts]))
cv[i].append(s)
print(np.mean(cv, 1))
期望的输出:
如果有解决上述错误的方法,我希望选择带参数的最佳拟合模型,然后将其用于估计。任何改进上述尝试的想法?谢谢
请您参考如下方法:
当你定义
cv = [[] for _ in range(len(models))]
每个模型都有一个空列表。 然而,在循环中,你遍历了只有 两个 元素的 enumerate(zip(models, params)),因为你的 params 列表有两个元素(因为 list(zip(x,y)) has length 等于 min(len(x),len(y))。
因此,当您使用 np 计算平均值时,您会得到一个 。IndexError,因为 cv 中的一些列表是空的(除前两个外)。意思是
解决方案: 如果您不需要在剩余的模型上使用 GridSearchCV,您可以使用空字典扩展 params 列表:
params = [{'C': [0.01, 1]}, {'n_estimators': [10, 20]}, {}, {}, {}, {}]
