目錄
一、數據挖掘流程
1. 獲取數據
2. 數據預處理
3. 特征工程
4. 建模,測試模型并預測出結果
5. 驗證模型效果
二、sklearn中的相關包
1.sklearn.preprocessing
2.sklearn.Impute
3.sklearn.feature_selection
4.sklearn.decomposition
三、數據預處理
1. 數據無量綱化
(1)數據歸一化
(2)數據標準化
2. 缺失值
3. 處理分類型特征:編碼與啞變量
(1)preprocessing.LabelEncoder
(2)preprocessing.OrdinalEncoder
(3)preprocessing.OneHotEncoder
4. 處理連續型特征:二值化與分段
(1)preprocessing.Binarizer
(2)preprocessing.KBinsDiscretizer
四、特征選擇
1. Filter過濾法
(1)方差過濾
(2)相關性過濾
① 卡方過濾
② F檢驗
③ 互信息法
2. Embedded嵌入法
3. Wrapper包裝法
4. 總結+補充
一、數據挖掘流程
1. 獲取數據
2. 數據預處理
????????從數據中檢測,糾正或刪除損壞,不準確或不適用于模型的記錄的過程。
????????目的:讓數據適應模型,匹配模型的需求。
3. 特征工程
????????是將原始數據轉換為 更能代表預測模型的潛在問題的 特征的過程,可以 通過 挑選最 相關的特征,提取特征 以及創造特征來實現。其中 創造特征 又經常以 降維算法的 方式實現。
????????目的:① 降低計算成本,② 提升模型上限
4. 建模,測試模型并預測出結果
5. 驗證模型效果
二、sklearn中的相關包
1.sklearn.preprocessing:幾乎包含數據預處理的所有內容。
2.sklearn.Impute:填補缺失值專用。
3.sklearn.feature_selection:包含特征選擇的各種方法的實踐。
4.sklearn.decomposition:包含降維算法。
三、數據預處理
????????涉及包:preprocessing & Impute
1. 數據無量綱化
????????在機器學習算法實踐中,我們往往有著 將不同規格的 數據轉換到 同一規格,或 不同分布的數據轉換到 某個特定分布的需求,這種需求統稱為將數據 “ 無量綱化 ”。無量綱化可以加快求解速度,也可以幫我們 提升模型精度,避免 某一個取值范圍 特別大的 特征對距離 計算造成影響。
????????數據的無量綱化可以是 線性的,也可以是 非線性的。
????????線性的 無量綱化包括?中心化處理和縮放處理。(中心化的本質是讓所有記錄減去一個固定值,即讓數據樣本數據平移到某個位置。縮放的本質是通過除以一個固定值,將數據固定在某個范圍之中,取對數也算是一種縮放處理。)
(1)數據歸一化
????????當數據(x)按照最小值中心化后,再按極差(最大值 - 最小值)縮放,自個單位,并且會被收斂到[0, 1]之間,而這個過程,就叫做數據歸一化。
????????sklearn中通過 preprocessing.MinMaxScaler 實現,其中參數 feature_range 控制我們希望 把數據壓縮到的范圍,默認是[0,1]。
(2)數據標準化
????????當數據(x)按均值(𝛍)中心化后,再按標準差(𝛔)縮放,數據就會服從為均值為 0,方差為 1 的正態分布(即標準正態分布),而這個過程,就叫做 數據標準化。
????????sklearn中通過 preprocessing.StandardScaler 實現。
2. 缺失值
????????機器學習和數據挖掘中所使用的數據,永遠不可能是完美的。很多特征,對于分析和建模來說 意義非凡,但對于實際 收集數據的人 卻不是如此,因此數據挖掘之中,常常會 有重要的字段缺失值很多,但又不能舍棄字段的情況。因此,數據預處理 中非常重要的一項就是 處理缺失值。
????????sklearn中通過 impute.Simplelmputer 實現。
重要參數:
① missing_values
????????默認空值np.nan。告訴Simplelmputer,數據中的缺失值長什么樣。
② strategy
默認均值。填補缺失值的策略。
????????輸入“mean” :使用均值填補(僅對數值型特征可用)。
????????輸入“median” :用中值填補(僅對數值型特征可用)。
????????輸入“most_frequent”:?用眾數填補(對數值型和字符型特征都可用)。
????????輸入“constant” :表示請參考參數 “ fill_value" 中的值(對數值型和字符型特征都可用)。
③ fill_value
????????常用 0。當參數 “startegy” 為 “constant” 的時候可用,可輸入 字符串或數字表示 要填充的值。
④ copy
????????默認為True。將 創建特征矩陣的 副本,反之則 會將缺失值填補 到原本的 特征矩陣中去。
from sklearn.impute import SimpleImputerimp_mean = SimpleImputer() # 均值填補
imp_median = SimpleImputer(strategy="median") # 中位數填補
imp_0 = SimpleImputer(strategy="constant", fill_value=0) # 0 填補
3. 處理分類型特征:編碼與啞變量
(1)preprocessing.LabelEncoder:標簽專用,能夠將分類轉換為分類數值。
(2)preprocessing.OrdinalEncoder:特征專用,能夠將分類特征轉換為分類數值。
(3)preprocessing.OneHotEncoder:獨熱編碼,創建啞變量。
????????我們把分類轉換成 數字的時候,忽略了 數字中自帶的 數學性質,所以給算法 傳達了一些 不準確的信息,而這會影響 我們的建模。類別 OrdinalEncoder 可以用來 處理有序變量,但對于名義變量,我們只有使用啞變量的方式來處理,才能夠盡量向算法傳達最準確的信息。
????????數據類型以及常用的統計量:
from sklearn.preprocessing import OneHotEncoderenc = OneHotEncoder(categories='auto').fit(x)
result = enc.transform(x)
4. 處理連續型特征:二值化與分段
(1)preprocessing.Binarizer
????????根據閾值將數據 二值化(將特征值設置為 0 或 1),用于處理連續型變量。大于閾值的值 映射為 1,而小于或 等于閾值的值映射為 0。默認閾值為 0 時,特征中所有的 正值都映射到 1。
from sklearn.preprocessing import Binarizertransformer = Binarizer(threshold=30).fit_transform(x)
(2)preprocessing.KBinsDiscretizer
????????將連續型變量劃分為分類變量,能夠將連續型變量排序后 按順序分箱 后編碼。
① n_bins
????????默認 5。每個特征中分箱的個數,即一次會被運用到所有導入的特征。
② encode
????????默認 “ onehot ”。編碼的方式。
????????“onehot”:做啞變量,之后返回一個稀疏矩陣,每一列是一個特征中的一個類別,含有該類別的樣本表示為1,不含的表示為0。
????????“ordinar”:每個特征的每個箱都被編碼為一個 整數,返回 每一列是一個特征,每個特征下含有 不同整數編碼的 箱的 矩陣。
????????“onehot-dense”:做啞變量,之后返回一個密集數組。
③ strategy
????????默認“quantile”。用來定義箱寬的方式。
????????“uniform”:表示等寬分箱,即每個特征中的每個箱的最大值之間的差為(特征.max()- 特征.min())/(n_bins)。
????????“quantile”:表示等位分箱,即每個特征中的 每個箱內的樣本數量 都相同。
????????“kmeans”:表示按聚類分箱,每個箱中的值到 最近的一維 k均值聚類 的簇心 得距離 都相同。
from sklearn.preprocessing import KBinsDiscretizerest = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(x)
四、特征選擇
????????涉及包:feature_selection
????????從所有的特征中,選擇出有意義,對模型有幫助的特征,以避免必須將所有特征都導入模型去訓練的情況。有四種方法可以用來選擇特征:過濾法、嵌入法、包裝法和降維算法。
1. Filter過濾法
????????過濾方法通常用作預處理步驟,特征選擇完全 獨立于任何機器 學習算法。它是 根據各種統計檢驗中的分數以及相關性的各項指標來選擇特征。
????????過濾法的主要對象是:需要遍歷特征或升維的算法們。
????????過濾法的主要目的是:在維持算法表現的前提下,幫助算法們降低計算成本。
(1)方差過濾
????????sklearn 中通過 VarianceThreshold 實現。
????????重要參數:threshold。表示方差的 閾值,表示舍棄所有方差小于 threshold的特征,不填默認為 0,即 刪除所有的記錄都相同的 特征。
(2)相關性過濾
????????我們希望 選出與標簽相關且有 意義的特征,因為這樣的特征能夠為 我們提 供大量信息。如果特征 與標簽無關,那只會 白白浪費我們的計算內存,可能還會給模型帶來噪音。在sklearn當中,有三種 常用的方法來 評判特征與標簽之間 的相關性:卡方、F檢驗、互信息。
① 卡方過濾
????????卡方過濾是專門針對離散型標簽(即分類問題) 的相關性過濾,卡方檢驗類feature_selection.chi2 計算每個非負特征 和標簽之間的 卡方統計量,并依照卡方統計量由高到低為特征排名。再結合 feature_selection.SelectKBest 這個可以輸入 “評分標準” 來選出前 K 個分數最高的 特征的類,我們可以 借此除去最可能獨立 于標簽,與我們 分類目的無關的特征。
????????卡方檢驗的本質是推測 兩組數據之間的 差異,其 檢驗的原假設是 “ 兩組數據是相互獨立的 ”。卡方檢驗 返回 卡方值和 P值 兩個統計量,其中卡方值很 難界定有效的范圍,而 p值,我們一般使用 0.01 或 0.05 作為顯著性水平,即 p值判斷的 邊界。
② F檢驗
????????F檢驗,又稱ANOVA,方差 齊性檢驗,是用來捕捉每個特征與標簽之間的線性關系的過濾方法。它即可以做回歸也 可以做分類,因此包含 feature_selection.f.classif(F檢驗分類)和feature_selection.f.regression(F檢驗回歸)兩個類。其中 F 檢驗分類 用于標簽是 離散型變量的數據,而 F 檢驗回歸 用于標簽是連續型變量 的數據。和卡方檢驗一樣,這兩個類需要和類SelectKBest 連用。
????????需要注意的是,F 檢驗在數據 服從正態分布時效果會 非常穩定,因此如果使用 F 檢驗過濾,我們會 先將數據轉換 成服從正態分布的方式。
????????F 檢驗的 本質是尋找 兩組數據之問的 線性關系,其原假設是 “ 數據不存在顯著的線性關系 ”。它返回 F 值和 P 值 兩個統計量。和 卡方過濾一樣,我們希望選取 p 值 小于 0.05或0.01 的特征,這些 特征與標簽時顯 著線性相關的,而 p 值大于 0.05 或 0.01 的特征 則被我們 認為是 和 標簽 沒有顯著線性 關系的 特征,應該被刪除。
③ 互信息法
????????互信息法是用來捕捉每個特征與標簽之間的任意關系(包括線性和非線性關系)的過濾方法。和 F 檢驗相似,它既可以 做回歸 也可以做分類,并且 包含兩個類feature_selection.mutual_info_classif(互信息分類)和feature_selection.mutual_info_regression(互信息回歸)。這兩個類的用法和參數都和 F 檢驗一模一樣,不過互信息法比 F 檢驗 更加強大,F 檢驗只能 夠找出 線性關系,而 互信息法可以找出任意關系。
????????互信息法不返回 P 值 或 F 值 類似的統計量,它返回 “ 每個特征與目標之間的互信息量的估計 ”,這個估計量在[0, 1]之間取值,為 0 則表示 兩個變量獨立,為 1 則表示 兩個變量完全相關。
2. Embedded嵌入法
????????嵌入法是一種 讓算法自己決定使用哪些特征的方法,即特征選擇和算法訓練同時進行。
????????在使用嵌入法時,我們 先 使用某些機器學習的算法和模型 進行訓練,得到各個特征的權值系數,根據權值系數 從大到小選擇特征。這些權值系數 往往代表了特征對于模型的 某種貢獻或某種重要性,我們 可以列出各個特征 對樹的建立的貢獻,我們就 可以基于這種貢獻的評估,找 出對模型建立最有用的特征。
????????相比于過濾法,嵌入法 的結果會 更加精確 到模型的 效用本身,對于 提高模型效力有更好的 效果。并且,由于 考慮特征對模型 的貢獻,因此 無關的特征(需要 相關性過濾 的特征)和無區分度的特征(需要方差過濾的特征)都會因為缺乏 對模型的貢獻而 被刪除掉,可謂是 過濾法的 進化版。
????????sklearn 中通過 SelectFromModel 實現。
????????這是一個元變換器,可以與任何在擬合后具有coef_,feature_importances_屬性或參數中可選懲罰項的評估器一起使用。
????????對于有 feature_importances_ 的模型來說,若重要性 低于提供的 閾值參數,則認為 這些特征 不重要并 被移除。feature_importances_ 的取值范圍是 [0, 1],如果設置閾值 很小,比如 0.001,就 可以刪除那些對 標簽預測完全 沒貢獻的特征。如果 設置得很接近 1,可能只 有一兩個特征能夠被留下。
????????class sklearn.feature_selection.SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1, max_features=None)
3. Wrapper包裝法
????????包裝法也是一個 特征選擇和算法訓練同時進行的方法,與嵌入法十分相似,它也是依賴于算法自身的選擇,但不同的是,我們往往 使用一個 目標函數作為黑盒來幫助我們 選取特征,而不是自己輸入 某個評估指標或統計量的 閾值。
????????包裝法在初始特征集上 訓練評估器,并且通過 coef_ 屬性或 通過 feature_importances_ 屬性獲得每個特征的 重要性。然后,從當前的一組特征中 修剪最 不重要的特征。在 修剪的 集合上 遞歸地 重復該過程,直到 最終到達所需數量的 要選擇的特征。
????????區別于過濾法和嵌入法的一次訓練解決 所有問題,包裝法 要使用特征 子集進行 多次訓練,因此它所需要的計算成本是最高的。
????????注:在這個圖中的 "算法”? ,指的不 是我們最終用來 導入數據的分類 或 回歸算法,而是專業的數據挖掘算法,即 我們的 目標函數。這些數據挖掘算法的 核心功能 就是選取 最佳特征子集。
????????最典型的目標函數是遞歸特征消除法 (Recursive feature elimination,簡寫為RFE),即sklearn中的 feature selection.RFE
????????class sklearn.feature_selection.RFE(estimator, n_features_to_select=None, step=1, verbose=0)
? ? ① estimator:需要填寫的實例化后的評估器。
? ? ② n_features_to_select:想要選擇的特征個數。
? ? ③ step:表示每次迭代中希望移除的特征個數。
RFE類的兩個很重要的屬性:
? ? ① .support_:返回所有的特征是否被選中的布爾矩陣。
? ? ② .ranking_:返回特征的按數次迭代中綜合重要性的。
4. 總結+補充
????????① 大多數機器學習算法中,會選擇 StandardScaler 來進行 特征縮放,因為 MinMaxScaler 對異常值 非常敏感。MinMaxScaler 在不涉及距離 度量、梯度、協方差計算以及數據 需要被時使用廣泛。
????????② 在嵌入法下,我們 很容易就能夠實現 特征選擇的目標:減少計算量,提升模型表現。因此,比起要思考 很多統計量的 過濾法來說,嵌入法 可能是更有效的一種方法。然而,在 算法本身很復雜的時候,過濾法的 計算遠遠比嵌入法要快,所以大型數據中,我們還是會優先考慮過濾法。
????????③ 經驗來說,過濾法更快速,但更粗糙。包裝法和嵌入法 更精確,比較適合具體到算法去調整,但計算量比較大,運行時間長。當數據量很大的時候,優先使用方差過濾和互信息法調整,再上其他特征選擇方法。使用邏輯回歸時,優先使用嵌入法。使用支持向量機時,優先使用包裝法。迷茫的時候,從過濾法走起,看具體數據具體分析。
????????④ 特征選擇只是 特征工程中的第一步。真正的高手,往往使用特征創造或特征提取來尋找高級特征。