3天時間忙里偷閑,在項目導師的督促下終于將 Project2 完成了,值得慶幸的是 review 一次性通過。
通過項目的學習,著實有不少收獲,按照整個項目的進展流程總結如下:
Data Exploration
拿到數據第一步還是先做數據探索,對數據分布有一個整體把握,觀察是否存在數據傾斜等問題。在這里數據傾斜是指數據特征大多數分布在單點周圍,但也有部分數據分布在極大或極小值的附近,這種現象會極大降低學習器的學習效率(可以想象比如用Logistics回歸去建模這種數據,權重w的學習過程必然遭到強烈zig-zag形的擺動,因此學習受到影響)。解決這一問題的方法是采用 logarithmic transformation 變化將特征維度進行指數級的縮放。
通過可視化方法(項目提供的現成的模塊vs.distribution,直接捕捉并可視化出分布傾斜的數據),可以發現 capital-gain 和 capital-loss 特征確實存在嚴重的分布傾斜現象:
Naive Estimator
Naive Estimator 概念就是不利用特征信息,強行將所有數據判別為我們的目標類別。可以知道,該分類器必然將所有目標數據“蒙到”。因此Naive分類器的 Recall 是 1,在Recall=1的前提下,accuracy=precision。
Data Preprocessing
數據預處理階段,主要填補缺失數據、針對類型數據進行啞變量化。
這里我用到了列表推導式獲取所有的類型數據,然后用pd.get_dummies方法,簡單高效:
pd.get_dummies方法有很多參數可以使用,暫時還沒搞精通,只能現學現賣,解決以上燃眉之急。
接下來是將預測目標由字符串類型映射為0、1數值類型,用到了series類型的map方法和lamda表達式(lamda表達式被reviewer夸贊了:D):
特地弄清了map、apply、applymap三個方法的主要區別:map是series類型的方法,apply、applymap是dataframe的方法,而apply是作用于整個列,例如求列的min(),applymap是作用于整個列中的每個元素。
Shuffle and Split Data
引入隨機性,并設置種子為0.
Evaluating Model Performance
在評估標準方面,引入了F_beta指標(0-1之間,越大越好),該指標綜合考慮precision和recall,并引入參數beta來做二者的權衡。如下公式:beta越大,越偏重recall,beta越小,越偏重precision。(具體為什么beta能起到這種作用,看了wiki也沒搞精通,用到時再說吧)
Model Application
模型預測方面,我選用了三個模型為 Decision Tree, Adaboost, GaussianNB。
之所以算用這三個模型,DT是因為我覺得效果會比較好,Adaboost是因為學了課程以后覺得該ensemble learning的思維很強大,想體驗一下效果(事實證明確實優于DT),選GaussianNB并不是因為它適合數據,恰恰是因為它不適合數據,我想驗證下該模型具體會表現的多差勁:)。。結果如下:
在這個過程中,受益最大的是,項目提供的代碼非常規范,讓我對模型對比的實驗過程有了一個更規范的編碼方式,先編寫好train和test的pipeline,然后將不同模型作為learner參數傳入,即可一次性展示出不同模型的實驗結果(詳見review)。
Model Tuning
針對最優的Adaboost方法,繼續采用網格搜索尋找最優參數,通過項目我真是了解GridsearchCV方法的強大了,必須得研究透該方法啊,以前調參都是傻不拉幾的手動改參數:
Feature Selection
特征選擇,首先項目讓我根據直覺選取了top5的特征,然后用模型feature_importances_屬性選擇的top5特征進行對比,結果表明我的直覺分析還不錯!注意:feature_importances_屬性只有部分學習器有(e.g., adaboost, random forests)。
若只選取top5特征的話,學習性能略有下降,但是若對運行時間要求嚴格,進行特征選擇是很必要的。
這里只給出了運行精度,因為偷懶沒有給出運行時間的顯示:)。此外這里用到了clone模塊,個人猜測是克隆一個學習器的初始架構而不克隆學習結果。
Review 的收獲
- python 2.7 的除法默認是floor除法 (python 3.x 則是真正),通過future引入division模塊,可以實現便捷的真正除法,若要實現floor除法,只需要使用”\"就好了。
Binary encoding is a great choice for cases where the number of categories for a given feature is very high.
This map might help to give guidance when choosing an estimator.
The two main weaknesses of Naive Bayes are the independence assumption among their features and the zero frequency problem. 貝葉斯方法的兩個主要缺點是1)樸素假設 2)0頻率問題,該問題可以通過貝塞爾校正改善。
AdaBoost is one of the best estimators for this project! If you expand the parameter grid a little more, you can get a score higher than 0.74. Gradient Boosting also performs greatly here! 運氣比較好,一下子選的Adaboost是最適合該項目的方法,reviewer也讓嘗試對learn_rate進行網格搜索,可以達到0.74的scores! 也建議試試梯度boosing,boosting大法好~集成大法是王道!
Besides the feature importance, an alternative is to use calculate the significance of each feature using the weights of a Logistic Regression (LR) model. The significance is calculated dividing the coefficients of the LR by their standard errors (also know as Z-score). You can check more details in the Chapter 4.4.2 of The Elements of Statistical Learning. According to the reference, a Z-score higher than 2 is significant at the 5% level. Reviewer也提示可以采用除了特種重要度的其他方法進行特征重要性評估,利用LR模型進行權重評價,該方法目前還沒仔細學習!
All in all, Pro2 收獲滿滿。