Skip to main content
 首页 » 编程设计

python之如何在 python 中修复 "IndexError: tuple index out of range"

2025年05月04日20insus

我正在使用 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]}, {}, {}, {}, {}]