這個(gè)比賽來(lái)自于這里
https://kesci.com/apps/home_log/index.html#!/competition/56cd5f02b89b5bd026cb39c9/content/0
1、數(shù)據(jù)清洗
加載數(shù)據(jù)的方法:
data = pd.read_csv(filename,encoding="gb1830")
原始數(shù)據(jù)中會(huì)有噪聲,如果不做任何處理直接應(yīng)用胎撇,回拉偏模型荆几。
對(duì)缺失值的多維度處理
對(duì)于征信系統(tǒng)來(lái)說(shuō),用戶提供的信息越完整快毛,用戶可信度越高义锥,所以我們會(huì)很看重?cái)?shù)據(jù)中的缺失值。
對(duì)于其它的場(chǎng)景可以具體處理盛险。瞄摊、
首先,觀察數(shù)據(jù)缺失值的情況苦掘,包括橫向和縱向兩個(gè)方向觀察换帜。
panda中的方法
datafram.isnull().sum(axis=1) 每一行記錄有幾個(gè)缺失字段
datafrme.isnull().sum() 從列的維度進(jìn)行觀察,每一列有多少個(gè)記錄是缺失值
對(duì)于缺失值比例非常高的列鹤啡,其實(shí)可以直接刪除惯驼。
對(duì)于缺失比例不高的列,而且如果是類別型的列递瑰,可以直接把缺失當(dāng)作一個(gè)類別填充進(jìn)來(lái)祟牲,比如用-1填充。
df['colname'].fillna(-1)
如果是數(shù)值型的列抖部,我們可以用中位數(shù)等方法填充说贝。
按行統(tǒng)計(jì)每個(gè)樣本缺失屬性的個(gè)數(shù),然后按照缺失數(shù)量進(jìn)行排序慎颗。并給每個(gè)樣本一個(gè)序號(hào)乡恕。然后以序號(hào)作為橫坐標(biāo),以缺失值個(gè)數(shù)作為縱坐標(biāo)畫出一個(gè)散點(diǎn)圖俯萎。
對(duì)于訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)都是這樣操作几颜,于是畫出兩個(gè)散點(diǎn)圖。
盡量保證訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)上缺失值的分布模式是一樣的
觀察這兩個(gè)散點(diǎn)圖的形狀讯屈,有助于比較測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)的缺失值的模式是否一樣蛋哭。
對(duì)于其中明顯不一樣的部分,也就是說(shuō)在訓(xùn)練數(shù)據(jù)中沒(méi)有能夠反應(yīng)這些測(cè)試樣本的測(cè)試集涮母,所以訓(xùn)練出來(lái)的模型也可能不能很好的應(yīng)用到這部分測(cè)試數(shù)據(jù)上谆趾。這部分訓(xùn)練數(shù)據(jù)可以作為離群點(diǎn)數(shù)據(jù)剔除。
對(duì)于變化幅度不大的列可以剔除
對(duì)于數(shù)值型特征叛本,通過(guò)計(jì)算列的方差沪蓬,來(lái)看屬性值的波動(dòng)情況。對(duì)于哪些非常小的列来候,可以剔除跷叉。
datafram.var()
對(duì)離群點(diǎn)的剔除方法
繼續(xù)尋找離群點(diǎn),由于離群點(diǎn)的異常特征可能來(lái)自于多個(gè)維度的組合营搅,我們除了根據(jù)樣本中缺失屬性的個(gè)數(shù)剔除掉一些離群點(diǎn)云挟。還可以這個(gè)做。
用xgboost得到特征的重要度转质,取前面最重要的n個(gè)特征园欣,然后重點(diǎn)觀察樣本在這些特征上的缺失值個(gè)數(shù),如果大于一定數(shù)量比如一半休蟹,也把這些樣本作為離群點(diǎn)剔除沸枯。這也是一個(gè)合理的假設(shè)日矫,既然這些特征最重要,但是你的記錄卻在這些特征上缺少關(guān)鍵數(shù)據(jù)绑榴,當(dāng)然做出來(lái)的模型會(huì)不可靠哪轿。
這個(gè)地方可以畫一個(gè)條形圖來(lái)可視化。
get_fscore
文本處理
比如大小寫統(tǒng)一變成小寫翔怎,去掉多余的空格缔逛。盡量讓相同含義的文本統(tǒng)一,不如省份統(tǒng)一都不帶省字樣姓惑。
dataframe['colname'].unique() 查看列上的值
2、特征工程
地理信息處理
在原始數(shù)據(jù)中按脚,記錄了用戶的省市信息于毙。屬于類別型變量,對(duì)這種變量最常用的做法就是One-hot encoding辅搬。但是這樣以來(lái)會(huì)得到很高維的稀疏特征唯沮。尤其是GBDT這種tree base的模型,這么多稀疏特征會(huì)讓運(yùn)行性能非常慢堪遂。
于是介蛉,作者在one-hot 基礎(chǔ)上加上了特征選擇。
從統(tǒng)計(jì)的角度做特征(處理省份信息)
這種方法是對(duì)那些取值比較少的類別型變量溶褪,肉眼可以觀察的過(guò)來(lái)的币旧,比如對(duì)省份直轄市,最多也不過(guò)就32個(gè)猿妈。
具體的做法是分層統(tǒng)計(jì)數(shù)據(jù)分布吹菱,其實(shí)就是看看哪些省市的違約率特別高,對(duì)于這些特別高的省份彭则,我們單獨(dú)提出來(lái)作為一個(gè)屬性鳍刷。
比如統(tǒng)計(jì)出四川、湖北俯抖、北京特別高输瓜。
于是可以構(gòu)建三個(gè)二值特征,是否四川用戶芬萍、是否湖北用戶尤揣、是否北京用戶。這樣就用了三個(gè)one-hot變量取代了原來(lái)n多的one-hot變量柬祠。
借助xgboost篩選(處理城市信息)
對(duì)于地級(jí)市這樣的特征芹缔,可能會(huì)有成百上千中看可能取值,這時(shí)再用基于統(tǒng)計(jì)的方法就觀察不過(guò)來(lái)了瓶盛。
這時(shí)我們就采用one-hot + xgboost的方法最欠。
比如地級(jí)市這一列示罗,one-hot之后得到400個(gè)二值屬性。我們就在這400個(gè)二值屬性上是用xgboost芝硬,然后得到特征的重要性蚜点。然后去最重要的城市做二值變量。
這一步其實(shí)就相當(dāng)于數(shù)據(jù)降維
添加城市等級(jí)
比如一線城市是1拌阴,二線城市是2绍绘,三線城市是3。
添加經(jīng)緯度
光有省市信息并不能體現(xiàn)更多的信息〕僭撸現(xiàn)在我們引入經(jīng)緯度陪拘,考慮地理上較勁的城市,違約率可能差不多纤壁,所以引入這部分信息左刽。最終結(jié)果有千分之幾的提升。
城市特征向量化
比如酌媒,對(duì)于數(shù)據(jù)集中的記錄按照城市計(jì)數(shù)欠痴,然后做個(gè)等值離散化。
也就是某個(gè)城市落在什么樣的人口區(qū)間秒咨,只不過(guò)是用樣本中的記錄數(shù)來(lái)作為人口屬性喇辽。
更多的思考
比如,數(shù)據(jù)中有兩個(gè)城市列雨席,可能一個(gè)是出生城市菩咨,一個(gè)是工作城市。我們可以看看這兩個(gè)城市是否一樣陡厘,并作為一個(gè)特征加進(jìn)來(lái)旦委。
總之,如何引入更多的特征雏亚,取決于對(duì)于數(shù)據(jù)業(yè)務(wù)的理解缨硝。
成交時(shí)間處理
類別型編碼
特征組合
gbdt做特征組合是有兩種方式
其一:就是得到樹的所有葉子節(jié)點(diǎn)結(jié)果
其二:根據(jù)特征重要度,這里用的方法
在這個(gè)案例中罢低,作者用xgboost得到原始記錄中特征的重要性查辩,然后對(duì)于其中topn 重要的特征兩兩組合得到更多(7000+)特征,然后對(duì)這7000個(gè)組合特征單獨(dú)訓(xùn)練模型网持。訓(xùn)練后又可以得到組合特征的重要程度宜岛。然后從中提取top500個(gè)組合特征,把這些組合特征加回到原始的特征中功舀。
在這個(gè)案例中萍倡,作者選擇待組合的特征都是數(shù)值型的,于是作者分別用了 兩兩相除的運(yùn)算辟汰,然后取出top500列敲,然后再做兩兩相乘取對(duì)數(shù)阱佛,又取出top200,把這700個(gè)都加回到原始特征體系中戴而。
當(dāng)然凑术,并不一定必須加回到原始特征體系,也可以就使用組合特征去做模型所意。
3淮逊、特征選擇
特征選擇至少可以有三種方法:
根據(jù)一些指標(biāo),比如Person相關(guān)系數(shù)(衡量變量之間的線性相關(guān)性)
正則化方法(L1)
基于模型的特征重要性排序(xgboost)扶踊,這里用的就是這個(gè)方法
用Xgboost的重要度排序
其實(shí)特征選擇和特征工程是交叉在一起進(jìn)行的泄鹏。
4、類別不平衡的處理
也是有三種方式:
代價(jià)敏感學(xué)習(xí)
上采樣(oversampling)
把多的類別拆成n份秧耗,每一份和少的一類做一個(gè)模型出來(lái)备籽,最后n個(gè)模型投票。有點(diǎn)類似bagging绣版。
代價(jià)敏感學(xué)習(xí)
修改損失函數(shù)
上采樣
5、模型融合
參考Blending歼疮。
作者用了一個(gè)LR杂抽、一個(gè)gbdt、SVC
保證模型結(jié)果穩(wěn)定
只是為了gbdt的穩(wěn)定韩脏,作者通過(guò)對(duì)參數(shù)加入微小擾動(dòng)生成30個(gè)gbdt缩麸,然后用折30個(gè)gbdt的輸出的平均值作為整個(gè)gbdt的平均值,這么做只是希望gbdt模型的輸出更穩(wěn)定赡矢,這個(gè)思想可以用于所有算法
然后把這三個(gè)模型用blend方法做融合杭朱。