前几天莫名其妙被老师抓去打了这个比赛,记录一下代码。
A榜+B榜加起来花不到一天,榜上正确率最高83%,我跑出来82%,多摸几次奖正确率应该有机会刷到更高,不过也是临时参赛,无所谓。
是我第一次打机器学习的比赛(虽然这比赛有点水),小小记录一下。
赛题主要是,给了一堆用户的数据,每个用户有40个特征,有些是类别数据,有些是数值数据。有较多缺失值。一共有6万组数据,要求对用户进行三分类。
主要的问题是数据预处理特别麻烦,因为要对每个特征手动判断类型。除此之外并没有什么特别困难的。
数据预处理
解压数据:
1 | ! pwd |
读取数据,把特征数据拆出来。
1 | import pandas as pd |
预处理备用函数:
1 | map_key_value = {} |
划分特征,分为数值特征和分类特征:
1 | ''' |
特殊数据处理
把时间格式转成数值类型的毫秒时间戳:
1 | ''' |
处理年龄未知(这组数据把未知年龄设成999了):
1 | ''' |
区域号不是数值类型,转成类别类型:
1 | ''' |
填充缺失值
需要缺失归零的数据:
1 | ''' |
剩下的数据,如果是类别数据就拿众数填充,如果是数值类型就拿均值填充:
1 | ''' |
最后导出来看看:
1 | X.to_csv('/home/workspace/output/data/X.csv', index=False) |
模型构建
标签转换,因为给定数据里,分类是1到3,但是很多模型需要分类从0开始,要做一个转换,之后转回来。
1 | def transform_labels(y): |
模型建立与训练,这里是用随机森林,也试过其他机器学习模型,在这个问题中随机森林表现最好。
1 | import pandas as pd |
这里的测试集上准确率为89%。
应用于测试数据
对测试数据进行处理:
1 | data = pd.read_csv("/home/workspace/output/data/testB.csv") |
1 | X['join_date'] = pd.to_datetime(X['join_date']) |
用模型预测:
1 | ! cp "/home/workspace/input/人工智能赛道(河南)/submitB.csv" "/home/workspace/output/submitB.csv" |
检查预测出来的每种类型个数,看看是否有异常:
1 | import pandas as pd |
我最终的结果是:
1 | 1 53976 |
看得出没有很异常。
优化
打完后才想起来这个数据集还有个特征是类别不均衡。针对这个特征继续特殊处理,应该能更好。算是我的第一次打这种机器学习比赛,以后会记得做()。