如何優雅地使用kaggle學習數據科學
來自專欄 Business Analytics24 人贊了文章
kaggle在數據科學界可以說是無人不知,每年都會舉辦很多大型的數據分析比賽,吸引各路高手前來參加,部分比賽獎金十分豐厚。
然而,kaggle卻不僅僅是一個供高手參加比賽的平台,它有很豐富的功能,任何階段的學習者都可以從中受益。
這篇將介紹kaggle的主要功能,並結合實際例子講解如何在kaggle上完成數據科學項目。
1. 基本功能介紹
首先最廣為人知的肯定是競賽功能。kaggle提供了各個級別的競賽,有入門級的Getting Started項目,例如著名的Titanic倖存預測和房價預測,適合新手練習,網上也能找到很多相關的教程;當然也有獎金豐厚的featured比賽,這類項目都會吸引很多高手參加,如果在featured比賽拿到名次會比較有含金量和說服力。
除了競賽以外kaggle也提供了學習模塊,目前已經涉及了Python、R、SQL、機器學習和深度學習等tracks,未來應該會不斷豐富。Kaggle的學習模塊是利用平台上的kernel進行的,難度不大同時配有相應的答案,很適合入門。
kaggle提供的kernel功能也是極為出色的應用,本質來說是在平台上自動搭建環境,使用者不需要在本地配置就能使用python的jupyter notebook或者R notebook。kernel裡面的庫十分齊全,就我個人的經驗來看,自從發現kernel的強大之後,我就很少在本地使用jupyter notebook了。
此外,使用者可以選擇公開自己的代碼,這也使kernel功能更為強大,意味著我們不僅可以運行自己的代碼,還可以查看kaggle上其他高手的notebook,從中獲得經驗。
2. 使用kaggle進行一個數據分析項目
介紹完了kaggle的幾個主要功能之後,我們來以一個具體的項目作為例子,說一說如何完成一個項目。
本次使用的例子是我最近參加的一個比賽
Home Credit Default Risk,預測客戶信用風險的binary classification問題。比賽提供包括申請信息、歷史申請記錄、信用卡記錄等8張數據表,要求訓練出使AUC最大的模型。
雖然binary classification可以說是數據挖掘中最簡單的問題,但是由於數據表多、數據量大,該項目肯定不是最適合新手的。建議沒有相關數據挖掘經驗的朋友先用
Titanic: Machine Learning from Disaster項目進行嘗試,kaggle上也有很多相關的kernel教程介紹該項目。
好了,回到正題,看看這個信貸預測項目。
1) 查看數據
從下圖中我們可以看到各表之間的關聯,以及每個表中提供的主要信息。顯然,這個項目的主表是application_(train|test),包括了客戶本次申請中最直接的信息,也包含了本次預測的目標Target。除了主表之外,其他表也包括了許多有用的信息,右邊的四張表是從公司內部得到的,包括客戶過往申請記錄、信用卡記錄和還款記錄等等,左邊的兩張表則來自信用局,提供了客戶在其他信貸機構申請的歷史數據。其他表中的數據需要經過處理,並最終連接到主表才能使用,提取信息的難度要比主表大,因此會成為拉開差距的關鍵。
簡單查看一下數據量,訓練集中有30萬以上的數據,預測集將近5萬個,很多交易級的table里數據量超過千萬了。這篇文章里,我們僅分析主表,並搭建一個baseline模型。
2) 探索性分析
任何數據分析項目的第一步都是探索性分析,本質上來說就是看數據的描述性統計情況,利用些可視化方法。
由於變數很多,最好自己定義作圖函數,這樣以後查看每個變數時可以只用一行代碼。對於分類變數,我們可以用柱形圖查看。從下圖中我們可以方向,本次二分類的label是存在嚴重不平衡的。
對於絕大多數因變數而言,需要對比它在label 1和label 0中的分布才能得出有效結論。例如對比default和non-default的教育程度,我們可以發現default中受過高等教育的比例明顯要少。因此如果提取一個判斷是否為high education的dummy變數,會對預測有幫助。
連續性變數可以用直方圖或者密度圖來查看分布,這裡不繼續深入討論了。
3) 預處理
現實中的數據一般都很雜,在正式建模之前需要一些預處理工作。
我們需要對數據進行轉換。字元串變數一般不能直接用來建模,考慮通過OneHotEncoding轉為多個dummy的形式,當然如果一個categorical變數種類過多,需要考慮先進行分組再進行dummy轉化,防止產生過多變數。同時,我們還要注意,一些變數雖然為數值型,但是當做連續變數來思考,沒有實際意義。例如某變數表示申請當天是星期幾,用1-7表示,但我們還是需要將其轉換為多個dummy處理。
此外,數據可能存在缺失值,雖然現在很多演算法都可以忽略缺失值,但有效的手動處理一般會帶來更好的預測效果。最新版的sklearn庫提供了兩種數據補全方法,第一種是簡單補全法:對於數據缺失的位置直接填補平均數、中位數或者眾數;另一種是MICE補全法,先用平均數、中位數或者眾數填充,再根據鄰近的變數不斷迭代來優化對缺失值的預測。
對於離散型變數,我們使用簡單補全法的眾數來進行填充,因為離散型變數在經過處理後都是整值,如果使用迭代會產生浮點型數據,沒有實際意義;而連續型變數,則先填充中位數,再使用MICE來迭代達到更好的效果。
from sklearn.impute import SimpleImputer, MICEImputer# discreteapplication_train[cat_dummy_list] = SimpleImputer(strategy=most_frequent) .fit_transform(application_train[cat_dummy_list])application_test[cat_dummy_list] = SimpleImputer(strategy=most_frequent) .fit_transform(application_test[cat_dummy_list])# numericalapplication_train[num_list] = MICEImputer(initial_strategy=median, n_imputations=20, n_nearest_features=10, verbose=True).fit_transform(application_train[num_list])application_test[num_list] = MICEImputer(initial_strategy=median, n_imputations=20, n_nearest_features=10, verbose=True).fit_transform(application_test[num_list])
如果變數過多可以考慮進行篩選,sklearn有一個feature_selection子庫提供了SelectKBest等篩選器,可以用Filter、Wrapper和Embeded等方法進行篩選。經過剛才的處理後,大概有220多個變數,相比於30W的數據量其實不多,因此暫時不進行篩選了。
4) 新特徵
數據集直接提供的變數不一定是對預測最有效的,基於數據集提供的變數來構建新特徵很多時候可以提升表現。比如,原始數據集中提供了貸款總額和年金,它們之間的比值是一個非常出色的特徵,有很強的預測效果;數據集中有申請額和最終得到的額度,可以構建一個申請額是否大於最終額的dummy變數,也是一個強特徵。構建新特徵沒有定律,需要結合實際知識,並且不斷的嘗試和探索。
5) 建模
完成所有預處理工作後,正式進入到模型階段。目前的數據挖掘比賽最主流的模型是boosting,之前一段時間xgboost幫助很多選手贏了不少獎金,而最近一段時間新發布的lightgbm逐漸成了主角,他們本質上都是GDBT的改進。我們將嘗試用lightgbm建立分類器,配合5-fold並求平均值來使模型更穩健。
import lightgbm as lgbfrom sklearn.metrics import roc_auc_scorefrom sklearn.model_selection import StratifiedKFoldfolds = StratifiedKFold(n_splits=5,random_state=6)oof_preds = np.zeros(X.shape[0])valid_score = 0for n_fold, (trn_idx, val_idx) in enumerate(folds.split(X, y)): trn_x, trn_y = X.iloc[trn_idx], y[trn_idx] val_x, val_y = X.iloc[val_idx], y[val_idx] train_data = lgb.Dataset(data=trn_x, label=trn_y) valid_data = lgb.Dataset(data=val_x, label=val_y) param = {application:binary,num_iterations:4000, learning_rate:0.03, num_leaves:24, feature_fraction:0.9, bagging_fraction:0.9,lambda_l1:0.1, lambda_l2:0.1, min_split_gain:0.01, early_stopping_round:50, max_depth:7, min_child_weight:40, metric:auc} lgb_es_model = lgb.train(param, train_data, valid_sets=[train_data, valid_data], verbose_eval=50) oof_preds[val_idx] = lgb_es_model.predict(val_x, num_iteration=lgb_es_model.best_iteration) valid_score += roc_auc_score(val_y, oof_preds[val_idx])print(valid score:, str(round(valid_score/folds.n_splits,4)))
值得一提的是,這個方法框架我之前在沒在任何教材上看到過,實際上是我從其他kaggler的kernel里學來的,經過幾次嘗試預測效果確實要比只用一個模型更加穩健(驗證集的效果和積分榜的測試效果偏差較小)。
6) 提交查看結果
預測出的結果提交一下看看如何?AUC 0.763其實不怎麼樣,但因為我們只是用了一個表,還有很多信息沒有使用,所以不必太在意分數,重要的是熟悉整個項目的流程。
這篇文章的介紹還是比較簡單的,關於之前討論的流程的完整kernel,我在kaggle上公開了,可以詳細查看:
Home Credit Default Risk: baseline model完整kernel此外,該比賽的kernel區和討論區都有很多乾貨滿滿的資源,值得發掘和學習。
總之,kaggle是一個很好的數據科學學習平台,希望每一位數據科學愛好者都能好好利用資源,不斷進步!
推薦閱讀:
※NLP自然語言處理(二)——基礎文本分析
※大數據的誤區,看易經呈現給人類的大智慧
※數據掩埋——在大數據時代里悄然遁走
※十個做圖表心得,看完就能用
※推薦演算法入門(2)Python 手寫 SVD 與 Funk-SVD 篇