我在Python中从头开始实现10折交叉验证。我使用的Python版本是3.6,并且是在Spyder(Anaconda)中编写的。我的输入数据形状是data=(1440,390),label=(1440,1)。
我的代码如下:
def partitions(X,y): np.random.shuffle(X) foldx=[] foldy=[] j=0 for i in range(0,10): foldx[i]=X[j:j+143,:] foldy[i]=y[foldx[j]] j+=144 return np.array(foldx),np.array(foldy)def cv(X,y,model): trainx,trainy=partitions(X,y) scores=[] for i in range(0,10): xtest=trainx[i] ytest=trainy[xtest] xtrain=trainx[:i]+trainx[i+1:] ytrain=trainy[xtrain] model.fit(xtrain,ytrain) preds=model.predict(xtest) print(accuracy_score(np.ravel(ytest),preds)) scores.append(accuracy_score(np.ravel(ytest),preds)) return scores.mean()
错误出现在以下代码行:
foldx[i]=X[j:j+143,:]
错误信息显示为:
IndexError: list assignment index out of range.
如何修正这个问题?我在从头实现这样的问题上经验不多。
回答:
你需要先填充列表才能使用其索引,将foldx[i]=X[j:j+143,:]
这一行改为
foldx.append(X[j:j+143,:])
同样,对于foldy
也需要这样做
foldy.append(y[foldx[j]])