數據預處理和特征工程


數據挖掘的五大流程

  1. 獲取數據
  2. 數據預處理
    • 數據預處理是從數據中檢測,糾正或刪除孫華,不准確或不適用於模型的記錄的過程
    • 目的: 讓數據適應模型, 匹配模型的需求
  3. 特征工程
    • 特征工程是將原始數據轉換為更能代表預測模型的潛在無問題的特征的過程, 可以通過挑選最相關的特征,提取特征以及創造特征來實現.
    • 目的: 降低計算成本,提高模型上限
  4. 建模,測試模型並預測出結果
  5. 上線,驗證模型效果

數據預處理(preprocessing)

數據歸一化

當數據按照最小值中心化后,在按照極差(最大值-最小值)縮放,數據移動了最小值個單位,並且會被收斂到[0, 1]之間的過程稱為數據歸一化(Normalization, 又稱Min-Max Scaling)

\[x*=\frac{x-min(x)}{max(x)-min(x)} \]

sklearn中的實現方法

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaler.fit(data)
result = scaler.transform(data)
# 也可以使用fit_transform將結果一步達成
# result = scaler.fit_transform(data)
# 將歸一化結果逆轉
scaler.inverse_transform(result)

當特征數量特別多的時候,fit會報錯,這時需要使用partial_fit,與fit用法相同

數據標准化

當數據按均值中心化后,再按照標准差進行縮放,數據就會服從均值為0,方差為1的正態分布,這個過程稱為數據標准化(Standardization, 又稱Z-score normalization)

\[x* = \frac{x-\mu}{\sigma}, \mu為均值,\sigma為標准差 \]

sklearn中的實現方法

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(data)
# 均值
scaler.mean_
# 方差
scaler.var_
# 標准化后的結果
x_std = scaler.transform(data)

# 也可以使用fit_transform將結果一步達成
# x_std = scaler.fit_transform(data)
# 將歸一化結果逆轉
scaler.inverse_transform(x_std)

StandardScaler和MinMaxScaler選哪個
大多數機器學習算法中,會選擇StandardScaler來進行特征縮放,因為MinMaxScaler對異常值非常敏感.在PCA, 聚類, 邏輯回歸, 支持向量機, 神經網絡等算法中,StandardScaler往往會是更好地選擇
MinMaxScaler在不涉及距離度量,梯度,協方差計算以及數據需要被壓縮到特定區間時使用廣泛,如數字圖像處理中量化像素強度時.

缺失值處理

pandas中查看是否存在缺失值以及缺失值數量

data.info()

填補缺失值的方法有

  • 均值填補
  • 中值填補
  • 眾數填補
  • 也可以使用預測等方法填補

sklearn中的缺失值填補方法

sklearn.impute.SimpleImputer(missing_values: 缺失值的樣子,默認為np.nan, strategy: 填補方式, 默認為均值("mean": 均值, 'median': 中值, 'most_frequent': 眾數, 'constant': fill_value中的值), fill_value: 當strategy為'constant'時填充該值, copy: 是否返回新副本,否的話在原來數據基礎上進行填充)

也可以直接使用pandas提供的fillna直接進行填補
data.loc[:, 'Age'] = data.loc[:, 'Age'].fillna(data.loc[:, 'Age'].median())

也可以直接刪除有缺失值的行

data = data.dropna(axis=0, inplace=False)

處理離散型特征和非數值型標簽

將離散型特征數據轉換成one-hot(向量)格式, 非數值型標簽轉換為數值型標簽

sklearn中將離散型非數值便簽轉換為數值型標簽

sklearn.preprocessing.LabelEncoder()

可以使用inverse_transform方法進行逆轉

sklearn中將離散型非數值型特征轉換為數值型特征

sklearn.preprocessing.OrdinalEncoder()

一般情況下,會將離散型特征轉換為One-hot編碼格式

sklearn中轉換為One-hot格式的方法

sklearn.preprocessing.OneHotEncoder(categories='auto': 表示自動指定每個特征的類別數)

訓練后進行transform返回的是一個稀疏矩陣,需要使用toarray()來轉換為array

可以使用categories_屬性查看新的特征索引
可以使用inverse_transform方法進行逆轉
可以使用onehot.get_feature_names()獲取每個系數矩陣的列名

sklearn中將標簽轉換為one-hot類型

sklearn.preprocessing.LabelBinarizer()

處理連續型特征

二值化

將連續型特征變量,大於閾值的映射為1,小於閾值的映射為0.

sklearn中的二值化方法

from sklearn.preprocessing import Binarizer(threshold: 閾值)

分箱

將連續型變量進行多個划分,每個划分為一定的范圍

sklearn中的分箱方法

sklearn.preprocessing.KBinsDiscretizer(
    n_bins: 每個特征分箱的個數,默認為5,
    encode: 編碼方式,默認為"onehot.('onehot'為one-hot編碼, 'ordinal'表示將每一組編碼為一個整數, 'onehot-dense': 進行one-hot編碼后返回一個密集數組),
    strategy: 定義箱寬de方式,默認為"quantile".('uniform': 等寬分箱,即間隔大小相同, 'quantile': 等位分箱,即樣本數量相同, 'kmeans': 表示聚類分箱)
)

可以通過bin_edges_屬性查看其分箱邊緣(不是列名)

特征選擇(feature selection)

一定要先理解數據的含義

特征提取(feature extraction)

Filter過濾法

根據各種統計檢驗中的各項指標來選擇特爾正

方差過濾

通過特征本身的方差來篩選特征的類.比如一個特征本身的方差特別小,那么這個特征基本上沒有存在的必要(數據之間的該特征基本沒什么差別).所以,需要先消除方差為0的特征

sklearn中的方差過濾方法

sklearn.feature_selection.VarianceThreshold(threshold: float類型, 要過濾的方差大小,默認為0.0)

可以直接使用pandas中的var查看方差,然后使用drop進行刪除

如果特征是伯努利隨機變量,可以使用p*(1-p)來計算方差(p為某一類的概率)

相關性過濾

卡方過濾

卡方過濾是專門針對離散型標簽(即分類問題)的相關性過濾.在sklearn中,卡方檢驗類feature_selection.chi2計算每個非負特征與便簽之間的卡方統計量,並按照卡方統計量由高到低為特征排名.再結合feature_selection.SelectKBest這個可以輸入"評分標准"來選出前k個分數最高的特征的類.

sklearn中的卡方統計量

sklearn.feature_selection.chi2(x, y)

sklearn中的卡方過濾方法

sklearn.feature_selection.SelectKBest(chi2, k: 選擇的特征數)

選擇k值時可以使用p值,當小於等於0.05或0.01表示相關,大於表示不相關,p值可以通過pvalues_屬性獲得,也可以通過chi2獲得(返回值是卡方值和p值)

F檢驗

F檢驗,又稱ANOVA,方差齊性檢驗,是用來捕捉每個特征與標簽之間的線性關系的過濾方法.它既可以做回歸又可以做分類.

F檢驗之前需要先將數據轉換成服從正態分布的形式
通常會將卡方檢驗和F檢驗一起使用

sklearn中的F檢驗方法

sklearn.feature_selection.f_classif(x, y)  
sklearn.feature_selection.f_regression(x, y)

該方法會返回兩個數,分別是F值和p值,p值的判斷方式與卡方檢驗相同

判斷出k值(特征數量)后,然后使用SelectKBest進行選取特征,不同的是第一個參數為F檢驗的方法

sklearn.feature_selection.SelectKBest(f_classif, k: 選擇的特征數)
sklearn.feature_selection.SelectKBest(f_regression, k: 選擇的特征數)
互信息法

互信息法是用來捕捉每個特征與標簽之間的任意關系(包括線性關系和非線性關系)的過濾方法,可以做回歸也可以做分類

sklearn中的互信息法

sklearn.feature_selection.mutual_info_calssif(x, y)
sklearn.feature_selection.mutual_indo_regression(x, y)

會返回一個值表示每個特征與目標之間的互信息量的估計,0表示兩個變量獨立,1表示兩個變量完全相關,通過該值可以確定k的具體數值

其用法與F檢驗和卡方檢驗相同,需要搭配SelectKBest使用

sklearn.feature_selection.SelectKBest(mutual_info_calssif, k: 選擇的特征數)
sklearn.feature_selection.SelectKBest(mutual_indo_regression, k: 選擇的特征數)

Embedded嵌入法

嵌入法是一種讓算法自己決定使用哪些特征的方法,即特征選擇和算法訓練同時進行.在使用嵌入法時,我們先使用某些機器學習的算法和模型進行訓練,得到各個特征的權值系數,根據權值系數從大到小選擇特征

sklearn中的嵌入法

sklearn.feature_selection.SelectionFromModel(estimator: 模型,只要到feature_importances_或coef_屬性或者帶懲罰項的模型, 
    threshold: 特征重要性的閾值,低於這個閾值的會被刪除,
    prefit: 默認為False,判斷是否將實例化后的模型直接傳遞給構造函數,若為True,則必須調用fit和transform,不能使用fit_transform,
    norm_order: k可輸入非整數,正無窮,負無窮,默認為1.在模型的coef_屬性高於一維的情況下,用於過濾低於閾值的系數的向量的范數的階數,
    max_features: 在閾值設定下,要選擇的最大特征數.要禁用閾值並僅根據max_features選擇,需要配置threshold=-np.inf
)

SelectionFromModel可以與任何一個在擬合后具有coef_, feature_importances_屬性或者參數中具有可懲罰項的模型一起使用

Wrapper包裝法

包裝法也是一個特征選擇和孫發訓練同時進行的方法,如嵌入法十分相似,他也是依賴於算法自身具有coef_, feature_importances_屬性來完成特征選擇.但是不同的是,我們往往使用一個目標函數作為黑盒來選取特征.
最典型的目標函數是遞歸特征消除法(Recursive feature elimination,簡稱RFE), 它是一種貪婪的優化算法,旨在找到性能最佳的特征子集.它反復創建模型,並且在每次迭代時保留最佳特征或剔除最差特征,下一次,他會使用上一次建模中沒有被選中的特征來構建下一個模型,知道所有特征都耗盡為止. 然后,他根據自己保留或剔除特征的順序來對特征進行排名,最終選出一個最佳子集.

包裝法的效果時多有的特征選擇方法中最有利於提升模型表現的,它可以使用很少的特征達到很優秀的效果

sklearn中的遞歸特征消除法(RFE)

sklearn.feature_selection.RFE(estimator: 模型,
    n_features_to_selection: 特征選擇的個數,
    step=1: 每次迭代中希望移除的特征個數,
    verbose=0: 控制輸出的長度
)

support屬性為所有特征的布爾矩陣, ranking屬性為特征按次數迭代中綜合重要性的排名

博客地址:https://xiaoxiablogs.top


免責聲明!

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



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