开发者社区> 问答> 正文

非官方入门指南bug更正

莫要骂lz,lz写完博客后忙于各种事今天晚上,才重新打开代码发现的问题。

原博客已更新
链接 http://oilbeater.com/2014/03/16/the-setup-of-bigdata-race/

上来parser date的时候就出错了应该是
if len(entry_date) == 5:
if len(entry_date) > 6:
    day = 10 * int(entry_date[2]) + int(entry_date[3])
原本数据分割的时候会出错,直接影响了训练集的大小和后面本地验证的准确。


还有就是在验证的代码里有两处
for line in f.readlines():
后面都需要在循环里跟一行line = line.strip()
不然可能会影响到测试的准确。


不要揍lz,lz也是今天晚上刚发现的,不过貌似这样的话直接提交验证集合F值会比之前还提升。


很多人说代码运行会出错,我提供的代码应该是一头一尾,数据预处理和结果验证,中间的算法部分是要自己实现的。需要把你的预测结果存到predict.txt中再运行验证部分的代码。这两部分代码和你的算法部分是分开运行的,通过文件的形式进行交互。


展开
收起
oilbeater 2014-03-22 23:29:09 8214 0
6 条回答
写回答
取消 提交回答
  • jxu
    楼主很负责,博客很有料,写的很多想法都很好,希望后面可以都尝试和实现。
    2014-03-24 23:05:08
    赞同 展开评论 打赏
  • Re非官方入门指南bug更正
    链接怎么打不开
    2014-03-24 20:49:13
    赞同 展开评论 打赏
  • Re非官方入门指南bug更正
    赞啊,我代码写的比较着急,有些地方都没注意。
    第一个问题应该是我之前读文件的时候又忘了strip()了,strip后原来==5的写法就没错了。
    第二个地方虽然简单粗暴,但是行之有效,不然还要写很多别的代码判断特殊情况。
    第三个还是strip的问题,第一次的时候时间太着急错误太多了

    2014-03-23 23:38:34
    赞同 展开评论 打赏
  • Re非官方入门指南bug更正
    首先感谢oilbeater热情提供代码,像我这种一点都不会的靠着研究oilbeater的代码也算知道了点比赛该怎么做,谢谢~
    然后就说正题,我也发现oilbeater的代码有些小bug,列出来一下:
    1.原代码:
             if len(entry_date) == 5:
            day = 10 * int(entry_date[2]) + int(entry_date[3])
    我没有改成>6,而是改成了
            if len(entry_date) == 6:
    答案算出来也是可以的

    2.原代码:
        for line in raw_file.readlines():
            entry = line.split(",")
            entry_date = datetime(*parse_date(entry[3]))
            date_delta = (entry_date - begin_date).days
            if date_delta < seperate_day:
                train.write(",".join(entry[:3]) + "," + str(date_delta) + "\n")
            elif int(entry[2]) == 1:
                validation.write(",".join(entry[:2]) + "\n")
        validation.write("99999999999,9"+ "\n")
        train.close()
        validation.close()
    加粗的是我添加的一行,因为发现在generate_result函数中会把validation.csv的最后一行忽略掉,也就是代码result.write(cur_id + "\t" + ",".join(set(cur_result)) + "\n"),看它往result.txt写入的是cur_id的数据而不是uid的数据,这样就会出现最后一行数据和前一行不同时数据无法被记录的情况。小白在多次调试后才找到了这个错误,不知道怎么聪明的改代码,就加了一行多余的记录来避免这个问题。
    def generate_result(validation):
        entrys = validation.readlines()
        entrys.sort(key=lambda x: x.split(",")[0])
        result = open("result.txt", "w")
        for index, entry in enumerate(entrys):
            uid, tid = entry.strip().split(",")
            if index == 0:
                cur_id = uid
                cur_result = [tid]
            elif uid == cur_id:
                cur_result.append(tid)
            else:
                result.write(cur_id + "\t" + ",".join(set(cur_result)) + "\n")
                cur_id = uid
                cur_result = [tid]
        result.close()
    3.原代码:
    f = open("predict.txt")
    for line in f.readlines():
        uid, bid = line.split("\t")
         bid = bid.strip('\n')
        bid = bid.split(",")
        predict_num += len(bid)
    加粗的是我添加的代码,不然predict里面是‘200\n’,而result里面是‘200’的时候,就hit不上了。

    楼主的代码还是很不错的,教会了我很多。顺路去楼主博客看看了看,楼主比较牛啊,以后要向楼主多学习学习。一会发完帖子,去加楼主QQ,望同意啊。




    2014-03-23 16:59:42
    赞同 展开评论 打赏
  • Re非官方入门指南bug更正
    呃……居然没发现……修改后结果果然提高了不少,哈哈
    2014-03-23 10:02:56
    赞同 展开评论 打赏
  • Re非官方入门指南bug更正
    啊,参考了楼主的代码,发现了也没有提醒楼主,我表示深深的自责!
    2014-03-23 08:42:07
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《Java开发手册》2019最新版发布! 立即下载
15分钟打造你自己的小程序更新版 立即下载
阿里开发者手册-单元测试专题 立即下载