2017京东登录识别-R代码

2018-01-16  本文已影响0人  hallo128

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")

上一篇下一篇

猜你喜欢

热点阅读