先说个结论:使用numpy和pandas都可方便的使用sklearn的交叉验证函数cross_validation_score,但是pandas更好,可以用于更多的适应情况,比如自己写评估函数等。
# np.loadtxt读取label.csv(跳过表头),作为tmp_data
tmp_data = np.loadtxt("data.csv", delimiter=',', skiprows=1).astype(float)
如果你想提取一个同等列宽的表头,可以像下面这样做,但是我还没想到这样能做什么。所以,看看就好,下面与它无关。
# 提取表头
headLine = ["Unnamed"]
headLine.extend(pd.read_csv("data.csv", index_col=[0]).columns.tolist())
print(f"headLine:{headLine}")
此时打乱数据集比较随便,np.random.shuffle、sklearn.utils.shuffle都可以。
# 打乱数据集
from sklearn import utils
tmp_data = utils.shuffle(tmp_data)
print(f"tmp_data:\n{tmp_data}\nlen of tmp_data:{len(tmp_data)}")
k = 4 # k折
k_sample_count = tmp_data.shape[0] // k # 每折多少行数据(这里使用整除)
# 根据k折,划分数据集
for fold in range(k):
validation_begin = k_sample_count * fold
validation_end = k_sample_count * (fold + 1)
validation_data = tmp_data[validation_begin:validation_end]
# np.vstack 沿着垂直的方向堆叠数据,拼接得到训练集
train_data = np.vastack([
tmp_data[:validation_begin],
tmp_data[validation_end:]
])
# pandas读取
tmp_data = pd.read_csv("data.csv", index_col=[0]) # 将data.csv的第一列作为索引
print(f"len of tmp_data:{len(tmp_data)}")
此时要 使用sklearn.utils.shuffle打乱数据集,用pandas自带的sample也可。但不能使用numpy.random.shuffle(),因为其不能用于处理string类型,但表头columns含有string类型!
from sklearn import utils
tmp_data = utils.shuffle(tmp_data)
print(f"tmp_data:\n{tmp_data}\nlen of tmp_data:{len(tmp_data)}")
k = 4 # k折
k_sample_count = tmp_data.shape[0] // k # 每折多少行数据(这里使用整除)
# 根据k折,划分数据集
for fold in range(k):
validation_begin = k_sample_count * fold
validation_end = k_sample_count * (fold + 1)
# 验证集(或者叫测试集)
validation_data = tmp_data[validation_begin:validation_end]
# 训练集,pd.concat 沿着垂直的方向堆叠数据,拼接得到训练集
train_data = pd.concat([
tmp_data[:validation_begin],
tmp_data[validation_end:]
])
# 重新索引(这一步可有可不有,看你自己情况,需要索引重新降序排列你就加)
train_data.index = np.arange(len(train_data))
validation_data.index = np.arange(len(validation_data))
print(f"第{fold}折") # f 代表format
print(f"train_data:\n{train_data}, \nvalidation_data:\n{validation_data}")
# 继续你的表演,你可以在这里写自己的评估函数
# 或者在这里使用sklearn.metrics.cross_validation_score处理你上面划分好的数据集。
(参考链接:https://blog.csdn.net/weixin_38536057/article/details/78702564)
# K-fold进行数据分割
from sklearn.model_selection import KFold
kf = KFold(25, n_folds=5, shuffle=False)
# X是大的数据集
kf.split(X)
# print 每个训练集和测试集的内容
print '{} {:^61} {}'.format('Iteration', 'Training set observations', 'Testing set observations')
for iteration, (train, test) in enumerate(kf, start=1):
print '{:^9} {} {:^25}'.format(iteration, train, test)
Iteration Training set observations Testing set observations
1 [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] [0 1 2 3 4]
2 [ 0 1 2 3 4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] [5 6 7 8 9]
3 [ 0 1 2 3 4 5 6 7 8 9 15 16 17 18 19 20 21 22 23 24] [10 11 12 13 14]
4 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 20 21 22 23 24] [15 16 17 18 19]
5 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19] [20 21 22 23 24]