1. 程式人生 > >風險大腦-支付風險識別天池大賽(二)資料儲存及檢查

風險大腦-支付風險識別天池大賽(二)資料儲存及檢查

         本次想把過程寫的詳細些,所以本節和上一節講了如何充分利用大資料平臺處理資料,如何利用最有效的工具進行資料儲存、處理、分析。另外這次準備用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';

三、檢測資料

資料質量:

-- 檢查資料質量,即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;