1. 程式人生 > >資料探勘實戰之天池精準醫療大賽(3)——sklearn工具包簡介

資料探勘實戰之天池精準醫療大賽(3)——sklearn工具包簡介

Part 2 sklearn工具包簡介:

前面介紹了一大堆的思路,要展開這一系列的流程,還要從sklearn包的使用開始,現對此作一些介紹。先分如下幾個方面介紹:

2-0.學習文件

2-1.轉換器,估計器及流水線

2-2.資料預處理

2-3.特徵抽取、選擇

2-4.模型呼叫

2-5.模型評估

2-6.交叉驗證/引數優化

2-0 學習文件

工具包學習的最好教材就是其文件,請看這裡

這可是英文的喲,但是現在沒必要啃英文文件啦~此處,隆重推薦一個網站:

這是一大堆人辛辛苦苦將其英文文件翻譯出來的,鄙人也做了一點微小的工作。文件可以看這幾部分:

快速入門及教程,快速入門簡要介紹呼叫模型解決一個簡單的問題,教程中介紹了更多具體的例子;


使用者指南,是對sklearn包的較為詳細的描述,當你想去呼叫工具包而不知道有沒有這樣的包,不會用,不知道怎麼用時,可以參考這一部分,當然這一官方文件並不詳細,對許多演算法的具體引數設定等沒有介紹,還需在其他學習材料中積累經驗。

 

比如第一個演算法, 廣義線性模型:

     

sklearn包內容可謂十分豐富,基本可以滿足我們對演算法呼叫的需求,初學者可以通過文件學習,相信會有不錯,文件並不全面,只有逐漸使用後才會對常用演算法大致瞭解。

最後,API和流程圖也是十分不錯的資源,對新手很友好,老司機也需要查詢API啊~


2-1. 介紹一些概念,轉換器和估計器,為什麼這麼介紹呢,因為我們調包的函式主要分為這兩類,他們方法相差無幾,故統一介紹。

轉換器(transformer)用於資料預處理和資料轉換,均實現這幾個方法:

  • fit():訓練演算法,設定內部引數。
  • transform():資料轉換。
  • fit_transform():合併fit和transform兩個方法。
  • inverse_transform():轉換方法的逆操作

轉換器屬性一般各不相同,且不太重要,親自使用時慢慢了解即可。

估計器(estimator),也就是我們所說的模型,實現這三個方法:

  • fit():訓練演算法,設定內部引數。接收訓練集和類別兩個引數。
  • predict():預測測試集類別,引數為測試集。
  • score():模型分數,但是一般我們用2-5介紹的函式來評分。

估計器屬性也各不相同,他們的屬性名稱末尾帶有‘_’,呼叫時末尾沒有括號和引數,比如線性模型會有coef_、intercept_ 可以看模型的引數(而不是超引數);SVM有support_vectors_、support_ 、n_support_ 獲取支援向量的資訊;隨機森林有feature_importances_與特徵篩選相關。各個估計器的內容還是要親自使用親自了解。

sklearn.pipeline ,將整個工作流程各個步驟封裝,便於檢查,也節省程式碼複雜程度。

使用方法:輸入為一連串的步驟,其中最後一步必須是估計器,其他是轉換器。輸入的資料集經過轉換器的處理後,輸出的結果作為下一步的輸入。最後,用位於流水線最後一步的估計器對資料進行分類。

看起來不錯的流水線,其實我比賽是沒用到,因為整個流水線並不大,兩三步,分開幾個模組進行,便於調整許多細節,所以貌似雞肋一些。

2-2. 資料預處理

sklearn.preprocessing 包括兩個部分:

標準化處理,共三個種類的工具:MinMaxScaler()/Normalizer()/StandardScaler()

編碼工具,四種:LabelEncoder()/OneHotEncoder()/Binarizer()/MultiLabelBinarizer()

在此不一一介紹。

2-3. 特徵抽取、選擇

屬於特徵工程範疇的內容,十分複雜,此次比賽所用不多,還需多積累經驗,簡略羅列如下,特徵工程一部分也不會過多介紹他們的使用,還需另有機會再學習。

sklearn.feature_extractuion,包括DictVectorizer/FeatureHasher等等(如下);

sklearn.feature_selection包括VarianceThreshold()/SelectKBest()/SelectPercentile()/chi2()等等;

降維decomposition也是一種特徵提取的工具。

DictVectorizer: 將dict型別的list資料,轉換成numpy arrayFeatureHasher : 特徵雜湊,相當於一種降維技巧image:影象相關的特徵抽取text: 文字相關的特徵抽取text.CountVectorizer:將文字轉換為每個詞出現的個數的向量text.TfidfVectorizer:將文字轉換為tfidf值的向量text.HashingVectorizer:文字的特徵雜湊


2-4. 模型呼叫

模型使用方法參考前面2-0的文件包括教程、指南等,以及對2-1估計器的介紹,大多數估計器的屬性和方法相差無幾,原理相似的演算法他們的引數也相差無幾,比如Lasso迴歸和Ridge迴歸很相似,隨機森林、GBDT這些基於樹的模型,其引數都是在決策樹的基礎上加入整合相關引數,應用起來也會相似。

模型的呼叫關注的重點一是選擇合適的模型(根據問題、資料和特徵),二是理解演算法原理(並根據資料和特徵)進行調參,而不是演算法的具體實現。這一部分的內容顯得十分泛泛,更多的是經驗。

2-5. 模型評估

sklearn.metrics ,既然演算法的實現不必關注,我們更關注的就是當前特徵、當前引數下模型的效能表現,並據此調整特徵、引數,模型分數的衡量可謂牽一髮而動全身,需要格外關注。模型評估包含評分方法、效能度量、成對度量和距離計算,分四種:

分類結果度量

引數大多是y_true和y_pred。

  • accuracy_score:分類準確度
  • condusion_matrix :分類混淆矩陣
  • classification_report:分類報告
  • precision_recall_fscore_support:計算精確度、召回率、f、支援率
  • jaccard_similarity_score:計算jcaard相似度
  • hamming_loss:計算漢明損失
  • zero_one_loss:0-1損失
  • hinge_loss:計算hinge損失
  • log_loss:計算log損失

其中,F1是以每個類別為基礎進行定義的,包括兩個概念:準確率(precision)和召回率(recall)。準確率是指預測結果屬於某一類的個體,實際屬於該類的比例。召回率是被正確預測為某類的個體,與資料集中該類個體總數的比例。F1是準確率和召回率的調和平均數。

迴歸結果度量

  • explained_varicance_score:可解釋方差的迴歸評分函式
  • mean_absolute_error:平均絕對誤差
  • mean_squared_error:平均平方誤差

多標籤的度量

  • coverage_error:涵蓋誤差
  • label_ranking_average_precision_score:計算基於排名的平均誤差Label ranking average precision (LRAP)

聚類的度量

  • adjusted_mutual_info_score:調整的互資訊評分
  • silhouette_score:所有樣本的輪廓係數的平均值
  • silhouette_sample:所有樣本的輪廓係數

2-6. 交叉驗證/引數優化

有了模型效能的評估方法,一方面需要用到的是特徵工程,另一方面就是模型超引數的優化。交叉驗證的多種方式是衡量當前模型效能的必備策略,無論是2-5評分,還是2-6的調參都要用到CV驗證。而驗證曲線和學習曲線也都是必備工具,衡量模型引數的最優點及當前模型泛化效能等,

0.19.0版本已將sklearn.cross_validation的這些功能移到了sklearn.model_selection。
train_test_split 是最簡單最常用的;

計算交叉驗證的指標  cross_val_score/cross_val_predict/cross_validate

交叉驗證迭代器  KFold/LeaveOneOut/LeavePOut/LeaveOneLabelOut/LeavePLabelOut

繪製驗證曲線 validation_curve(estimator,X,y,param_name,param_range,cv,scoring,verbose,n_jobs,pre_dispatch),

其返回值為(train_scores,test_scores)的二維陣列

繪製學習曲線    learning_curve(estimator,X,y,train_sizes,cv,scoring,exploit_incremental_learning,

verbose,n_jobs,pre_dispatch),其返回值為(train_size_abs,train_scores,test_scores)

在交叉驗證中,還會遇到基於類別/標籤的分層劃分資料集並交叉驗證的,以及對時間序列的交叉驗證,sklearn都可實現。

-----------------------------------------------------------------------------------------------------------------

引數優化的網格搜尋,sklearn.model_selection中介紹如下兩個方法,通過對指定的引數名稱在指定範圍內搜尋最優引數組合,得到最優的估計器,cv引數十分有用,指定cv,函式可以進行交叉驗證尋到最優引數,這一工具其實就是多重迴圈的集合:

GridSearchCV(estimator,param_grid,scoring,fit_params,iid,cv,refit,verbose,n_jobs,pre_dispatch,error_score)

其屬性有best_estimator/best_score_/best_params_等

RandomizedSearchCV(estimator,param_distributions,n_iter,scoring,fit_params,n_jobs,iid,refit,...)

我們可以調整的引數包括正則化係數alpha,C等連續值,也可以是kernel,solver等離散的字串,初學還是要參考包括文件在內的一些資料,調參時指定目標度量,並允許為評分引數指定多個指標。

另外sklearn中還有暴力搜尋的替代方案,文件3.2.4全部列出了,如

linear_model.LassoCV([eps, n_alphas, …])Lasso linear model with iterative fitting along a regularization path,Lasso迴歸的CV驗證版本,直接呼叫該函式即可實現;

ensemble.RandomForestClassifier([…]),隨機森林等整合方法本身就具有防止過擬合,模型選擇的效果。

個人認為2-6中的方法十分有用,我們作為調包君和調參俠,需要用好交叉驗證和調參的相關函式方法。這裡給出了幾個函式的引數列表,但是函式的原型(也就是預設引數)也有必要記住,總之這部分多使用多查學習文件和相關資料。

學習的時候參考了許多這位大佬的總結,很不錯:

作者:Cer_ml
連結:https://www.jianshu.com/p/516f009c0875
來源:簡書

---------------------------分割線-----------------------------------

簡要總結:

1、sklearn包功能強大,新手在掌握演算法基本概念後到這一步仍然會懵,各種工具實用性強,多多實踐,多參考文件;

2、系統學習一下文件,通過簡單資料集實踐一下,瞭解大致全貌,功能相似的轉換器和模型,可以舉一反三。

3、文件也不是萬能的,確實並不詳細,對某一函式使用深入後,還需尋找更多資料、深入學習(鄙人也在對一些函式深入學習中,並不容易)。

4、sklearn包也不是萬能的啊,多認識一些其他工具也很必要~遇到有用的、經驗性很強的部落格多多學習。新手入門多積累經驗吧~