用户偏好类结构化数据分析题参赛总结
文章目錄
- 前言
- 一、任務簡介
- 二、數據處理
- 三、特征工程
- 1.盡量多做特征
- 2.特征篩選
- 3.根據特征重要性排序獲得啟發,構造更多特征
- 四、模型訓練及預測
前言
??參加了某運營商舉辦的系列比賽連續獲獎,比賽登錄公司內部賬號,可直接操作內部真實業務數據(脫敏后),在真實生產環境中建模。作為外行,這是我第一次知道機器學習在真實生產中是怎么應用的,這里把參賽的技術要點總結一下。
一、任務簡介
??任務是根據運營商提供的用戶數據來分析用戶偏好。數據id為手機號碼(脫敏,看不到真實號碼),主要數據包括每id的消費記錄、通話記錄、上網記錄、APP使用記錄、手機配置、用戶屬性(職業、收入、家庭等)、GPS軌跡等等。需要分析的偏好比如是否近期更換手機,是否近期安裝ETC等等。
二、數據處理
1.使用Hadoop、spark抽取相關數據到本地
2.使用HiveSQL把有用字段提取后合并成一個以id為索引的大表
我習慣用pandas處理數據,它非常靈活高效,所以先用HiveSQL把數據全裝到一個大表再傳給建模平臺用pandas處理,注意平臺自動把豎杠"|"作為分隔符,所以HiveSQL提取字段時需要把每字段每記錄中包含“|”的字符去掉,否則會造成串列。
3.使用pandas讀取大表,通過可視化、統計等方法檢驗每字段的數據類型、異常值情況、分布規律等
4.濾掉高相關、重復、僅有單一值、偽id(即和Id一一對應且為字符)字段
5.填充缺失值。
根據各字段含義可按照平均值、眾數、前月份值、新字符等填充。
6.字符類字段編碼
字符類不便于后續特征工程處理,所以要編碼,使用sklearn.preprocessing.LabelEncoder編碼
三、特征工程
??特征工程的原則是:全面撒網、重點捕撈。就是說開始要盡量多做特征,批量創建多種特征,然后再對特征進行篩選,保留有用的特征。
1.盡量多做特征
第一類:id對應類特征,每id一條記錄的字段類都可以直接作為特征
第二類:按id分組統計類,有的字段每id會有多條記錄,例如通話時長。可以按照id分組后,統計次數、總和、最大最小值、均值、方差等
第三類:時序類字段的統計特征,例如各月的消費金額,可求取時序序列的最大最小值、均值、方差、偏度、峰度等
第四類:熱線訪問類,根據樣本標簽分離出陽性標簽集和陰性標簽集,可以統計出某些字段陽性標簽對應的熱線類別,例如app登錄記錄在安裝ETC用戶中排行前幾的app被認為是熱線app,然后再統計每id訪問熱線的次數、時長等指標作為特征。熱線的定義除了根據陽性標簽外,還可以根據陽性陰性比等其他指標定義。
第五類:根據場景和語義構造符合人類思維的特殊特征。這種特征往往比較有效。
2.特征篩選
??在構造特征時應根據原始字段名、構造方法等制定一個規范的命名規則,這樣便于篩選的時候進行批量選擇。篩選的主要方法就是根據驗證集上的評價指標得分情況篩選,應該編制一個自動篩選代碼,充分發揮算力優勢,讓電腦日夜不停的跑,自己去睡覺就行了。特征篩選完成后,還應再回到數據處理的代碼部分,把那些被篩掉的特征相關的處理環節全部刪除,這樣可以大大加快數據處理的速度,畢竟模型建立以后工程上以后是要長期反復使用的,速度也是很重要的一個指標。
3.根據特征重要性排序獲得啟發,構造更多特征
??做特征和篩選特征是一個循環往復的過程,篩選的特征可以根據樹模型的特征重要性排序功能得到貢獻最大的一些特征,然后受這些特征啟發,類比聯想構造更多特征。
四、模型訓練及預測
??我一般使用lightgbm建模,它速度快,用起來很爽。建模過程比較簡單,這部分代碼模板如下,要點是五折交叉融合,f1指標跟蹤早停:
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')總結
以上是生活随笔為你收集整理的用户偏好类结构化数据分析题参赛总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于深度学习和机器学习的心电图智能分析参
- 下一篇: pytorch基础知识整理(二)数据加载