以前相關文章目錄:html
說到特徵工程,就不得不提有這麼一句話在業界普遍流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已,從而可見,特徵工程的重要程度。python
那麼什麼是特徵工程?首先先看下特徵,
特徵: 是指數據中抽取出來的對結果預測有用的信息,也就是數據的相關屬性。
特徵工程:使用專業背景知識和技巧處理數據,使得 特徵能在機器學習算法上發揮更好的做用的過程算法
意義:
1.更好的特徵意味着更強的靈活度數組
2.更好的特徵意味着只需用簡單模型,就能夠訓練出很好的效果app
3.更好的特徵意味着能夠訓練出更好的結果dom
整個流程能夠用下面這種圖來歸納 機器學習
)在肯定好咱們的目標後,咱們首先要作的就是根據業務場景,分析要實現咱們的目標須要哪些數據。也就是基於業務理解,儘量找出對因變量有影響的全部自變量。 好比:我如今要預測用戶對商品的下單狀況,或者我要給 用戶作商品推薦,那我須要採集什麼信息呢? 能夠分爲三個方向去採集,分佈式
而後,咱們針對咱們所須要的數據,須要進行可用性評估函數
在肯定好咱們須要的特徵以後,接下來就要進行考慮特徵的獲取和存儲,主要分爲離線特徵獲取和在線特徵獲取工具
1 離線特徵獲取方案
離線可使用海量的數據,藉助於分佈式文件存儲平臺,例如HDFS等,使用例如MapReduce,Spark等處理工具來處理海量的數據等。
2 在線特徵獲取方案
在線特徵比較注重獲取數據的延時,因爲是在線服務,須要在很是短的時間內獲取到相應的數據,對查找性能要求很是高,能夠將數據存儲在索引、kv存儲等。而查找性能與數據的數據量會有矛盾,須要折衷處理,咱們使用了特徵分層獲取方案,以下圖所示。
接下來就是特徵工程中最重要的,也是咱們主要在作的,特徵處理了
在特徵處理中,首先須要進行的是特徵清洗,主要作兩件事情
如何檢測異常數據呢?主要有下面幾種
1.基於統計的異常點檢測算法
(1).簡單統計分析:
好比對屬性值進行一個描述性的統計,從而查看哪些值是不合理的,好比針對年齡來講,咱們規定範圍維 [0,100],則不在這個範圍的樣本,則就認爲是異常樣本
(2).3δ原則(δ爲方差):
當數據服從正態分佈:根據正態分佈的定義可知,距離平均值3δ以外的機率爲 P(|x-μ|>3δ) <= 0.003 ,這屬於極小機率事件,在默認狀況下咱們能夠認定,距離超過平均值3δ的樣本是不存在的。 所以,當樣本距離平均值大於3δ,則認定該樣本爲異常值
(3).經過極差和四分位數間距,進行異常數據的檢測
2.基於距離的異常點檢測算法(其實和K近鄰算法的思想同樣)
主要經過距離方法來檢測異常點,將一個數據點與大多數點之間距離大於某個閾值的點視爲異常點,主要使用的距離度量方法有絕對距離(曼哈頓距離)、歐氏距離和馬氏距離等方法
3.基於密度的異常點檢測算法
考察當前點周圍密度,能夠發現局部異常點
對於一個特徵來講
數據採樣主要是爲了處理樣本不均衡問題的。好比有些狀況下,獲取來的數據,正負樣本個數差距很大,而大多數模型對正負樣本比是敏感的(好比邏輯迴歸),因此,須要經過數據採樣,來使數據正負樣本均衡
在處理樣本不均衡問題時,主要分爲兩種狀況
正負樣本個數差距很大,而且同時正負樣本個數自己也很大,這個時候能夠採起下采樣方法。
下采樣:對訓練集裏面樣本數量較多的類別(多數類)進行欠採樣,拋棄一些樣原本緩解類不平衡。
正負樣本個數差距很大,而且同時正負樣本個數自己比較小,這個時候能夠採起上採樣方法。
上採樣:對訓練集裏面樣本數量較少的類別(少數類)進行過採樣,合成新的樣原本緩解類不平衡。 這個時候會用到一個很是經典的過採樣算法SMOTE(關於過採樣SMOTE算法,在以前的一篇文章中(機器學習項目實戰 交易數據異常檢測),裏面有進行說明和應用,在這塊再也不重複)
對於不一樣類型的特徵,處理方式不一樣,下面分別來概述
數值型特徵,通常須要作如下幾個方面處理
須要查看對應特徵的最大值,最小值,平均值,方差等,從而對數據進行更好的分析,
下面以sklearn中的自帶的鳶尾花數據集爲例,經過代碼來演示
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris() #獲取數據集
# iris.data[:5] # 展現數據集的前5個數據
series = pd.Series(iris.data[:,0])
series.describe() #經過describe方法,能夠直接得到當前特徵下數據的總數,均值,方差,各個分位數,以及最大最小值等
複製代碼
count 150.000000
mean 5.843333
std 0.828066
min 4.300000
25% 5.100000
50% 5.800000
75% 6.400000
max 7.900000
dtype: float64
複製代碼
(1).標準化:標準化須要計算對應特徵下數據的均值和方差,而後看當前特徵下每一個值距離均值多少個方差,具體公式以下:
(2).區間縮放法:區間縮放法的思路有多種,常見的一種爲利用兩個最值進行縮放,具體公式以下:
(3)標準化和歸一化的區別:能夠這樣來區分,對於一個m個樣本,n個特徵的m*n的特徵矩陣,一行表示的是一個樣本數據,包含n個特徵,一列表示一個特徵下的m個樣本數據。上面所說的標準化是針對的特徵矩陣的列處理數據,將樣本的特徵值轉換到同一量綱下,而歸一化則是依據特徵矩陣的行進行處理數據,若是將一行數據看作一個向量的化,至關於向量的單位化
上面兩個方法(標準化和區間縮放分),sklearn中已經幫咱們封裝好了,具體代碼以下
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data) #標準化
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)
複製代碼
array([[0.22222222, 0.625 , 0.06779661, 0.04166667],
[0.16666667, 0.41666667, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.05084746, 0.04166667],
[0.08333333, 0.45833333, 0.08474576, 0.04166667],
[0.19444444, 0.66666667, 0.06779661, 0.04166667],
[0.30555556, 0.79166667, 0.11864407, 0.125 ],
[0.08333333, 0.58333333, 0.06779661, 0.08333333],
[0.19444444, 0.58333333, 0.08474576, 0.04166667],
[0.02777778, 0.375 , 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.30555556, 0.70833333, 0.08474576, 0.04166667],
[0.13888889, 0.58333333, 0.10169492, 0.04166667],
[0.13888889, 0.41666667, 0.06779661, 0. ],
[0. , 0.41666667, 0.01694915, 0. ],
[0.41666667, 0.83333333, 0.03389831, 0.04166667],
[0.38888889, 1. , 0.08474576, 0.125 ],
[0.30555556, 0.79166667, 0.05084746, 0.125 ],
[0.22222222, 0.625 , 0.06779661, 0.08333333],
[0.38888889, 0.75 , 0.11864407, 0.08333333],
[0.22222222, 0.75 , 0.08474576, 0.08333333],
[0.30555556, 0.58333333, 0.11864407, 0.04166667],
[0.22222222, 0.70833333, 0.08474576, 0.125 ],
[0.08333333, 0.66666667, 0. , 0.04166667],
[0.22222222, 0.54166667, 0.11864407, 0.16666667],
[0.13888889, 0.58333333, 0.15254237, 0.04166667],
[0.19444444, 0.41666667, 0.10169492, 0.04166667],
[0.19444444, 0.58333333, 0.10169492, 0.125 ],
[0.25 , 0.625 , 0.08474576, 0.04166667],
[0.25 , 0.58333333, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.10169492, 0.04166667],
[0.13888889, 0.45833333, 0.10169492, 0.04166667],
[0.30555556, 0.58333333, 0.08474576, 0.125 ],
[0.25 , 0.875 , 0.08474576, 0. ],
[0.33333333, 0.91666667, 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.19444444, 0.5 , 0.03389831, 0.04166667],
[0.33333333, 0.625 , 0.05084746, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.02777778, 0.41666667, 0.05084746, 0.04166667],
[0.22222222, 0.58333333, 0.08474576, 0.04166667],
[0.19444444, 0.625 , 0.05084746, 0.08333333],
[0.05555556, 0.125 , 0.05084746, 0.08333333],
[0.02777778, 0.5 , 0.05084746, 0.04166667],
[0.19444444, 0.625 , 0.10169492, 0.20833333],
[0.22222222, 0.75 , 0.15254237, 0.125 ],
[0.13888889, 0.41666667, 0.06779661, 0.08333333],
[0.22222222, 0.75 , 0.10169492, 0.04166667],
[0.08333333, 0.5 , 0.06779661, 0.04166667],
[0.27777778, 0.70833333, 0.08474576, 0.04166667],
[0.19444444, 0.54166667, 0.06779661, 0.04166667],
[0.75 , 0.5 , 0.62711864, 0.54166667],
[0.58333333, 0.5 , 0.59322034, 0.58333333],
[0.72222222, 0.45833333, 0.66101695, 0.58333333],
[0.33333333, 0.125 , 0.50847458, 0.5 ],
[0.61111111, 0.33333333, 0.61016949, 0.58333333],
[0.38888889, 0.33333333, 0.59322034, 0.5 ],
[0.55555556, 0.54166667, 0.62711864, 0.625 ],
[0.16666667, 0.16666667, 0.38983051, 0.375 ],
[0.63888889, 0.375 , 0.61016949, 0.5 ],
[0.25 , 0.29166667, 0.49152542, 0.54166667],
[0.19444444, 0. , 0.42372881, 0.375 ],
[0.44444444, 0.41666667, 0.54237288, 0.58333333],
[0.47222222, 0.08333333, 0.50847458, 0.375 ],
[0.5 , 0.375 , 0.62711864, 0.54166667],
[0.36111111, 0.375 , 0.44067797, 0.5 ],
[0.66666667, 0.45833333, 0.57627119, 0.54166667],
[0.36111111, 0.41666667, 0.59322034, 0.58333333],
[0.41666667, 0.29166667, 0.52542373, 0.375 ],
[0.52777778, 0.08333333, 0.59322034, 0.58333333],
[0.36111111, 0.20833333, 0.49152542, 0.41666667],
[0.44444444, 0.5 , 0.6440678 , 0.70833333],
[0.5 , 0.33333333, 0.50847458, 0.5 ],
[0.55555556, 0.20833333, 0.66101695, 0.58333333],
[0.5 , 0.33333333, 0.62711864, 0.45833333],
[0.58333333, 0.375 , 0.55932203, 0.5 ],
[0.63888889, 0.41666667, 0.57627119, 0.54166667],
[0.69444444, 0.33333333, 0.6440678 , 0.54166667],
[0.66666667, 0.41666667, 0.6779661 , 0.66666667],
[0.47222222, 0.375 , 0.59322034, 0.58333333],
[0.38888889, 0.25 , 0.42372881, 0.375 ],
[0.33333333, 0.16666667, 0.47457627, 0.41666667],
[0.33333333, 0.16666667, 0.45762712, 0.375 ],
[0.41666667, 0.29166667, 0.49152542, 0.45833333],
[0.47222222, 0.29166667, 0.69491525, 0.625 ],
[0.30555556, 0.41666667, 0.59322034, 0.58333333],
[0.47222222, 0.58333333, 0.59322034, 0.625 ],
[0.66666667, 0.45833333, 0.62711864, 0.58333333],
[0.55555556, 0.125 , 0.57627119, 0.5 ],
[0.36111111, 0.41666667, 0.52542373, 0.5 ],
[0.33333333, 0.20833333, 0.50847458, 0.5 ],
[0.33333333, 0.25 , 0.57627119, 0.45833333],
[0.5 , 0.41666667, 0.61016949, 0.54166667],
[0.41666667, 0.25 , 0.50847458, 0.45833333],
[0.19444444, 0.125 , 0.38983051, 0.375 ],
[0.36111111, 0.29166667, 0.54237288, 0.5 ],
[0.38888889, 0.41666667, 0.54237288, 0.45833333],
[0.38888889, 0.375 , 0.54237288, 0.5 ],
[0.52777778, 0.375 , 0.55932203, 0.5 ],
[0.22222222, 0.20833333, 0.33898305, 0.41666667],
[0.38888889, 0.33333333, 0.52542373, 0.5 ],
[0.55555556, 0.54166667, 0.84745763, 1. ],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.77777778, 0.41666667, 0.83050847, 0.83333333],
[0.55555556, 0.375 , 0.77966102, 0.70833333],
[0.61111111, 0.41666667, 0.81355932, 0.875 ],
[0.91666667, 0.41666667, 0.94915254, 0.83333333],
[0.16666667, 0.20833333, 0.59322034, 0.66666667],
[0.83333333, 0.375 , 0.89830508, 0.70833333],
[0.66666667, 0.20833333, 0.81355932, 0.70833333],
[0.80555556, 0.66666667, 0.86440678, 1. ],
[0.61111111, 0.5 , 0.69491525, 0.79166667],
[0.58333333, 0.29166667, 0.72881356, 0.75 ],
[0.69444444, 0.41666667, 0.76271186, 0.83333333],
[0.38888889, 0.20833333, 0.6779661 , 0.79166667],
[0.41666667, 0.33333333, 0.69491525, 0.95833333],
[0.58333333, 0.5 , 0.72881356, 0.91666667],
[0.61111111, 0.41666667, 0.76271186, 0.70833333],
[0.94444444, 0.75 , 0.96610169, 0.875 ],
[0.94444444, 0.25 , 1. , 0.91666667],
[0.47222222, 0.08333333, 0.6779661 , 0.58333333],
[0.72222222, 0.5 , 0.79661017, 0.91666667],
[0.36111111, 0.33333333, 0.66101695, 0.79166667],
[0.94444444, 0.33333333, 0.96610169, 0.79166667],
[0.55555556, 0.29166667, 0.66101695, 0.70833333],
[0.66666667, 0.54166667, 0.79661017, 0.83333333],
[0.80555556, 0.5 , 0.84745763, 0.70833333],
[0.52777778, 0.33333333, 0.6440678 , 0.70833333],
[0.5 , 0.41666667, 0.66101695, 0.70833333],
[0.58333333, 0.33333333, 0.77966102, 0.83333333],
[0.80555556, 0.41666667, 0.81355932, 0.625 ],
[0.86111111, 0.33333333, 0.86440678, 0.75 ],
[1. , 0.75 , 0.91525424, 0.79166667],
[0.58333333, 0.33333333, 0.77966102, 0.875 ],
[0.55555556, 0.33333333, 0.69491525, 0.58333333],
[0.5 , 0.25 , 0.77966102, 0.54166667],
[0.94444444, 0.41666667, 0.86440678, 0.91666667],
[0.55555556, 0.58333333, 0.77966102, 0.95833333],
[0.58333333, 0.45833333, 0.76271186, 0.70833333],
[0.47222222, 0.41666667, 0.6440678 , 0.70833333],
[0.72222222, 0.45833333, 0.74576271, 0.83333333],
[0.66666667, 0.45833333, 0.77966102, 0.95833333],
[0.72222222, 0.45833333, 0.69491525, 0.91666667],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.69444444, 0.5 , 0.83050847, 0.91666667],
[0.66666667, 0.54166667, 0.79661017, 1. ],
[0.66666667, 0.41666667, 0.71186441, 0.91666667],
[0.55555556, 0.20833333, 0.6779661 , 0.75 ],
[0.61111111, 0.41666667, 0.71186441, 0.79166667],
[0.52777778, 0.58333333, 0.74576271, 0.91666667],
[0.44444444, 0.41666667, 0.69491525, 0.70833333]])
複製代碼
離散化是數值型特徵很是重要的一個處理,其實就是要將數值型數據轉化成類別型數據
連續值的取值空間多是無窮的,爲了便於表示和在模型中處理,須要對連續值特徵進行離散化處理
在工業界,不多直接將連續值做爲特徵餵給邏輯迴歸模型,而是將連續特徵離散化爲一系列0、1特徵交給邏輯迴歸模型,這樣作的優點有如下幾點:
稀疏向量內積乘法運算速度快,計算結果方便存儲,容易scalable(擴展)。
離散化後的特徵對異常數據有很強的魯棒性:好比一個特徵是年齡>30是1,不然0。若是特徵沒有離散化,一個異常數據「年齡300歲」會給模型形成很大的干擾。
邏輯迴歸屬於廣義線性模型,表達能力受限;單變量離散化爲N個後,每一個變量有單獨的權重,至關於爲模型引入了非線性,可以提高模型表達能力,加大擬合。
離散化後能夠進行特徵交叉,由M N個變量變爲M*N個變量,進一步引入非線性,提高表達能力。
特徵離散化後,模型會更穩定,好比若是對用戶年齡離散化,20-30做爲一個區間,不會由於一個用戶年齡長了一歲就變成一個徹底不一樣的人。固然處於區間相鄰處的樣本會恰好相反,因此怎麼劃分區間是門學問。
經常使用的離散化方法包括等值劃分和等量劃分。
(1).等值劃分是將特徵按照值域進行均分,每一段內的取值等同處理。例如某個特徵的取值範圍爲[0,10],咱們能夠將其劃分爲10段,[0,1),[1,2),...,[9,10)。
(2).等量劃分是根據樣本總數進行均分,每段等量個樣本劃分爲1段。例如距離特徵,取值範圍[0,3000000],如今須要切分紅10段,若是按照等比例劃分的話,會發現絕大部分樣本都在第1段中。使用等量劃分就會避免這種問題,最終可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的區間劃分比較密,後面的比較稀疏
下面看下代碼實現
ages = np.array([20, 22,25,27,21,23,37,31,61,45,41,32]) #一些年齡數據
# 經過 pandas中的cut方法能夠分割數據
# factory = pd.cut(ages,4) #arr原始數據 , 4:要分割成幾段
factory = pd.cut(ages,4,labels=['Youth', 'YoungAdult', 'MiddleAged', 'Senior']) #lable,對於每一個類別能夠本身命名
# factory = pd.cut(arr,bins=[18,25,35,60,100],labels=['a','b','c','d']) #bins 本身指定的分割界限
# factory.dtype #CategoricalDtype,能夠看到,cut後返回的是一個Categorical 類型的對象
test = np.array(factory) #獲取出分類後的數據
test
# factory.codes # array([0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 2, 1], dtype=int8)
複製代碼
array(['Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'YoungAdult',
'YoungAdult', 'Senior', 'MiddleAged', 'MiddleAged', 'YoungAdult'],
dtype=object)
複製代碼
# 下面看下等量劃分
# 經過 pandas中的qcut方法能夠分割數據
factory = pd.qcut(ages,4)
# factory
factory.value_counts() #能夠看到,經過等量劃分,每一個類別中的數據個數都同樣
複製代碼
(19.999, 22.75] 3
(22.75, 29.0] 3
(29.0, 38.0] 3
(38.0, 61.0] 3
dtype: int64
複製代碼
對於類別型數據,最主要的一個處理,就是進行one-hot編碼,看具體例子
# 建立一個簡單的原始數據
testdata = pd.DataFrame({'age':[4,6,3,3],'pet':['cat','dog','dog','fish']})
testdata
複製代碼
age | pet | |
---|---|---|
0 | 4 | cat |
1 | 6 | dog |
2 | 3 | dog |
3 | 3 | fish |
#第一種方法,經過pandas中的提供的get_dummies方法
pd.get_dummies(testdata,columns=['pet']) #第一個參數爲原始數據,columns傳入須要編碼轉換的特徵,能夠爲多個,返回新的數據
複製代碼
age | pet_cat | pet_dog | pet_fish | |
---|---|---|---|---|
0 | 4 | 1 | 0 | 0 |
1 | 6 | 0 | 1 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 3 | 0 | 0 | 1 |
testdata.pet.values.reshape(-1,1)
複製代碼
array([['cat'],
['dog'],
['dog'],
['fish']], dtype=object)
複製代碼
#第二種方法,使用sklearn中的OneHotEncoder方法
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder().fit_transform(testdata.age.values.reshape(-1,1)).toarray()
複製代碼
array([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[1., 0., 0.]])
複製代碼
#OneHotEncoder不能對String型的數值作處理,對String類型作處理的話須要先進行轉換
# OneHotEncoder().fit_transform(testdata.pet.values.reshape(-1,1)).toarray() #會報錯
from sklearn.preprocessing import LabelEncoder
petvalue = LabelEncoder().fit_transform(testdata.pet)
print(petvalue) # [0 1 1 2] 將字符串類別轉換成整型類別
OneHotEncoder().fit_transform(petvalue.reshape(-1,1)).toarray() #能夠看到結果和上面經過get_dummies轉換出的結果相同
複製代碼
[0 1 1 2]
array([[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.]])
複製代碼
對於時間型數據來講,便可以把它轉換成連續值,也能夠轉換成離散值。
好比持續時間(單頁瀏覽時長),間隔時間(上次購買/點擊離如今的時間)
好比一天中哪一個時間段(hour_0-23) ,一週中星期幾(week_monday...) ,一年中哪一個星期 ,工做日/週末 , 一年中哪一個季度 等
#下面看個例子,這個數據是一個2年內按小時作的自行車租賃數據
import pandas as pd
data = pd.read_csv('kaggle_bike_competition_train.csv', header = 0, error_bad_lines=False)
data.head() #先看下數據的樣子,打印前5行
複製代碼
datetime | season | holiday | workingday | weather | temp | atemp | humidity | windspeed | casual | registered | count | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 81 | 0.0 | 3 | 13 | 16 |
1 | 2011-01-01 01:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 8 | 32 | 40 |
2 | 2011-01-01 02:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 5 | 27 | 32 |
3 | 2011-01-01 03:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 3 | 10 | 13 |
4 | 2011-01-01 04:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 0 | 1 | 1 |
#下面咱們只看datatime這個時間類型屬性,
#首先,咱們能夠將它切分紅
data = data.iloc[:,:1] #只看datatime這個屬性
temp = pd.DatetimeIndex(data['datetime'])
data['date'] = temp.date #日期
data['time'] = temp.time #時間
data['year'] = temp.year #年
data['month'] = temp.month #月
data['day'] = temp.day #日
data['hour'] = temp.hour #小時
data['dayofweek'] = temp.dayofweek #具體星期幾
data['dateDays'] = (data.date - data.date[0]) #生成一個時間長度特徵 ['0days','0days',...,'1days',...]
data['dateDays'] = data['dateDays'].astype('timedelta64[D]') #轉換成float型
data
複製代碼
datetime | date | time | year | month | day | hour | dayofweek | dateDays | |
---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 2011-01-01 | 00:00:00 | 2011 | 1 | 1 | 0 | 5 | 0.0 |
1 | 2011-01-01 01:00:00 | 2011-01-01 | 01:00:00 | 2011 | 1 | 1 | 1 | 5 | 0.0 |
2 | 2011-01-01 02:00:00 | 2011-01-01 | 02:00:00 | 2011 | 1 | 1 | 2 | 5 | 0.0 |
3 | 2011-01-01 03:00:00 | 2011-01-01 | 03:00:00 | 2011 | 1 | 1 | 3 | 5 | 0.0 |
4 | 2011-01-01 04:00:00 | 2011-01-01 | 04:00:00 | 2011 | 1 | 1 | 4 | 5 | 0.0 |
5 | 2011-01-01 05:00:00 | 2011-01-01 | 05:00:00 | 2011 | 1 | 1 | 5 | 5 | 0.0 |
6 | 2011-01-01 06:00:00 | 2011-01-01 | 06:00:00 | 2011 | 1 | 1 | 6 | 5 | 0.0 |
7 | 2011-01-01 07:00:00 | 2011-01-01 | 07:00:00 | 2011 | 1 | 1 | 7 | 5 | 0.0 |
8 | 2011-01-01 08:00:00 | 2011-01-01 | 08:00:00 | 2011 | 1 | 1 | 8 | 5 | 0.0 |
9 | 2011-01-01 09:00:00 | 2011-01-01 | 09:00:00 | 2011 | 1 | 1 | 9 | 5 | 0.0 |
10 | 2011-01-01 10:00:00 | 2011-01-01 | 10:00:00 | 2011 | 1 | 1 | 10 | 5 | 0.0 |
11 | 2011-01-01 11:00:00 | 2011-01-01 | 11:00:00 | 2011 | 1 | 1 | 11 | 5 | 0.0 |
12 | 2011-01-01 12:00:00 | 2011-01-01 | 12:00:00 | 2011 | 1 | 1 | 12 | 5 | 0.0 |
13 | 2011-01-01 13:00:00 | 2011-01-01 | 13:00:00 | 2011 | 1 | 1 | 13 | 5 | 0.0 |
14 | 2011-01-01 14:00:00 | 2011-01-01 | 14:00:00 | 2011 | 1 | 1 | 14 | 5 | 0.0 |
15 | 2011-01-01 15:00:00 | 2011-01-01 | 15:00:00 | 2011 | 1 | 1 | 15 | 5 | 0.0 |
16 | 2011-01-01 16:00:00 | 2011-01-01 | 16:00:00 | 2011 | 1 | 1 | 16 | 5 | 0.0 |
17 | 2011-01-01 17:00:00 | 2011-01-01 | 17:00:00 | 2011 | 1 | 1 | 17 | 5 | 0.0 |
18 | 2011-01-01 18:00:00 | 2011-01-01 | 18:00:00 | 2011 | 1 | 1 | 18 | 5 | 0.0 |
19 | 2011-01-01 19:00:00 | 2011-01-01 | 19:00:00 | 2011 | 1 | 1 | 19 | 5 | 0.0 |
20 | 2011-01-01 20:00:00 | 2011-01-01 | 20:00:00 | 2011 | 1 | 1 | 20 | 5 | 0.0 |
21 | 2011-01-01 21:00:00 | 2011-01-01 | 21:00:00 | 2011 | 1 | 1 | 21 | 5 | 0.0 |
22 | 2011-01-01 22:00:00 | 2011-01-01 | 22:00:00 | 2011 | 1 | 1 | 22 | 5 | 0.0 |
23 | 2011-01-01 23:00:00 | 2011-01-01 | 23:00:00 | 2011 | 1 | 1 | 23 | 5 | 0.0 |
24 | 2011-01-02 00:00:00 | 2011-01-02 | 00:00:00 | 2011 | 1 | 2 | 0 | 6 | 1.0 |
25 | 2011-01-02 01:00:00 | 2011-01-02 | 01:00:00 | 2011 | 1 | 2 | 1 | 6 | 1.0 |
26 | 2011-01-02 02:00:00 | 2011-01-02 | 02:00:00 | 2011 | 1 | 2 | 2 | 6 | 1.0 |
27 | 2011-01-02 03:00:00 | 2011-01-02 | 03:00:00 | 2011 | 1 | 2 | 3 | 6 | 1.0 |
28 | 2011-01-02 04:00:00 | 2011-01-02 | 04:00:00 | 2011 | 1 | 2 | 4 | 6 | 1.0 |
29 | 2011-01-02 06:00:00 | 2011-01-02 | 06:00:00 | 2011 | 1 | 2 | 6 | 6 | 1.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
10856 | 2012-12-18 18:00:00 | 2012-12-18 | 18:00:00 | 2012 | 12 | 18 | 18 | 1 | 717.0 |
10857 | 2012-12-18 19:00:00 | 2012-12-18 | 19:00:00 | 2012 | 12 | 18 | 19 | 1 | 717.0 |
10858 | 2012-12-18 20:00:00 | 2012-12-18 | 20:00:00 | 2012 | 12 | 18 | 20 | 1 | 717.0 |
10859 | 2012-12-18 21:00:00 | 2012-12-18 | 21:00:00 | 2012 | 12 | 18 | 21 | 1 | 717.0 |
10860 | 2012-12-18 22:00:00 | 2012-12-18 | 22:00:00 | 2012 | 12 | 18 | 22 | 1 | 717.0 |
10861 | 2012-12-18 23:00:00 | 2012-12-18 | 23:00:00 | 2012 | 12 | 18 | 23 | 1 | 717.0 |
10862 | 2012-12-19 00:00:00 | 2012-12-19 | 00:00:00 | 2012 | 12 | 19 | 0 | 2 | 718.0 |
10863 | 2012-12-19 01:00:00 | 2012-12-19 | 01:00:00 | 2012 | 12 | 19 | 1 | 2 | 718.0 |
10864 | 2012-12-19 02:00:00 | 2012-12-19 | 02:00:00 | 2012 | 12 | 19 | 2 | 2 | 718.0 |
10865 | 2012-12-19 03:00:00 | 2012-12-19 | 03:00:00 | 2012 | 12 | 19 | 3 | 2 | 718.0 |
10866 | 2012-12-19 04:00:00 | 2012-12-19 | 04:00:00 | 2012 | 12 | 19 | 4 | 2 | 718.0 |
10867 | 2012-12-19 05:00:00 | 2012-12-19 | 05:00:00 | 2012 | 12 | 19 | 5 | 2 | 718.0 |
10868 | 2012-12-19 06:00:00 | 2012-12-19 | 06:00:00 | 2012 | 12 | 19 | 6 | 2 | 718.0 |
10869 | 2012-12-19 07:00:00 | 2012-12-19 | 07:00:00 | 2012 | 12 | 19 | 7 | 2 | 718.0 |
10870 | 2012-12-19 08:00:00 | 2012-12-19 | 08:00:00 | 2012 | 12 | 19 | 8 | 2 | 718.0 |
10871 | 2012-12-19 09:00:00 | 2012-12-19 | 09:00:00 | 2012 | 12 | 19 | 9 | 2 | 718.0 |
10872 | 2012-12-19 10:00:00 | 2012-12-19 | 10:00:00 | 2012 | 12 | 19 | 10 | 2 | 718.0 |
10873 | 2012-12-19 11:00:00 | 2012-12-19 | 11:00:00 | 2012 | 12 | 19 | 11 | 2 | 718.0 |
10874 | 2012-12-19 12:00:00 | 2012-12-19 | 12:00:00 | 2012 | 12 | 19 | 12 | 2 | 718.0 |
10875 | 2012-12-19 13:00:00 | 2012-12-19 | 13:00:00 | 2012 | 12 | 19 | 13 | 2 | 718.0 |
10876 | 2012-12-19 14:00:00 | 2012-12-19 | 14:00:00 | 2012 | 12 | 19 | 14 | 2 | 718.0 |
10877 | 2012-12-19 15:00:00 | 2012-12-19 | 15:00:00 | 2012 | 12 | 19 | 15 | 2 | 718.0 |
10878 | 2012-12-19 16:00:00 | 2012-12-19 | 16:00:00 | 2012 | 12 | 19 | 16 | 2 | 718.0 |
10879 | 2012-12-19 17:00:00 | 2012-12-19 | 17:00:00 | 2012 | 12 | 19 | 17 | 2 | 718.0 |
10880 | 2012-12-19 18:00:00 | 2012-12-19 | 18:00:00 | 2012 | 12 | 19 | 18 | 2 | 718.0 |
10881 | 2012-12-19 19:00:00 | 2012-12-19 | 19:00:00 | 2012 | 12 | 19 | 19 | 2 | 718.0 |
10882 | 2012-12-19 20:00:00 | 2012-12-19 | 20:00:00 | 2012 | 12 | 19 | 20 | 2 | 718.0 |
10883 | 2012-12-19 21:00:00 | 2012-12-19 | 21:00:00 | 2012 | 12 | 19 | 21 | 2 | 718.0 |
10884 | 2012-12-19 22:00:00 | 2012-12-19 | 22:00:00 | 2012 | 12 | 19 | 22 | 2 | 718.0 |
10885 | 2012-12-19 23:00:00 | 2012-12-19 | 23:00:00 | 2012 | 12 | 19 | 23 | 2 | 718.0 |
10886 rows × 9 columns
temp
複製代碼
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
'2011-01-01 02:00:00', '2011-01-01 03:00:00',
'2011-01-01 04:00:00', '2011-01-01 05:00:00',
'2011-01-01 06:00:00', '2011-01-01 07:00:00',
'2011-01-01 08:00:00', '2011-01-01 09:00:00',
...
'2012-12-19 14:00:00', '2012-12-19 15:00:00',
'2012-12-19 16:00:00', '2012-12-19 17:00:00',
'2012-12-19 18:00:00', '2012-12-19 19:00:00',
'2012-12-19 20:00:00', '2012-12-19 21:00:00',
'2012-12-19 22:00:00', '2012-12-19 23:00:00'],
dtype='datetime64[ns]', name='datetime', length=10886, freq=None)
複製代碼
在實際項目中,並非維數越高越好,爲何要進行降維操做,主要是出於一下考慮
正是因爲高維特徵有如上描述的各類各樣的問題,因此咱們須要進行特徵降維和特徵選擇等工做。特徵降維經常使用的算法有PCA,LDA等。特徵降維的目標是將高維空間中的數據集映射到低維空間數據,同時儘量少地丟失信息,或者降維後的數據點儘量地容易被區分 關於PCA算法,在以前的文章有介紹 PCA算法分析
當數據預處理完成後,咱們須要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。
特徵選擇的目標是尋找最優特徵子集。特徵選擇能剔除不相關(irrelevant)或冗餘(redundant )的特徵,從而達到減小特徵個數,提升模型精確度,減小運行時間的目的。另外一方面,選取出真正相關的特徵簡化模型,協助理解數據產生的過程。
根據特徵選項的形式,能夠將特徵選擇方法分爲三種
使用方差選擇法,先要計算各個特徵的方差,而後根據閾值,選擇方差大於閾值的特徵。
from sklearn.feature_selection import VarianceThreshold
# iris.data[:,0].var() #0.6811222222222223
# iris.data[:,1].var() #0.18675066666666668
# iris.data[:,2].var() #3.092424888888889
# iris.data[:,3].var() #0.5785315555555555
#threshold:比較的方差的閾值,返回方差大於閾值的特徵對應的數據。針對上面的鳶尾花數據集,只會返回第三列數據
# VarianceThreshold(threshold=3).fit_transform(iris.data)
複製代碼
使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的P值。
用feature_selection庫的SelectKBest類結合相關係數來選擇特徵的代碼以下
#首先看下皮爾森相關係數的計算
from scipy.stats import pearsonr #用來計算相關係數
np.random.seed(0) #設置相同的seed,每次生成的隨機數相同
size = 300
test = np.random.normal(0,1,size)
# print("加入低噪聲後:",pearsonr(test,test+np.random.normal(0,1,size))) #返回的第一個值爲相關係數,第二個值爲P值
# print("加入高噪聲後:",pearsonr(test,test+np.random.normal(0,10,size)))
#相關係統越高,p值越小
from sklearn.feature_selection import SelectKBest
#選擇K個最好的特徵,返回選擇特徵後的數據
#第一個參數爲計算評估特徵是否好的函數,該函數輸入特徵矩陣和目標向量,輸出二元組(評分,P值)的數組,數組第i項爲第i個特徵的評分和P值。在此定義爲計算相關係數
#參數k爲選擇的特徵個數
SelectKBest(lambda X, Y: list(np.array(list(map(lambda x:pearsonr(x, Y), X.T))).T), k=2).fit_transform(iris.data, iris.target)
複製代碼
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
複製代碼
經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。假設自變量有N種取值,因變量有M種取值,考慮自變量等於i且因變量等於j的樣本頻數的觀察值與指望的差距,構建統計量:
用feature_selection庫的SelectKBest類結合卡方檢驗來選擇特徵的代碼以下:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#選擇K個最好的特徵,返回選擇特徵後的數據
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
複製代碼
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
複製代碼
把特徵選擇看作一個特徵子集搜索問題,篩選各類特 徵子集,用模型評估效果。
典型的包裹型算法爲 「遞歸特徵刪除算 法」
遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。
好比用邏輯迴歸,怎麼作這個事情呢?
① 用全量特徵跑一個模型
② 根據線性模型的係數(體現相關性),刪掉5-10%的弱特徵,觀 察準確率/auc的變化
③ 逐步進行,直至準確率/auc出現大的下滑中止
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#遞歸特徵消除法,返回特徵選擇後的數據
#參數estimator爲基模型
#參數n_features_to_select爲選擇的特徵個數
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
複製代碼
array([[3.5, 0.2],
[3. , 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.6, 0.2],
[3.9, 0.4],
[3.4, 0.3],
[3.4, 0.2],
[2.9, 0.2],
[3.1, 0.1],
[3.7, 0.2],
[3.4, 0.2],
[3. , 0.1],
[3. , 0.1],
[4. , 0.2],
[4.4, 0.4],
[3.9, 0.4],
[3.5, 0.3],
[3.8, 0.3],
[3.8, 0.3],
[3.4, 0.2],
[3.7, 0.4],
[3.6, 0.2],
[3.3, 0.5],
[3.4, 0.2],
[3. , 0.2],
[3.4, 0.4],
[3.5, 0.2],
[3.4, 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.4, 0.4],
[4.1, 0.1],
[4.2, 0.2],
[3.1, 0.1],
[3.2, 0.2],
[3.5, 0.2],
[3.1, 0.1],
[3. , 0.2],
[3.4, 0.2],
[3.5, 0.3],
[2.3, 0.3],
[3.2, 0.2],
[3.5, 0.6],
[3.8, 0.4],
[3. , 0.3],
[3.8, 0.2],
[3.2, 0.2],
[3.7, 0.2],
[3.3, 0.2],
[3.2, 1.4],
[3.2, 1.5],
[3.1, 1.5],
[2.3, 1.3],
[2.8, 1.5],
[2.8, 1.3],
[3.3, 1.6],
[2.4, 1. ],
[2.9, 1.3],
[2.7, 1.4],
[2. , 1. ],
[3. , 1.5],
[2.2, 1. ],
[2.9, 1.4],
[2.9, 1.3],
[3.1, 1.4],
[3. , 1.5],
[2.7, 1. ],
[2.2, 1.5],
[2.5, 1.1],
[3.2, 1.8],
[2.8, 1.3],
[2.5, 1.5],
[2.8, 1.2],
[2.9, 1.3],
[3. , 1.4],
[2.8, 1.4],
[3. , 1.7],
[2.9, 1.5],
[2.6, 1. ],
[2.4, 1.1],
[2.4, 1. ],
[2.7, 1.2],
[2.7, 1.6],
[3. , 1.5],
[3.4, 1.6],
[3.1, 1.5],
[2.3, 1.3],
[3. , 1.3],
[2.5, 1.3],
[2.6, 1.2],
[3. , 1.4],
[2.6, 1.2],
[2.3, 1. ],
[2.7, 1.3],
[3. , 1.2],
[2.9, 1.3],
[2.9, 1.3],
[2.5, 1.1],
[2.8, 1.3],
[3.3, 2.5],
[2.7, 1.9],
[3. , 2.1],
[2.9, 1.8],
[3. , 2.2],
[3. , 2.1],
[2.5, 1.7],
[2.9, 1.8],
[2.5, 1.8],
[3.6, 2.5],
[3.2, 2. ],
[2.7, 1.9],
[3. , 2.1],
[2.5, 2. ],
[2.8, 2.4],
[3.2, 2.3],
[3. , 1.8],
[3.8, 2.2],
[2.6, 2.3],
[2.2, 1.5],
[3.2, 2.3],
[2.8, 2. ],
[2.8, 2. ],
[2.7, 1.8],
[3.3, 2.1],
[3.2, 1.8],
[2.8, 1.8],
[3. , 1.8],
[2.8, 2.1],
[3. , 1.6],
[2.8, 1.9],
[3.8, 2. ],
[2.8, 2.2],
[2.8, 1.5],
[2.6, 1.4],
[3. , 2.3],
[3.4, 2.4],
[3.1, 1.8],
[3. , 1.8],
[3.1, 2.1],
[3.1, 2.4],
[3.1, 2.3],
[2.7, 1.9],
[3.2, 2.3],
[3.3, 2.5],
[3. , 2.3],
[2.5, 1.9],
[3. , 2. ],
[3.4, 2.3],
[3. , 1.8]])
複製代碼
使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的SelectFromModel類結合帶L1懲罰項的邏輯迴歸模型,來選擇特徵的代碼以下:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#帶L1懲罰項的邏輯迴歸做爲基模型的特徵選擇
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
複製代碼
array([[5.1, 3.5, 1.4],
[4.9, 3. , 1.4],
[4.7, 3.2, 1.3],
[4.6, 3.1, 1.5],
[5. , 3.6, 1.4],
[5.4, 3.9, 1.7],
[4.6, 3.4, 1.4],
[5. , 3.4, 1.5],
[4.4, 2.9, 1.4],
[4.9, 3.1, 1.5],
[5.4, 3.7, 1.5],
[4.8, 3.4, 1.6],
[4.8, 3. , 1.4],
[4.3, 3. , 1.1],
[5.8, 4. , 1.2],
[5.7, 4.4, 1.5],
[5.4, 3.9, 1.3],
[5.1, 3.5, 1.4],
[5.7, 3.8, 1.7],
[5.1, 3.8, 1.5],
[5.4, 3.4, 1.7],
[5.1, 3.7, 1.5],
[4.6, 3.6, 1. ],
[5.1, 3.3, 1.7],
[4.8, 3.4, 1.9],
[5. , 3. , 1.6],
[5. , 3.4, 1.6],
[5.2, 3.5, 1.5],
[5.2, 3.4, 1.4],
[4.7, 3.2, 1.6],
[4.8, 3.1, 1.6],
[5.4, 3.4, 1.5],
[5.2, 4.1, 1.5],
[5.5, 4.2, 1.4],
[4.9, 3.1, 1.5],
[5. , 3.2, 1.2],
[5.5, 3.5, 1.3],
[4.9, 3.1, 1.5],
[4.4, 3. , 1.3],
[5.1, 3.4, 1.5],
[5. , 3.5, 1.3],
[4.5, 2.3, 1.3],
[4.4, 3.2, 1.3],
[5. , 3.5, 1.6],
[5.1, 3.8, 1.9],
[4.8, 3. , 1.4],
[5.1, 3.8, 1.6],
[4.6, 3.2, 1.4],
[5.3, 3.7, 1.5],
[5. , 3.3, 1.4],
[7. , 3.2, 4.7],
[6.4, 3.2, 4.5],
[6.9, 3.1, 4.9],
[5.5, 2.3, 4. ],
[6.5, 2.8, 4.6],
[5.7, 2.8, 4.5],
[6.3, 3.3, 4.7],
[4.9, 2.4, 3.3],
[6.6, 2.9, 4.6],
[5.2, 2.7, 3.9],
[5. , 2. , 3.5],
[5.9, 3. , 4.2],
[6. , 2.2, 4. ],
[6.1, 2.9, 4.7],
[5.6, 2.9, 3.6],
[6.7, 3.1, 4.4],
[5.6, 3. , 4.5],
[5.8, 2.7, 4.1],
[6.2, 2.2, 4.5],
[5.6, 2.5, 3.9],
[5.9, 3.2, 4.8],
[6.1, 2.8, 4. ],
[6.3, 2.5, 4.9],
[6.1, 2.8, 4.7],
[6.4, 2.9, 4.3],
[6.6, 3. , 4.4],
[6.8, 2.8, 4.8],
[6.7, 3. , 5. ],
[6. , 2.9, 4.5],
[5.7, 2.6, 3.5],
[5.5, 2.4, 3.8],
[5.5, 2.4, 3.7],
[5.8, 2.7, 3.9],
[6. , 2.7, 5.1],
[5.4, 3. , 4.5],
[6. , 3.4, 4.5],
[6.7, 3.1, 4.7],
[6.3, 2.3, 4.4],
[5.6, 3. , 4.1],
[5.5, 2.5, 4. ],
[5.5, 2.6, 4.4],
[6.1, 3. , 4.6],
[5.8, 2.6, 4. ],
[5. , 2.3, 3.3],
[5.6, 2.7, 4.2],
[5.7, 3. , 4.2],
[5.7, 2.9, 4.2],
[6.2, 2.9, 4.3],
[5.1, 2.5, 3. ],
[5.7, 2.8, 4.1],
[6.3, 3.3, 6. ],
[5.8, 2.7, 5.1],
[7.1, 3. , 5.9],
[6.3, 2.9, 5.6],
[6.5, 3. , 5.8],
[7.6, 3. , 6.6],
[4.9, 2.5, 4.5],
[7.3, 2.9, 6.3],
[6.7, 2.5, 5.8],
[7.2, 3.6, 6.1],
[6.5, 3.2, 5.1],
[6.4, 2.7, 5.3],
[6.8, 3. , 5.5],
[5.7, 2.5, 5. ],
[5.8, 2.8, 5.1],
[6.4, 3.2, 5.3],
[6.5, 3. , 5.5],
[7.7, 3.8, 6.7],
[7.7, 2.6, 6.9],
[6. , 2.2, 5. ],
[6.9, 3.2, 5.7],
[5.6, 2.8, 4.9],
[7.7, 2.8, 6.7],
[6.3, 2.7, 4.9],
[6.7, 3.3, 5.7],
[7.2, 3.2, 6. ],
[6.2, 2.8, 4.8],
[6.1, 3. , 4.9],
[6.4, 2.8, 5.6],
[7.2, 3. , 5.8],
[7.4, 2.8, 6.1],
[7.9, 3.8, 6.4],
[6.4, 2.8, 5.6],
[6.3, 2.8, 5.1],
[6.1, 2.6, 5.6],
[7.7, 3. , 6.1],
[6.3, 3.4, 5.6],
[6.4, 3.1, 5.5],
[6. , 3. , 4.8],
[6.9, 3.1, 5.4],
[6.7, 3.1, 5.6],
[6.9, 3.1, 5.1],
[5.8, 2.7, 5.1],
[6.8, 3.2, 5.9],
[6.7, 3.3, 5.7],
[6.7, 3. , 5.2],
[6.3, 2.5, 5. ],
[6.5, 3. , 5.2],
[6.2, 3.4, 5.4],
[5.9, 3. , 5.1]])
複製代碼
樹模型中GBDT也可用來做爲基模型進行特徵選擇,使用feature_selection庫的SelectFromModel類結合GBDT模型,來選擇特徵的代碼以下
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT做爲基模型的特徵選擇
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
複製代碼
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
複製代碼
上述就是關於特徵工程的相關說明,至於特徵監控相關的內容,目前還沒了解過,等後面學習了再進行補充。
再進行完特徵工程後,下一步須要作的就是模型選擇與調優,下篇文章將主要學習整理這方面的知識
參考文章:
1.blog.csdn.net/rosenor1/ar…
2.www.cnblogs.com/jasonfreak/…
歡迎關注個人我的公衆號 AI計算機視覺工坊,本公衆號不按期推送機器學習,深度學習,計算機視覺等相關文章,歡迎你們和我一塊兒學習,交流。