https://www.kesci.com/custom_landing/xwbank
2020年“创青春·交子杯”新网银行金融科技挑战赛-AI算法赛道,旨在鼓励选手运用前沿的人工智能技术解决金融科技等领域中的实际问题,激发选手创新能力,增强其动手能力。比赛挑战题目为“看见你的呼吸”,该项技术可应用于金融在线业务的生物识别、智能家居感应、智慧健康监控管理、健身训练助手等多个领域,期待挑战者利用机器学习和人工智能的最新成果,根据手机传感器的时间序列数据,设计出区分能力强、稳定性高的行为识别模型。
本次行为预测任务,参赛者需要利用从手机传感器采集的时间序列数据,建立模型识别对应时间段手机使用者的行为。该算法可应用于生活场景中走路、玩游戏等日常行为的识别,也可以应用于金融领域的客户异常行为实时识别,尤其是在在线信贷产品的申请、提现等关键服务环节。此类技术能进一步提升在电信诈骗、中介骗贷等金融场景中的欺诈风险识别和防范能力。
数据总体概述:
新网银行提供的手机行为数据集由多个采集对象使用安卓手机采集而成。样本采集对象包含多名男性和女性,年龄跨度在20-55岁,采集时要求采集对象在指定时间内按照其使用习惯完成指定动作。采集场景分为3类:行走、站立、坐卧;3个场景中各采集了:玩游戏、刷抖音或快手等短视频、看影视剧或综艺节目等长视频、网页浏览、编辑文字、其他动作(如拍照、语音通话、视频通话、发语音、图片PS)6类动作;此外,还单独设计了“递手机”的行为,此行为不区分场景。我们将“行为”定义为动作+场景的组合,因此共19种不同行为;训练集中已将行为预处理为0-18的编号(behavior_id)。数据集中每个行为片段(fragment_id)对应为5s的加速计读数:包含重力加速度(acc_xg, acc_yg, acc_zg)和不含重力加速度(acc_x, acc_y, acc_z);数据集每行对应fragment_id下某个时间点的加速计数据。数据分为训练集和测试集,分别用于训练模型和测试模型效果。
训练集
sensor_train.zip 中包含一个文件sensor_train.csv,共425360行(含表头),表头信息说明如下
序列 字段名称 格式 解释说明
测试集中,不同fragment_id对应不同的行为片段,共计7500组行为(编号0-7499)。
备注:选手需自行处理数据缺失、异常和少量的质量问题。
本次比赛数据由四川新网银行提供,仅可用于本次比赛,不得用于任何商业用途。
结果文件要求
请提交带有表头的「csv」文件,自由命名为「*.csv」形式。表头字段分别为「fragment_id, behavior_id」,中间由逗号分割(逗号为英文字符)。示例如下:
备注:数据集中包含一个「提交结果示例.csv」的提交样例文件,输出值为随机结果,供参赛人员参考。表头的字段名称必须是「fragment_id, behavior_id」,且第一列与第二列顺序不能交换,每个fragment_id不重复
导入工具包 & 读取数据
工具包导入
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
读取数据
path = './Data/'
df_train = pd.read_csv(path + 'sensor_train.csv' )
df_test = pd.read_csv(path + 'sensor_test.csv' )
df_train.head()
数据分析
df_train基础信息分析
info信息¶
df_train由3个int64的值以及5个float64的数字组成。
一共有29.2M以及4在不25359条记录;
df_train.info()
df_train.isnull().sum()
Nunique信息
fragment_id有7292个不同的值;
time_point有5000个不同的值;
acc_x有212个值;
acc_y有159个值;
acc_z有300个值;
acc_xg有300个值;
acc_yg有272个值;
acc_zg有284个值;
behavior_id有19个值;
df_train.nunique()
df_train单变量观察
time_point观察
df_train.describe()
time_point最大值为4999,最小值为0;
time_point大部分数据都集中在1000-4000之间;
df_train[‘time_point’].describe()
plt.figure(figsize = [12,6])
sns.boxplot(df_train['time_point'])
acc_x
acc_x都机正在0附近,也存在部分极大极小值,最小的为-14.7,最大的为34.5
df_train['acc_x'].describe()
df_test['acc_x'].describe()
plt.figure(figsize = [12,6])
sns.boxplot(df_train['acc_x'])
behavior_id
behavior_id不存在极不平衡的情况;
D是最少的;
4和0也是最少的;
df_label = df_train.groupby(['fragment_id'])['behavior_id'].agg({'count','first'}).reset_index()
df_label.columns = ['fragment_id','behavior_count','behavior_id']
df_label['behavior_id'].value_counts()
mapping = {0: 'A_0', 1: 'A_1', 2: 'A_2', 3: 'A_3',
4: 'D_4', 5: 'A_5', 6: 'B_1',7: 'B_5',
8: 'B_2', 9: 'B_3', 10: 'B_0', 11: 'A_6',
12: 'C_1', 13: 'C_3', 14: 'C_0', 15: 'B_6',
16: 'C_2', 17: 'C_5', 18: 'C_6'}
df_label['first_behavior'] = df_label['behavior_id'].map(mapping).apply(lambda x: x[0])
df_label['second_behavior'] = df_label['behavior_id'].map(mapping).apply(lambda x: x[-1])
df_label['first_behavior'].value_counts()
df_label['second_behavior'].value_counts()