美文网首页
2017京东登录识别-R代码

2017京东登录识别-R代码

作者: hallo128 | 来源:发表于2018-01-16 16:39 被阅读0次

    2017京东登录识别-R代码

    GitHub:https://github.com/hallo128/Compete/tree/master/jd_game

    (注:简书的排版不太友好,很多内容没有显示出来,而我也不准备死磕来调格式。如果对代码或者更细致的内容感兴趣的,可以前往上面的GitHub下载这篇完整的PDF,当然了里面也会有数据和代码,也可以练练手)

    处理数据前:先用SPSS和Excel进行数据的查看(排序、描述统计、类别数、比例、异常等)

    1、代码实现功能介绍

    R实现部分,我将主要解释说明,特征构建和结果导出部分;模型构建的话,不限于R语言做出的结果。

    构建特征表【时间类型转换、分组统计特征、数据集合并】-训练集、测试集

    输入:赛题给定数据.csv

    输出:可用于建模的特征表.csv

    模型构建【平衡样本、分训练集和验证集、模型(选参数、预测结果)】

    输入:用于建模的特征表.csv

    输出:测试集的预测数据.csv

    结果导出【数据匹配、按指定格式导出】

    输入:测试集的预测数据.csv(适用于不同软件做出的结果)

    输出:可用于提交的数据.csv

    2、构建特征表

    1)代码文件:

    由于构建特征的时候,我们有过很多思路,按天、按1/4天、按ip,但都是基于一开始的文件演变的。

    而且最后结果显示第一个文件的特征说明也比较好,所以我只特别介绍一个文件。

    文件2:“构建特征6个小时-训练集.R”、“构建特征6个小时-测试集.R” 

    特别地,登录数据“按id,按1/4天”进行切分

    文件3:“构建特征6个小时-训练集+ip.R”、“构建特征6个小时-测试集+ip.R”

    特别地,在文件2的基础上,添加了ip数据的信息

    R编程方法介绍【时间类型转换、分组统计特征、数据集合并】

    1、时间类型转换

    时间类型转换【字符串-时间戳-取时间】

    R语言中可以方便实现这3个内容的相互转换

    1)为什么需要转换 

    实际记录需要:

    很多比赛都会给出时间戳或时刻点,这个指标存在的原因:一方面,是由于系统在记录用户行为的时候,肯定会记录下用户是什么时刻发生了这样的行为;另一方面,很多时候我们考虑和观测到的都是一个随着时间变化的行为,正因为有了时间的记录和排序,从而让我们有可能随着时间来得到有用的信息。

    建模构建特征需要:

    首先,时间戳有利于你将数据按时间排序。

    其次,时间戳便于你提取时间特征(年、月、日、小时、分钟、周)

    最后,时间戳便于计算时间差(只需要2个时间戳相减)和平均时刻

    (2)R语言如何实现

    R语言中重点介绍2个函数:as.POSIXct()和strptime(),下面是这2个函数的具体使用方法

    2、分组统计特征

    这个内容对于经常使用数据库,写SQL语言的同学,应该不陌生。写R代码时,查到过好几包,目前我选择了dplyr。接下来我将说明它的具体用法。 

    (1)步骤:

    先把需要分组的关键字转换为“因子型”

    group_by()——数据没有变化,为第三步做准备

    对第二步的数据集调用summarise(),可以进行的统计指标,如右图所示【缺点:只能调用右图的函数】

    (2)例子 

    (3)特别地,结合dplyr::filter()使用,可以按条件进行分组统计

    3、数据集合并及相关数据处理方法

    合并数据集——merge()

    过滤数据集——subset()与dplyr::filter()

    检查数据完整性并填充——complete.cases()、na.omit()、is.na()

    多指标排序——order()

    纵向合并数据——cbind()

    对某列数据进行切分——splitstackshape::cSplit()

    导出数据——write.csv() 

    4、结果导出

    为了使测试集的预测数据与用于提交的数据进行匹配,按照我们构建特征的思路。就是“按id,按小时”进行匹配,即可。

    对导出数据的格式进行查看(通过notepad++或者任何编辑器)。

    需要注意的是,R语言中导出的数值很有可能是字符型,那么可以通过如下公式进行转换。

    kk$y <- as.numeric(as.character(kk$y))

    t1 = 1428641659                #时间戳(数值)

    time1 = '2015-04-10 12:54:19'  #时刻(字符串) 

    #----------------时间转换

    #----法一:as.POSIXct()

    #用法:输入-时间戳/字符串,先转换为日期型;再按需要,转换为字符串/时间戳

    #用法1:将时间戳转换字符串

    l0 = as.POSIXct(t1, origin="1970-01-01 00:00:00")    #将时间戳转换为日期型

    lc = as.character(l0)                                                    #将日期型转换为字符串

    #用法2:将字符串转换时间戳

    l1 = as.POSIXct(time1, origin="1970-01-01 00:00:00")  #将字符串转换为日期型

    l2 = as.numeric(l1)                                                          #将日期型转换为时间戳

    l3 = as.numeric(as.POSIXct(time1, origin="1970-01-01 00:00:00"))  #将字符串转换为时间戳(最常用)

    #----法二:strptime()

    #特别地:输入-只能为字符串

    l4 = as.numeric(strptime(time1,"%Y-%m-%d %H:%M:%S"))  #将字符串转换为时间戳(用法类似)

    #特点:任意取出时间点

    hour = strftime(time1, format = "%m-%d %H")

    相关文章

      网友评论

          本文标题:2017京东登录识别-R代码

          本文链接:https://www.haomeiwen.com/subject/uqzsoxtx.html