【轉】Scikit-learn技巧(拓展)總結


最近看了《Python數據挖掘入門與實戰》,網上有說翻譯地不好的,但是說實話,我覺得這本書還是相當不錯的。作者Robert Layton是sklearn的開發者之一,書中介紹了很多sklearn使用的技巧和拓展的方法。這里就書中關於sklearn的部分,還有自己學習sklearn的知識,我做一個總結的筆記。另外,我也想把這篇筆記一直更新下去。


《Python數據挖掘入門與實戰》.png

1 scikit-learn基礎介紹

1.1 估計器(Estimator)

估計器,很多時候可以直接理解成分類器,主要包含兩個函數:

  • fit():訓練算法,設置內部參數。接收訓練集和類別兩個參數。
  • predict():預測測試集類別,參數為測試集。
    大多數scikit-learn估計器接收和輸出的數據格式均為numpy數組或類似格式。

1.2 轉換器(Transformer)

轉換器用於數據預處理和數據轉換,主要是三個方法:

  • fit():訓練算法,設置內部參數。
  • transform():數據轉換。
  • fit_transform():合並fit和transform兩個方法。

1.3 流水線(Pipeline)

sklearn.pipeline

流水線的功能:

  • 跟蹤記錄各步驟的操作(以方便地重現實驗結果)
  • 對各步驟進行一個封裝
  • 確保代碼的復雜程度不至於超出掌控范圍

基本使用方法

流水線的輸入為一連串的數據挖掘步驟,其中最后一步必須是估計器,前幾步是轉換器。輸入的數據集經過轉換器的處理后,輸出的結果作為下一步的輸入。最后,用位於流水線最后一步的估計器對數據進行分類。
每一步都用元組( ‘名稱’,步驟)來表示。現在來創建流水線。

scaling_pipeline = Pipeline([
  ('scale', MinMaxScaler()), ('predict', KNeighborsClassifier()) ])

1.4 預處理

主要在sklearn.preprcessing包下。

規范化:

  • MinMaxScaler :最大最小值規范化
  • Normalizer :使每條數據各特征值的和為1
  • StandardScaler :為使各特征的均值為0,方差為1
  • Binarizer :為將數值型特征的二值化

編碼:

  • LabelEncoder :把字符串類型的數據轉化為整型
  • OneHotEncoder :特征用一個二進制數字來表示

1.5 特征

1.5.1 特征抽取

包:sklearn.feature_extraction
特征抽取是數據挖掘任務最為重要的一個環節,一般而言,它對最終結果的影響要高過數據挖掘算法本身。只有先把現實用特征表示出來,才能借助數據挖掘的力量找到問題的答案。特征選擇的另一個優點在於:降低真實世界的復雜度,模型比現實更容易操縱。
一般最常使用的特征抽取技術都是高度針對具體領域的,對於特定的領域,如圖像處理,在過去一段時間已經開發了各種特征抽取的技術,但這些技術在其他領域的應用卻非常有限。

  • DictVectorizer: 將dict類型的list數據,轉換成numpy array
  • FeatureHasher : 特征哈希,相當於一種降維技巧
  • image:圖像相關的特征抽取
  • text: 文本相關的特征抽取
  • text.CountVectorizer:將文本轉換為每個詞出現的個數的向量
  • text.TfidfVectorizer:將文本轉換為tfidf值的向量
  • text.HashingVectorizer:文本的特征哈希

示例


data.png


CountVectorize只數出現個數


count.png

hash.png


TfidfVectorizer:個數+歸一化


tfidf(without idf).png

1.5.2 特征選擇

包:sklearn.feature_selection
特征選擇的原因如下:
(1)降低復雜度
(2)降低噪音
(3)增加模型可讀性

  • VarianceThreshold: 刪除特征值的方差達不到最低標准的特征
  • SelectKBest: 返回k個最佳特征
  • SelectPercentile: 返回表現最佳的前r%個特征

單個特征和某一類別之間相關性的計算方法有很多。最常用的有卡方檢驗(χ2)。其他方法還有互信息和信息熵。

  • chi2: 卡方檢驗(χ2)

1.6 降維

包:sklearn.decomposition

  • 主成分分析算法(Principal Component Analysis, PCA)的目的是找到能用較少信息描述數據集的特征組合。它意在發現彼此之間沒有相關性、能夠描述數據集的特征,確切說這些特征的方差跟整體方差沒有多大差距,這樣的特征也被稱為主成分。這也就意味着,借助這種方法,就能通過更少的特征捕獲到數據集的大部分信息。

1.7 組合

包:sklearn.ensemble
組合技術即通過聚集多個分類器的預測來提高分類准確率。
常用的組合分類器方法:
(1)通過處理訓練數據集。即通過某種抽樣分布,對原始數據進行再抽樣,得到多個訓練集。常用的方法有裝袋(bagging)和提升(boosting)。
(2)通過處理輸入特征。即通過選擇輸入特征的子集形成每個訓練集。適用於有大量冗余特征的數據集。隨機森林(Random forest)就是一種處理輸入特征的組合方法。
(3)通過處理類標號。適用於多分類的情況,將類標號隨機划分成兩個不相交的子集,再把問題變為二分類問題,重復構建多次模型,進行分類投票。

1.8 模型評估(度量)

包:sklearn.metrics
sklearn.metrics包含評分方法、性能度量、成對度量和距離計算。
分類結果度量
參數大多是y_true和y_pred。

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

回歸結果度量

  • 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 具體模型

2.1 朴素貝葉斯(Naive Bayes)

包:sklearn.naive_bayes


朴素貝葉斯.png


朴素貝葉斯的特點是分類速度快,分類效果不一定是最好的。

  • GasussianNB:高斯分布的朴素貝葉斯
  • MultinomialNB:多項式分布的朴素貝葉斯
  • BernoulliNB:伯努利分布的朴素貝葉斯

所謂使用什么分布的朴素貝葉斯,就是假設P(x_i|y)是符合哪一種分布,比如可以假設其服從高斯分布,然后用最大似然法估計高斯分布的參數。


高斯分布.png

多項式分布.png

伯努利分布.png

3 scikit-learn擴展

3.0 概覽

具體的擴展,通常要繼承sklearn.base包下的類。

  • BaseEstimator: 估計器的基類
  • ClassifierMixin :分類器的混合類
  • ClusterMixin:聚類器的混合類
  • RegressorMixin :回歸器的混合類
  • TransformerMixin :轉換器的混合類

關於什么是Mixin(混合類),具體可以看這個知乎鏈接。簡單地理解,就是帶有實現方法的接口,可以將其看做是組合模式的一種實現。舉個例子,比如說常用的TfidfTransformer,繼承了BaseEstimator, TransformerMixin,因此它的基本功能就是單一職責的估計器和轉換器的組合。

3.1 創建自己的轉換器

在特征抽取的時候,經常會發現自己的一些數據預處理的方法,sklearn里可能沒有實現,但若直接在數據上改,又容易將代碼弄得混亂,難以重現實驗。這個時候最好自己創建一個轉換器,在后面將這個轉換器放到pipeline里,統一管理。
例如《Python數據挖掘入門與實戰》書中的例子,我們想接收一個numpy數組,根據其均值將其離散化,任何高於均值的特征值替換為1,小於或等於均值的替換為0。
代碼實現:

from sklearn.base import TransformerMixin from sklearn.utils import as_float_array class MeanDiscrete(TransformerMixin): #計算出數據集的均值,用內部變量保存該值。 def fit(self, X, y=None): X = as_float_array(X) self.mean = np.mean(X, axis=0) #返回self,確保在轉換器中能夠進行鏈式調用(例如調用transformer.fit(X).transform(X)) return self def transform(self, X): X = as_float_array(X) assert X.shape[1] == self.mean.shape[0] return X > self.mean



文/Cer_ml(簡書作者)
原文鏈接:http://www.jianshu.com/p/516f009c0875
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM