我正在使用 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 有两个元素(因为 list(zip(x,y))
has length 等于 min(len(x),len(y)
)。
因此,您会得到 IndexError
因为 cv
中的一些列表当您使用 np.mean
计算平均值时,它们都是空的(除了前两个) .
解决方案:
如果不需要使用GridSearchCV
在其余型号上,您只需扩展 params
包含空字典的列表:
params = [{'C': [0.01, 1]}, {'n_estimators': [10, 20]}, {}, {}, {}, {}]
关于python - 如何修复Python中的 "IndexError: tuple index out of range"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060964/