@Author : Jasperyang
@School : BUPThtml
這篇文章同時在知乎裏放着~python
Kaggle的數據挖掘比賽近年來很火,以致於中國興起了不少不少相似的比賽,作了兩個這種類型的比賽了,Jdata用戶商品購買預測和用戶位置精準預測,積累了至關多的比賽經驗了,雖然兩次成績都不是特別好,59/4590 和 179/2844 。這些比賽的套路從根本上都是一毛同樣的,我下面能夠和你們探討一個大體的作題套路以及怎麼往高分走的方向,可是總結來講這就是個拼體力的任務,和智力無關。(雖然鍛鍊了動手能力,極大強化了我在sklearn和pandas上的技能熟練度...)git
首先是看題目,是個什麼樣類型的預測?迴歸?二分類?多分類?
每種類型的預測會有一點點不一樣,我的以爲西瓜書仍是須要快速看一遍的,不必定說每一個公式都要仔仔細細去推導(推導公式對你作比賽基本沒有什麼幫助),你要知道什麼是監督,半監督,非監督等等。github
關於多分類我有個入門blog,能夠快速瀏覽一遍算法
而後就是繁複的特徵工程了編程
通常這種比賽都有個這麼樣的流程:ubuntu
最重要的是在特徵工程上,基本你會花上60%的時間在這裏,由於在這裏你須要作的是數據清洗,異常處理,變換,構造新特徵等等,這一套有很詳細的教程,給你們貼兩個傳送門(先別急着看)segmentfault
看完這兩篇後,基本你就能作到駕輕就熟地處理數據。
可是,其實在作特徵工程以前,你應該先去瞭解數據,怎麼去了解數據呢?這就須要你熟練掌握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的訓練階段吧,這個階段是最激動人心的,由於你將在這裏碰見你特徵工程以及模型的不足,而後調優,看着成績慢慢提升~!
模型階段,在這裏,你須要對各類模型都有很清晰的瞭解,最好是你可以推導公式,不能也算了。
Logistic Regression
SVM
GDBT
Naive Bayes
Xgboost (這個能夠說是最有用的)
Adaboost 等等
熟讀西瓜書吧,裏面從基礎開始會讓你懂不少,最好是李航的統計學習方法看一遍,這本書比較薄,涵蓋的內容卻很全,推導也好理解。
而後這些模型很高興的是,一個都不用你去寫~都有現成的庫,並且基本集中在sklearn中。除了 lightGBM。
先看一下這篇簡單調用: python sklearn經常使用分類算法模型的調用,你會發現模型用起來好容易好方便~是的,可是這只是開始,別忘記要保存模型哦,另外保存結果也要嚴格按照規定的文件路徑,否則後面你就亂了。
sklearn的編程方式博大精深,可是api使用仍是很簡單,你只須要花點時間好好學學,就能很熟練了,推薦 python之sklearn學習筆記,這個比官網的教程好看懂,畢竟是中文的嘛...流汗~
再來你還須要去對這些算法調參,這些我就再也不談了,我想着重提一下xgboost,這是一個能夠並行運算的迴歸樹,在如今的比賽中用的十分頻繁並且有效。
我翻譯的官網的原理解釋 : (XGBoost)提高樹入門介紹(Inrtoduction to Boosted Trees)
看懂了後你就會知道爲何這個東西這麼牛逼了,固然前提是你須要知道決策樹,隨機森林的原理。
再說一句,安裝xgboost在ubuntu系統上很方便,但別的系統真的很難受,本身體會吧,不想浪費時間最好都弄成ubuntu
xgboost運行後的效果通常就很好了,可是這不是最終的,由於xgboost有不少的參數,怎麼去調參使得結果更優很重要。
調參也是個體力活,望各位保重身體!~
好了,part 2 也就講到這裏了,其實把這前兩個部分好好作,就能取得好的成績了,第三個部分是後期往上竄一竄的手段,固然不可不用。
模型融合
模型融合得看你是作什麼樣的預測,不一樣的預測結果有不一樣的融合方式。
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})"
關於模型融合這一塊就看你想怎麼弄了,多標籤分類這種比較侷限,就是投票器,迴歸的話花樣就多了,還能分層搞,因此不怕你想不到,就怕你不嘗試。
爲了加深你對模型融合的理解和使用,另外推薦三篇:
最後我講兩個trick吧。(沒什麼道理性的,有時候行,有時不行)
找比賽leak,這個就是鑽空子吧。經過分析測試集的一些特性找出golden feature(就是一會兒能把成績提升老多的feature)我聽大牛的分享裏有講到可是我作比賽時沒有想到,很慚愧。
利用GDBT或是XGBoost的葉子節點的信息建立出新的特徵,通常來說能提升成績,可是訓練起來賊慢,像我借了好幾臺電腦,把訓練集分散到不一樣電腦上跑。累死了...
有人說跟一遍kaggle上的kernel一套就都會了,我以爲挺好的,可是看了個人這篇嘔心瀝血的文章後,我想你的知識才是系統的!~
好了,終於到收官了,說實在的,這類型的比賽我暫時是不想參加了,咱們學校的大牛硬是打了10場,而後拿了兩次冠軍,我這參加了兩次,成績很差,可是已經身心俱疲了,沒信心拿到獎了。何況,我認爲深度學習纔是如今的王道,我已經在圖像識別和image caption中遨遊了好些日子。有意思多了。
到此,祝你們好運。