1. 程式人生 > >Kaggle&天池比賽經驗

Kaggle&天池比賽經驗

寫在前面

Kaggle的資料探勘比賽近年來很火,以至於中國興起了很多很多類似的比賽,做了兩個這種型別的比賽了,Jdata使用者商品購買預測和使用者位置精準預測,積累了相當多的比賽經驗了,雖然兩次成績都不是特別好,59/4590 和 179/2844 。這些比賽的套路從根本上都是一毛一樣的,我下面可以和大家探討一個大致的做題套路以及怎麼往高分走的方向,但是總結來說這就是個拼體力的任務,和智力無關。(雖然鍛鍊了動手能力,極大強化了我在sklearn和pandas上的技能熟練度...)

PART 1 : 怎麼開始

首先是看題目,是個什麼樣型別的預測?迴歸?二分類?多分類?
每種型別的預測會有一點點不同,個人覺得西瓜書還是需要快速看一遍的,不一定說每個公式都要仔仔細細去推導(推導公式對你做比賽基本沒有什麼幫助),你要知道什麼是監督,半監督,非監督等等。

關於多分類我有個入門blog,可以快速瀏覽一遍

然後就是繁複的特徵工程

一般這種比賽都有個這麼樣的流程:

圖片描述

最重要的是在特徵工程上,基本你會花上60%的時間在這裡,因為在這裡你需要做的是資料清洗,異常處理,變換,構造新特徵等等,這一套有很詳細的教程,給大家貼兩個傳送門(先別急著看)

看完這兩篇後,基本你就能做到得心應手地處理資料。

但是,其實在做特徵工程之前,你應該先去瞭解資料

,怎麼去了解資料呢?這就需要你熟練掌握pandas這個工具了,提到怎麼熟悉這個工具,我想offer你下面這個學習流程。

  • 安裝anaconda,這個很簡單,網上一搜就有(這個科學研究工具包含了基本所有你需要的,jupyter,pandas,numpy等等)當然你要做深度學習就需要tensorflow,pytorch之類的還得另外裝。

  • 由於後面我們需要用到xgboost這款神器當模型,所以最好你的系統是ubuntu,因為在ubuntu中安裝xgboost只需要pip install就行,在別的系統裝起來可能你會想打人。

  • ok,有了環境,就用anaconda/bin/jupyter 來執行一個jupyter工作環境吧,在這個環境裡你可以隨心所欲為所欲為所欲為...(主要就是因為jupyter可以儲存你之前執行的結果,很方便做實驗,詳細的你可以google)

  • 學習pandas很簡單,因為它就是像資料庫對錶操作一樣。初學直接就看看官網的教程:10 min to learn,之後你要merge,concat,join等等複雜的操作再去一點點查,一點點啃。慢慢熟練了你就能對你的資料做任何你想要的變換,比如找出某些年份的大於某些數值的資料。

  • 為什麼需要去了解資料呢?因為資料有分佈,有不同的業務意義,你通過整理做圖可以更加深入理解某些屬性的意義,然後構造或是提取出有用的特徵。

構造特徵

在我看來,這算是特徵工程的一部分,也是最最重要的一部分,你將會在這裡花大量的時間!!(所謂特徵就是feature,也就是你的訓練資料集中除去label以外的所有列)
打個比方,比如一個商品預測的比賽,你可以將特徵分成三類,從三種角度去整理分析。(感謝阿里移動推薦演算法大賽總結的圖片資料)

 

 

這種特徵構造提取的過程對於每一種比賽都不一樣,我這裡就不詳細講了,如果你需要更多的啟發的思維,建議你去搜索大量別人怎麼從各種角度思考的資料。

在這裡提及一句,一般來講,涉及時間的都會需要設計時間視窗這麼一個東西,這個東西說複雜不復雜,但是實踐起來很費精力。簡單來講就是你需要對你的資料按照一定的時間劃分。比如我之前的比賽用前五天的資料預測後一天的,但是總的資料集是兩個月的,這時候你需要劃分你的資料集分好訓練集和驗證集。

上面的1,2,3是三個訓練集,後面帶的小框是驗證集,等於你需要訓練好幾個模型。
同時你可以想啊,更早之前的資料肯定對現在的預測影響會更小,所以會有個權重的問題,也就是你得到了十個模型,最接近預測日的算model_0,最遠的算model_9,那麼給model_0權重0.7,給model_9的權重0.05。

你需要知道什麼是訓練集,驗證集,測試集!!

有時候訓練集的類別很不均衡
這個時候需要欠取樣或是過取樣。

  • 欠取樣 某個資料比較多的類別隨機減少掉一些訓練資料

  • 過取樣 找那些資料少的類別使用smote方法插值新增資料 smote演算法

其實資料不平衡的處理也是特徵工程的一部分,我這裡只是提出來強調了一下,類別不平衡的處理其實還有很多,但是都不常用,大家可以去大概瞭解瞭解。

每個特徵你都應該取好名字,以防亂了。

另外,由於做模型融合時需要有特徵多樣性這麼一說,所以也許你需要不同的特徵簇輸入到不同的模型中,所以做好你的檔案管理十分重要!!!

我建議你的比賽工程檔案如下。

result裡面你需也要分好資料夾放不同的結果,這樣方便後面模型融合時我們用投票器的方式。

experiment裡面是你的jupyter實驗檔案,因為這類檔案你會建立很多,所以最好有一個專門的資料夾來管理。

是不是很簡單並且清晰明瞭,當你學會了sklearn中的pipeline之後,你就可以搭建一個可以輕易修改並給別人看討論思考過程的工程程式碼。但是不能完成的是做成一個可以輕易複用到各種比賽的框架。因為每個比賽的資料大不相同。不再多言。

OK!! 走過上面的流程,我們現在進入到part 2的訓練階段吧,這個階段是最激動人心的,因為你將在這裡遇見你特徵工程以及模型的不足,然後調優,看著成績慢慢提高~!

PART 2

模型階段,在這裡,你需要對各種模型都有很清晰的瞭解,最好是你能夠推導公式,不能也算了。

  • Logistic Regression

  • SVM

  • GDBT

  • Naive Bayes

  • Xgboost (這個可以說是最有用的)

  • Adaboost 等等

熟讀西瓜書吧,裡面從基礎開始會讓你懂很多,最好是李航的統計學習方法看一遍,這本書比較薄,涵蓋的內容卻很全,推導也好理解。

然後這些模型很高興的是,一個都不用你去寫~都有現成的庫,而且基本集中在sklearn中。除了 lightGBM。

先看一下這篇簡單呼叫: python sklearn常用分類演算法模型的呼叫,你會發現模型用起來好容易好方便~是的,但是這只是開始,別忘記要儲存模型哦,另外儲存結果也要嚴格按照規定的檔案路徑,不然後面你就亂了。

sklearn的程式設計方式博大精深,但是api使用還是很簡單,你只需要花點時間好好學學,就能很熟練了,推薦 python之sklearn學習筆記,這個比官網的教程好看懂,畢竟是中文的嘛...流汗~

再來你還需要去對這些演算法調參,這些我就不再談了,我想著重提一下xgboost,這是一個可以並行運算的迴歸樹,在現在的比賽中用的十分頻繁而且有效。

看懂了後你就會知道為什麼這個東西這麼牛逼了,當然前提是你需要知道決策樹,隨機森林的原理。

再說一句,安裝xgboost在ubuntu系統上很方便,但別的系統真的很難受,自己體會吧,不想浪費時間最好都弄成ubuntu

xgboost執行後的效果一般就很好了,但是這不是最終的,因為xgboost有很多的引數,怎麼去調參使得結果更優很重要。

調參也是個體力活,望各位保重身體!~

好了,part 2 也就講到這裡了,其實把這前兩個部分好好做,就能取得好的成績了,第三個部分是後期往上竄一竄的手段,當然不可不用。

PART 3

模型融合

模型融合得看你是做什麼樣的預測,不同的預測結果有不同的融合方式。
bagging,voting,stacking都是ensembling的一種。

一般都是講迴歸的,voting具體的方法沒有講,我這裡有一段程式碼,你看看就懂怎麼做voting。

# 投票器
def file_name(file_dir):
    filename = []
    for root, dirs, files in os.walk(file_dir):
        filename.append(files)
    return filename\n",

filename = file_name('./result/all_result/')[0]

'''
* 檔名                                       * 票數

['result_0.002_no_0.03_8steps_0.8964.csv',      9
'result_TL_ten_0.002_no_0.03_0.9062.csv',      10
'result_0.001_0.8917 .csv',                    9
'result_LT_ten__0.001_no_0.03_0.9092.csv',     10
'result_LT_ten_0.0015_no_0.03_0.9051.csv',     10
'result_0.0015_0.9061.csv',                    10
'result_AdaB_0.31.csv',                        3
'result_feature_delexcep_0.002_tree.csv',      9
'result_rf_0.001_0.03_0.86.csv',               8
'result_lr_0.60.csv',                          4
'result_rf_0.87.csv',                          8
'result_0.002_no_0.03_6steps_0.8951.csv',      9
'result_0.002_no_0.03_0.9058.csv',             10
'result_gdbt_0.79.csv',                        6
'result_xgb_91.csv',                           11
'result_0.002__0.9046.csv',                    10
 ]

'''

dic = {}
index = list(re.iloc[:,0])
result = []
voting = [9,10,9,10,10,10,3,9,8,4,8,9,10,6,11,10,9]
for t in list(re.iloc[:,0]):
    dic[t] = {}
    for i,shop in enumerate(list(re[re.row_id == t].iloc[0,1:])):
        # 建立字典
        if shop not in dic[t].keys():
            dic[t] = {re[re.row_id == t].iloc[0,1] : voting[i]}
        else:
            dic[t][shop] += voting[i]
    # 選出最高票者 , 得票相同的選後者
    top = 0
    score = 0
    for x,y in dic[t].items():
        if y > score:
            top = x
            score = y
    result.append(x)
re = pd.DataFrame({'row_id':index,'shop_id':result})"

關於模型融合這一塊就看你想怎麼弄了,多標籤分類這種比較侷限,就是投票器,迴歸的話花樣就多了,還能分層搞,所以不怕你想不到,就怕你不嘗試。

為了加深你對模型融合的理解和使用,另外推薦三篇:

PART 4

最後我講兩個trick吧。(沒什麼道理性的,有時候行,有時不行)

  1. 找比賽leak,這個就是鑽空子吧。通過分析測試集的一些特性找出golden feature(就是一下子能把成績提高老多的feature)我聽大牛的分享裡有講到但是我做比賽時沒有想到,很慚愧。

  2. 利用GDBT或是XGBoost的葉子節點的資訊創建出新的特徵,一般來講能提高成績,但是訓練起來賊慢,像我借了好幾臺電腦,把訓練集分散到不同電腦上跑。累死了...

總結

有人說跟一遍kaggle上的kernel一套就都會了,我覺得挺好的,但是看了我的這篇嘔心瀝血的文章後,我想你的知識才是系統的!~

好了,終於到收官了,說實在的,這型別的比賽我暫時是不想參加了,我們學校的大牛硬是打了10場,然後拿了兩次冠軍,我這參加了兩次,成績不好,但是已經身心俱疲了,沒信心拿到獎了。況且,我認為深度學習才是現在的王道,我已經在影象識別和image caption中遨遊了好些日子。有意思多了。

到此,祝大家好運。