在Python中合并大小不同的两个列表列表
我正在尝试写一个代码来进行10折交叉验证。
简单来说,就是把数据分成10个大小相等的部分。然后,在每次的10次循环中,拿出第i个部分,剩下的90%用作测试数据。
在第二次循环中,我需要把前10%的数据和最后80%的数据合在一起。第三次循环时,我把前20%的数据和最后70%的数据合在一起,依此类推。
(所以在第一次循环中,前10%的数据被去掉;在第二次循环中,第二个10%的数据被去掉,等等。)
我的数据总共有1000个项目,每个项目是一个包含70个np.float类型值的数组。
这个循环会在每次10次验证中被调用,i的值从0到9:
def get_training(input_array, i):
training = (input_array[:i*subset_size] + input_array[(i+1)*subset_size:])
return training
之前这个代码是可以正常工作的,但现在我遇到了一个错误:
operands could not be broadcast together with shapes (100,70) (800,70)
我觉得这可能是因为np.float数据类型的问题;之前用其他数据类型时是可以正常工作的。
谢谢!
2 个回答
1
试试这个:
training = np.concatenate((input_array[:i*subset_size], input_array[(i+1)*subset_size:]))
(对于numpy数组来说,+这个符号是用来把数值加在一起的,前提是它们的形状得一样:)
a = np.array(range(10))
print a + a # => [ 0 2 4 6 8 10 12 14 16 18]
2
别自己重复造轮子。你可以使用KFold
和StratifiedKFold
这两个函数,它们在sklearn.cross_validation
模块里。
可以看看文档:
K-Folds交叉验证迭代器。
它提供了训练和测试的索引,用来把数据分成训练集和测试集。这个方法会把数据集分成k个连续的部分(不打乱顺序)。
每一部分会被用作一次验证集,而剩下的k-1部分则组成训练集。