本次想把过程写的详细些,所以本节和上一节讲了如何充分利用大数据平台处理数据,如何利用最有效的工具进行数据存储、处理、分析。另外这次准备用Inceptor(分布式SQL引擎,可以理解为Hive数仓)、Sophon、R语言来完成。
在下一节,我会将建模过程思路和大家分享。
本节详细步骤如下。
一、上传数据文件至HDFS目录。
训练数据和AB榜测试数据。
hadoop fs -mkdir /tmp/jbw/ant/atec_anti_fraud_train
hadoop fs -mkdir /tmp/jbw/ant/atec_anti_fraud_test_a
hadoop fs -mkdir /tmp/jbw/ant/atec_anti_fraud_test_b
hadoop fs -put /mnt/disk1/ant/atec_anti_fraud_train_convert.csv /tmp/jbw/ant/atec_anti_fraud_train
hadoop fs -put /mnt/disk1/ant/atec_anti_fraud_test_a_convert.csv /tmp/jbw/ant/atec_anti_fraud_test_a
hadoop fs -put /mnt/disk1/ant/atec_anti_fraud_test_b_convert.csv /tmp/jbw/ant/atec_anti_fraud_test_b
二、创建外表、导入数据
DROP TABLE IF EXISTS bowen_payment_risk.atec_anti_fraud_train_ex;
CREATE EXTERNAL TABLE bowen_payment_risk.atec_anti_fraud_train_ex(
id STRING,
label STRING,
pay_date STRING,
f1 DOUBLE,
f2 DOUBLE,
f3 DOUBLE,
...
f297 DOUBLE
)
ROW FORMAT DELIMITED fields terminated by ','
LOCATION '/tmp/jbw/ant/atec_anti_fraud_train';
上一篇博客有完整SQL:天池大赛风险大脑-支付风险识别(一)数据预处理
三、检测数据
数据质量:
-- 检查数据质量,即label的取值(经过验证,发现label取值只会为0,1,-1,分别是无风险,有风险,无标签)
SELECT
COUNT(*)
FROM
atec_anti_fraud_train_mini_ex
WHERE
label != 0 AND label != 1 AND label != -1;
筛选出有标签的数据,并去掉表头:
-- 有标签的数据
DROP TABLE IF EXISTS atec_anti_fraud_train_label;
CREATE TABLE atec_anti_fraud_train_label AS
SELECT
*
FROM
atec_anti_fraud_train_mini_ex
WHERE
id != "id" AND label != -1;
查看带标签数据中有风险与无风险的数据情况:
-- 共990006条有标签的数据,有风险的共12122条数据,无风险的有97884条数据。
SELECT
count(*)
FROM
atec_anti_fraud_train_label
WHERE
label = 1;
比例还行,所以在数据预处理中不用对原始数据进行采样了,直接干。
重复ID检测:
-- 判断训练数据集是否有重复id
-- 若有则需要将id送入模型训练,若无则不需要
DROP TABLE IF EXISTS distincted_count_atec_anti_fraud_train_label;
CREATE TABLE distincted_count_atec_anti_fraud_train_label AS
SELECT
DISTINCT id
FROM
-- atec_anti_fraud_test_a
-- atec_anti_fraud_test_b
atec_anti_fraud_train_label;
-- b榜测试数据表
DROP TABLE IF EXISTS atec_anti_fraud_test_b;
CREATE TABLE atec_anti_fraud_test_b AS
SELECT
*
FROM
atec_anti_fraud_test_b_ex
WHERE
id != "id";
-- 判断b榜测试集中是否有重复id
DROP TABLE IF EXISTS distincted_count_atec_anti_fraud_test_b;
CREATE TABLE distincted_count_atec_anti_fraud_test_b AS
SELECT
DISTINCT id
FROM
-- atec_anti_fraud_test_a
atec_anti_fraud_test_b;
-- atec_anti_fraud_train_label;
-- 结果为990006,说明无重复的id,放心搞
SELECT count(*) FROM distincted_count_atec_anti_fraud_train_label;
-- 结果为500539,说明b榜测试数据无重复的id,也可放心搞
SELECT * FROM atec_anti_fraud_test_b WHERE id != "id" LIMIT 10;