用户偏好类结构化数据分析题参赛总结
文章目錄
- 前言
- 一、任務(wù)簡介
- 二、數(shù)據(jù)處理
- 三、特征工程
- 1.盡量多做特征
- 2.特征篩選
- 3.根據(jù)特征重要性排序獲得啟發(fā),構(gòu)造更多特征
- 四、模型訓(xùn)練及預(yù)測
前言
??參加了某運(yùn)營商舉辦的系列比賽連續(xù)獲獎(jiǎng),比賽登錄公司內(nèi)部賬號,可直接操作內(nèi)部真實(shí)業(yè)務(wù)數(shù)據(jù)(脫敏后),在真實(shí)生產(chǎn)環(huán)境中建模。作為外行,這是我第一次知道機(jī)器學(xué)習(xí)在真實(shí)生產(chǎn)中是怎么應(yīng)用的,這里把參賽的技術(shù)要點(diǎn)總結(jié)一下。
一、任務(wù)簡介
??任務(wù)是根據(jù)運(yùn)營商提供的用戶數(shù)據(jù)來分析用戶偏好。數(shù)據(jù)id為手機(jī)號碼(脫敏,看不到真實(shí)號碼),主要數(shù)據(jù)包括每id的消費(fèi)記錄、通話記錄、上網(wǎng)記錄、APP使用記錄、手機(jī)配置、用戶屬性(職業(yè)、收入、家庭等)、GPS軌跡等等。需要分析的偏好比如是否近期更換手機(jī),是否近期安裝ETC等等。
二、數(shù)據(jù)處理
1.使用Hadoop、spark抽取相關(guān)數(shù)據(jù)到本地
2.使用HiveSQL把有用字段提取后合并成一個(gè)以id為索引的大表
我習(xí)慣用pandas處理數(shù)據(jù),它非常靈活高效,所以先用HiveSQL把數(shù)據(jù)全裝到一個(gè)大表再傳給建模平臺(tái)用pandas處理,注意平臺(tái)自動(dòng)把豎杠"|"作為分隔符,所以HiveSQL提取字段時(shí)需要把每字段每記錄中包含“|”的字符去掉,否則會(huì)造成串列。
3.使用pandas讀取大表,通過可視化、統(tǒng)計(jì)等方法檢驗(yàn)每字段的數(shù)據(jù)類型、異常值情況、分布規(guī)律等
4.濾掉高相關(guān)、重復(fù)、僅有單一值、偽id(即和Id一一對應(yīng)且為字符)字段
5.填充缺失值。
根據(jù)各字段含義可按照平均值、眾數(shù)、前月份值、新字符等填充。
6.字符類字段編碼
字符類不便于后續(xù)特征工程處理,所以要編碼,使用sklearn.preprocessing.LabelEncoder編碼
三、特征工程
??特征工程的原則是:全面撒網(wǎng)、重點(diǎn)捕撈。就是說開始要盡量多做特征,批量創(chuàng)建多種特征,然后再對特征進(jìn)行篩選,保留有用的特征。
1.盡量多做特征
第一類:id對應(yīng)類特征,每id一條記錄的字段類都可以直接作為特征
第二類:按id分組統(tǒng)計(jì)類,有的字段每id會(huì)有多條記錄,例如通話時(shí)長。可以按照id分組后,統(tǒng)計(jì)次數(shù)、總和、最大最小值、均值、方差等
第三類:時(shí)序類字段的統(tǒng)計(jì)特征,例如各月的消費(fèi)金額,可求取時(shí)序序列的最大最小值、均值、方差、偏度、峰度等
第四類:熱線訪問類,根據(jù)樣本標(biāo)簽分離出陽性標(biāo)簽集和陰性標(biāo)簽集,可以統(tǒng)計(jì)出某些字段陽性標(biāo)簽對應(yīng)的熱線類別,例如app登錄記錄在安裝ETC用戶中排行前幾的app被認(rèn)為是熱線app,然后再統(tǒng)計(jì)每id訪問熱線的次數(shù)、時(shí)長等指標(biāo)作為特征。熱線的定義除了根據(jù)陽性標(biāo)簽外,還可以根據(jù)陽性陰性比等其他指標(biāo)定義。
第五類:根據(jù)場景和語義構(gòu)造符合人類思維的特殊特征。這種特征往往比較有效。
2.特征篩選
??在構(gòu)造特征時(shí)應(yīng)根據(jù)原始字段名、構(gòu)造方法等制定一個(gè)規(guī)范的命名規(guī)則,這樣便于篩選的時(shí)候進(jìn)行批量選擇。篩選的主要方法就是根據(jù)驗(yàn)證集上的評價(jià)指標(biāo)得分情況篩選,應(yīng)該編制一個(gè)自動(dòng)篩選代碼,充分發(fā)揮算力優(yōu)勢,讓電腦日夜不停的跑,自己去睡覺就行了。特征篩選完成后,還應(yīng)再回到數(shù)據(jù)處理的代碼部分,把那些被篩掉的特征相關(guān)的處理環(huán)節(jié)全部刪除,這樣可以大大加快數(shù)據(jù)處理的速度,畢竟模型建立以后工程上以后是要長期反復(fù)使用的,速度也是很重要的一個(gè)指標(biāo)。
3.根據(jù)特征重要性排序獲得啟發(fā),構(gòu)造更多特征
??做特征和篩選特征是一個(gè)循環(huán)往復(fù)的過程,篩選的特征可以根據(jù)樹模型的特征重要性排序功能得到貢獻(xiàn)最大的一些特征,然后受這些特征啟發(fā),類比聯(lián)想構(gòu)造更多特征。
四、模型訓(xùn)練及預(yù)測
??我一般使用lightgbm建模,它速度快,用起來很爽。建模過程比較簡單,這部分代碼模板如下,要點(diǎn)是五折交叉融合,f1指標(biāo)跟蹤早停:
import numpy as np from sklearn.metrics import f1_score from sklearn.externals import joblib import lightgbm as lgb import time t0=time.time()def feval_spec(preds, traindata):eval_score = f1_score(traindata.get_label(), np.round(preds))return 'f1_score:', eval_score, Trueparams = {'boosting_type': 'gbdt','learning_rate': 0.1,'num_leaves': 32,'objective': 'binary','metric': 'feval_spec','is_unbalance': 'true','nthread': -1,'verbose': -1, } feats=[col for col in data_feats.columns if col not in ['user_id','flag']] skf = StratifiedKFold(n_splits=5,random_state=2020, shuffle=True) yy_val, vval_label, = [],[] for fold,(train_index,val_index) in enumerate(skf.split(range(len(data_feats)),data_feats.flag)):print('fold:',fold)val = data_feats.iloc[val_index]train = data_feats.iloc[train_index]trainData = lgb.Dataset(train[feats], label=train['flag'])valData = lgb.Dataset(val[feats], label=val['flag'])model = lgb.train(params, train_set=trainData, num_boost_round=10000,valid_sets=[valData],early_stopping_rounds=100,feval=feval_spec,verbose_eval=1000)y_val = model.predict(val[feats])yy_val.append(y_val)vval_label.append(val.flag.values)joblib.dump(model,'Model_fold%d.pkl'%fold) yy_val = np.concatenate(yy_val) yy_val = np.round(yy_val) vval_label = np.concatenate(vval_label) print(confusion_matrix(vval_label, yy_val)) print(f1_score(vval_label, yy_val)) ####推理部分: preds=[] for fold in range(5):model = joblib.load('Model_fold%d.pkl'%fold)pred = model.predict(data_feats[feats])preds.append(pred) p_value = np.array(preds).mean(axis=0) pred = np.round(p_value).astype('int')總結(jié)
以上是生活随笔為你收集整理的用户偏好类结构化数据分析题参赛总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于深度学习和机器学习的心电图智能分析参
- 下一篇: pytorch基础知识整理(二)数据加载