實戰人品預測之一_國內大資料競賽平臺

xieyan0811發表於2017-12-05

1. 競賽平臺哪家強

 Kaggle是一個很好的競賽平臺,上面大牛很多,程式碼分享和思路講解也很棒,但是它的使用者資訊和資料全都存在google伺服器上,雖然網頁能看到,但上傳下載資料需要連外網,從當前的網路情況看來,只能用VPN,用起來實在太麻煩了。
 國內的大資料競賽平臺,DataCastle和天池也不錯,也有獎金。比賽結果後,排名靠前參加答辯的選手會將答辯PPT分享出來,有時也會分享程式碼。相對來說天池的資料包含豐富的業務場景,更粘近現實情況,有的比賽還提供在計算平臺。
 天池和Kaggle都有資料科學家的排行榜,以提供展示實力的途徑。

2. 選擇競賽

 從時效來看,建議一開始先選擇參賽隊多的往期題目,最好是獲勝者提供了源代的。很多比賽在結束之後仍開放提交程式碼並提供線上評分(沒有獎金),這樣邊做邊學,速度更快,也不會陷入某個比賽無法自拔。
 從難易來看,建議從簡單的開始,如果影響因素太多,難以判別哪裡出了問題。最好一開始選擇純資料的。

3. 典型問題

 我覺得在實踐的過程中,有幾類典型問題是需要常試的:
(1) 以xgboost為代表的資料探勘問題
(2) 自然語言處理相關的問題
(3) 影象處理相關的問題
(4) 關聯規則相關問題
(5) 時序相關問題
 本篇中的例子是DataCastle平臺的“微額借款使用者人品預測大賽”,屬於xgboost問題,詳見:
http://www.pkbigdata.com/common/cmpt/微額借款使用者人品預測大賽_競賽資訊.html

4. 人品預測專案

(1) 描述

 比賽的主題是通過資料探勘來分析”小額微貸“申請借款使用者的信用狀況。提供的特徵以x1,x2…表示,也就是說不知道各特徵的具體意義。共1400個特徵,帶標籤資料15000個,不帶標籤資料50000個,最終需要對5000個資料進行預測,上傳預測結果,得到線上的AUC評分。
 該題目就屬於:資料不多且乾淨,參賽隊近3000支,冠軍使用的演算法是資料大賽最常用xgboost,他還提供了答辯報告書和原始碼。

(2) 比賽結果

 從排行榜看,除第一名最高得分是0.77209,第二名0.76289之外,前400名分數都在0.7-0.735之間。當然這也可能是由於冠軍分享了他在比賽中最高得分0.7341的程式碼,一些人後期使用了他的程式碼得到了高分。

5. 人品預測初體驗

(1) 隨便找個模型

 第一步下載所有資料,掃了一眼檔案格式,隨便找個模型,代進去,預測之後上傳伺服器,以熟悉基本流程。因為是個分類問題,所以隨便用了邏輯迴歸模型。

import pandas as pd
from sklearn.linear_model import LogisticRegression

train_x = pd.read_csv("train_x.csv")
train_y = pd.read_csv("train_y.csv")

train_x = train_x.drop('uid', axis=1)
train_y = train_y.drop('uid', axis=1)
print(len(train_x), len(train_y))

logreg = LogisticRegression()
logreg.fit(train_x, train_y)
print(logreg.score(train_x, train_y))

test_output = pd.DataFrame()
test_x = pd.read_csv("input/test_x.csv")
test_output["uid"] = test_x['uid'] 
test_x = test_x.drop('uid', axis=1)
test_y = logreg.predict_proba(test_x)
test_output["score"] = test_y[:,1]
print(test_output[:10])

test_output.to_csv('input/test_y.csv', index=False)

 看了一下,本地得分0.898xxx,覺得還不錯,上傳之後,線上得分0.51xxx,這得分和瞎蒙差不多。看了一下資料才發現,正反例資料比例不一致,正例佔比0.8982,汗……不過好歹跑通了。

(2) 嘗試優化

i. 本地得分與線上得分
 得分差異主要是正反例資料比例不一致引起的,它使得本地得分沒什麼參考價值,因為做得再差也能得到0.89左右的評分,而改進一點並不明顯。
 面對這種情況,比較簡單的方法就是使正反例個數相同,為了不損失資料,我使用了重複加反例的方法,處理之後本地評分和線上評分就比較接近了。(有的模型支援roc_auc,直接設定也可以)

ii. 分開訓練集和測試集
 把帶標籤資料分成9:1,分別用於fit和score。因為之前加了反例,切分時需要先打亂順序,避免反例都被分入了測試集。這樣結果看起來,就正常多了。

iii. 嘗試多個模型
 儘管知道最終會使用xgboost,還是嘗試了幾個分類模型,發現有的模型本地得分是1.0,因為沒分開訓練和測試集,發生了過擬合,繼續汗……
 試了幾種簡單的樹模型,得分比較高的是ExtraTreeClassifier()。樹最重要的是限制過擬合,比如用min_samples_split或max_depth限制分支條件和樹深。

iv. 嘗試降維
 1400個特徵實在太多了,用50000個無標註資料計算PCA降維,觀察資料降維後,前15維佔有效資料的0.9999以上,所以使用PCA將1400維資料降到15維,再使用模型分類,效果變差很多,根本沒法用。不過我覺得當特徵特別多的時候,還是可以做PCA,然後用特徵值最大資料做散點圖分析資料。有助於選擇分類器。
 估計可能是缺失資料太多影響了PCA效果,於是嘗試了SelectPercentile縮減特徵值,它的原理是根據自變數和因變數的相關性降維,當縮特徵數減到50%時,線上得分差別0.001以下,當縮減到10%時,正確率只有一半。

v. 缺失資料
 觀察了一下資料,很多-1值,我試用均值mean填充了一下,效果不好,線上得分還下降了,估計是有的列缺失值太多引起的。

(3) 第一天的嘗試結果

 最終使用sklearn自帶的gdbt演算法,簡單調參的情況下,得到了0.68*9的線上得分,名次在440名左右。為節省時間,未做更多嘗試,開始學習冠軍程式碼(見下篇)。

6. 收穫

(1) 儲存模型

 嘗試PCA時,每計算一次PCA時間都很長,於是把PCA模型儲存下來,節約了重複計算的時間,具體使用joblib庫。

(2) 評分

 不能每做一次都上傳伺服器,所以本地評分非常重要,一定要先把正反例比例,切分測試集和訓練集這樣的低階錯誤排查一遍。否則,根本沒法評價優化是否成功。

(3) 修改前先預測

 不要想當然地做降維,也不要因為資料多,開始就切資料,或者縮減例項。一定要先用基礎資料做一遍後再優化。

(4) 解決正反例分佈不平衡問題(假設正多負少)

i. 把正樣本分為幾組,分別和負樣本做模型,然後用Bagging整合
ii. 在負樣本中有放回抽樣,使正反比例一致。
iii. 負樣本重複若干次,使正反比例一致。
iv. 用近鄰的方法模擬負樣本,使正反比例一致。

(5) 缺失值的處理

i. 什麼是缺失值?
很多時候,空值並不直接以Nan或”,,”這樣的方式出現,有時是0,有時是-1,一定要直接看資料。

ii. 缺失值有哪些影響?
缺失值多的情況下,不止降低預測效果,對降維也有影響。當缺失值太多,又想降維時,可使用SelectKBest系工具,它是根據自變數和因變數的相關性降維的方法。

iii. 缺失值怎麼處理?
如果缺失值太多,考慮去掉該特徵,因為它可能是噪聲,至於怎麼界定“太多”,還要分析具體資料(具體見下篇)。
對於連續值,可用中數填充,均值,插值,隨機數填充等。
對於離散值,可用一個特殊值填充缺失資料。


技術文章定時推送
請關注公眾號:演算法學習分享

相關文章