我正在编写一个代码来实现 k 折交叉验证。
data = pd.read_csv('Data_assignment1.csv')k=10np.random.shuffle(data.values) # 打乱所有行folds = np.array_split(data, k) # 将数据分成 k 份for i in range(k): x_cv = folds[i][:, 0] # 设置第 i 份用于测试 y_cv = folds[i][:, 1] new_folds = np.row_stack(np.delete(folds, i, 0)) # 移除第 i 份用于训练 x_train = new_folds[:, 0] # 设置剩余部分用于训练 y_train = new_folds[:, 1]
在尝试为 x_cv 和 y_cv 设置值时,我遇到了以下错误:
TypeError: '(slice(None, None, None), 0)' is an invalid key
为了解决这个问题,我尝试使用了 folds.iloc[i][:, 0].values 等方法:
for i in range(k): x_cv = folds.iloc[i][:, 0].values # 设置第 i 份用于测试 y_cv = folds.iloc[i][:, 1].values new_folds = np.row_stack(np.delete(folds, i, 0)) # 移除第 i 份用于训练 x_train = new_folds.iloc[:, 0].values # 设置剩余部分用于训练 y_train = new_folds.iloc[:, 1].values
然后我得到了以下错误:
AttributeError: 'list' object has no attribute 'iloc'
我该如何解决这个问题?
回答:
folds = np.array_split(data, k)
将返回一个DataFrame 列表
。type(folds) == list
- 这就是你得到
AttributeError: 'list' object has no attribute 'iloc'
的原因。列表
对象没有iloc
方法。 - 所以你需要先通过索引访问列表以获取每个 DataFrame 对象。
folds[i]
。 type(folds[i]) == pandas.DataFrame
- 现在可以在
DataFrame
对象上使用iloc
。 folds[i].iloc[:,0].values