缘起
在 kaggle 比赛的一个分类任务上,在本地验证集的准确率有 60+% 的准确率,但提交上去的测试结果却只有百分之一。
今日重新检查结果,终于发现了大大的 bug,原来在训练的时候程序是按照字符顺序读的:
'0', '1', '10', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '11', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '12', '13', '14', '15',...
而朕给的标签确是:
0, 1, 2, 3, 4, 5,...
虽然在本地训练时,验证集和训练集是一致的,但提交答案是显然行不通了。
因此,朕把之前的结果下载回来,把预测标签变换到正确的结果,即做如下变换:
0 => 0
1 => 1
2 => 10
3 => 100
4 => 101
5 => 102
6 => 103
7 => 104
8 => 105
9 => 106
10 => 107
11 => 108
12 => 109
13 => 11
...
要找到这个变换很容易:
l = []
for i in range(120): # 120 类
l.append(str(i))
l.sort()
trans = [int(i) for i in l]
for i,d in enumerate(trans):
print('{} => {}'.format(i,d))
接下来要做的就是读写 csv 了。
读写 csv
import pandas as pd
# read
csv_data = pd.read_csv('...xxx.csv') # 读取训练数据
csv_data.head()
# transform
cat = list(csv_data["Category"])
trans_cat = [trans[i] for i in cat]
csv_data["Category"] = trans_cat
# write
csv_data.to_csv("...xxx_new.csv",
index=False,
columns=['Id', 'Category'],
encoding='utf-8')
csv_data.head()
ok