目錄html
1、 特徵工程是什麼? 2 python
③特徵處理 4app
1. 特徵清洗 4機器學習
1) 刪除包含缺失值的數據列(這種方法適用於數據列包含的缺失值太多的狀況) 8
使用sklearn作單機特徵工程
原文連接:https://www.cnblogs.com/jasonfreak/p/5448385.html
有這麼一句話在業界流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。那特徵工程究竟是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用,經過總結和概括,人們認爲特徵工程包括如下方面:
❶降維(PCA、LDA)
❷特徵選擇
特徵處理時特徵工程的核心部分,sklearn提供了較爲完整的特徵處理方法,包括數據預處理,特徵選擇,降維等等。首次接觸到sklearn,一般會被其豐富且方便的算法模型庫吸引,可是這裏介紹的特徵處理庫也十分強大。
本文中使用sklearn中的IRIS(鳶尾花)數據集來對特徵處理功能進行說明。IRIS數據集由Fisher在1936年整理,包含4個特徵(Sepal.Length(花萼長度)、Sepal.Width(花萼寬度)、Petal.Length(花瓣長度)、Petal.Width(花瓣寬度)),特徵值都爲正浮點數,單位爲釐米。目標值爲鳶尾花的分類(Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾),Iris Virginica(維吉尼亞鳶尾))。導入IRIS數據集的代碼以下:
from sklearn.datasets import load_iris #導入IRIS數據集 iris = load_iris() #特徵矩陣 dataset=iris.data #目標向量 labels=iris.target |
經過特徵提取,咱們能獲得未經處理的特徵,這時的特徵可能有如下問題:
咱們使用sklearn中的preproccessing庫來進行數據預處理,能夠覆蓋以上問題的解決方案。
無量綱化能夠加快梯度降低法收斂速度,有可能提升精度。
無量綱化使不一樣規格的數據轉換到同一規格。常見的無量綱化方法有標準化和區間縮放法。標準化的前提是特徵值服從正態分佈,標準化後,其轉換成標準正態分佈。區間縮放法利用了邊界值信息,將特徵的取值區間縮放到某個特色的範圍,例如[0, 1]等。
1.1標準化
標準化方法是將變量的每一個值與其平均值之差除以該變量的標準差,無量綱化後變量的平均值爲0,標準差爲1。使用該方法無量綱化後不一樣變量間的均值和標準差都相同,即同時消除了變量間變異程度上的差別。
標準化公式爲:
sklearn實現標準化有兩種不一樣的方式:
其中:參數x(類數組,稀疏矩陣)
axis:int類型(默認爲0),若是爲0,按特徵(即列)標準化;若是爲1,按樣本(即行)標準化
with_mean:均值,默認爲真
with_std:方差,默認爲真
據。
class sklearn.preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True) |
經過刪除平均值和縮放到單位方差來標準化特徵
參數:copy:默認爲True
這個類的屬性:
scale_:數據的相對縮放
mean_:訓練集中每一個特徵的均值
var_:訓練集中每一個特徵的方差、
n_samples_seen_:int類型,樣本數
這個類的方法:
fit(X[,y]):計算均值和方差爲了以後的縮放
fit_transform():訓練,而後標準化數據
get_params(deep=True):獲得估計量的參數
inverse_transform(X, copy=None):反標準化
transform(X, y='deprecated', copy=None):標準化
1.2區間縮放法
區間縮放法的思路有多種,常見的一種是利用兩個最值進行縮放,公式表達爲:
1.3歸一化方法有兩種
1)使用Normalizer類的方法歸一化
class sklearn.preprocessing.Normalizer(norm='l2', copy=True) |
將樣品歸一化爲單位範數
2)使用normalize()方法進行歸一化
sklearn.preprocessing.normalize(X, norm='l2', axis=1, copy=True, return_norm=False) |
對於某些定量特徵,其包含的有效信息爲區間劃分,例如學習成績,倘若只關心"及格"或不"及格",那麼須要將定量的考分,轉換成"1"和"0"表示及格和未及格。二值化能夠解決這一問題。
給定一個數據集,咱們讓編碼器找到每一個特徵的最大值,並將數據轉換爲二進制的形式表現出來。
好比輸入特徵1的三個樣本值爲1,2,9,會編爲一個二進制
將標籤編碼爲不一樣的數字來表示不一樣的類別
在python語言中,缺失值通常被稱爲nan,是"not a number"的縮寫。
下面的代碼能夠計算出數據總共有多少個缺失值,這裏數據是存儲在pandas中的DateFrame中:
在大多數狀況下,咱們必須在訓練集(training dataset)和測試集(test dataset)中刪除一樣的數據列。
這種方法比直接刪除數據列好點,能訓練出更好的模型。
默認的填補策略是使用均值填充
若是缺失數據包含重要特徵信息的話,咱們須要保存原始數據的缺失信息,存儲在boolearn列中
當數據預處理完成後,咱們須要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。一般來講,
****從兩個方面選擇特徵:
①特徵是否發散:若是一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差別,這個特徵對於樣本的區分並無什麼做用。
②特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優先選擇。除方差法外,本文介紹的其餘方法均從相關性考慮。
****根據特徵選擇的形式又能夠將特徵方法分爲3種:
①Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,選擇特徵。
②Wrapper:包裝法,根據目標函數(一般是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
Embedder:嵌入法,先使用某些機器學習的算法和模型進行訓練,獲得各個特徵的權值係數,根據稀疏從大到小選擇特徵,相似於Filter方法,可是是經過訓練來肯定大哥特徵的優劣。
咱們使用sklearn中的feature_selection庫來進行特徵選擇。
1.Filter過濾法
1.1方差選擇法
使用方差選擇法,先要計算各個特徵的方差,而後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的VarianceThreshold類來選擇特徵的代碼以下:
1.2相關係數法
使用相關係數法,先要計算各個特徵對目標值得相關係數以及相關係數得P值,用feature_selection庫得SelectKBest類結合相關係數來選擇特徵得代碼以下:
相關係數表徵兩組數得相關程度。
1.3卡方檢驗
經典得卡方檢驗是檢驗定性自變量對定性因變量得相關性。假設自變量有N中取值,因變量有M中取值,考慮自變量等於i且因變量等於j得樣本頻數得觀察值與指望得差距,構建統計量:
這個統計量的含義簡而言之就是自變量對因變量的相關性。用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特徵的代碼以下:
1.4互信息法
經典得互信息也是評價定性自變量對定性因變量得相關性的,互信息計算公式以下:
2.Wrapper:包裝法
2.1遞歸特徵消除法
遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特徵的代碼以下:
3.Embedder
3.1基於懲罰項的特徵選擇法
3.2基於樹模型的特徵選擇法
4回顧
當特徵選擇完成後,能夠直接訓練模型了,可是可能因爲特徵矩陣過大,致使計算量大,訓練時間長的問題,所以下降特徵矩陣維度也是必不可少的。常見的降維方法除了以上提到的基於L1懲罰項的模型之外,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析自己也是一個分類模型。PCA和LDA有不少的類似點,其本質是要將原始的樣本映射到維度更低的樣本空間中,可是PCA和LDA的映射目標不同:PCA是爲了讓映射後的樣本具備最大的發散性;而LDA是爲了讓映射後的樣本有最好的分類性能。因此說PCA是一種無監督的降維方法,而LDA是一種有監督的降維方法。
再讓咱們迴歸一下本文開始的特徵工程的思惟導圖,咱們可使用sklearn完成幾乎全部特徵處理的工做,並且不論是數據預處理,仍是特徵選擇,抑或降維,它們都是經過某個類的方法fit_transform完成的,fit_transform要不僅帶一個參數:特徵矩陣,要不帶兩個參數:特徵矩陣加目標向量。這些難道都是巧合嗎?仍是故意設計成這樣?方法fit_transform中有fit這一單詞,它和訓練模型的fit方法有關聯嗎?接下來,我將在《使用sklearn優雅地進行數據挖掘》中闡述其中的奧妙!