數據預處理和特徵工程

數據挖掘的五大流程

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

數據預處理(preprocessing)

數據歸一化

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

\[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中的實現方法app

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

相關文章
相關標籤/搜索