機器學習之 特徵工程

以前相關文章目錄:html

  1. 機器學習 之線性迴歸
  2. 機器學習 之邏輯迴歸及python實現
  3. 機器學習項目實戰 交易數據異常檢測
  4. 機器學習之 決策樹(Decision Tree)
  5. 機器學習之 決策樹(Decision Tree)python實現
  6. 機器學習之 PCA(主成分分析)
  7. 機器學習之特徵工程

說到特徵工程,就不得不提有這麼一句話在業界普遍流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已,從而可見,特徵工程的重要程度。python

一.特徵工程的解釋和意義

那麼什麼是特徵工程?首先先看下特徵,
特徵: 是指數據中抽取出來的對結果預測有用的信息,也就是數據的相關屬性。
特徵工程:使用專業背景知識和技巧處理數據,使得 特徵能在機器學習算法上發揮更好的做用的過程算法

意義:
1.更好的特徵意味着更強的靈活度數組

2.更好的特徵意味着只需用簡單模型,就能夠訓練出很好的效果app

3.更好的特徵意味着能夠訓練出更好的結果dom

二.特徵工程具體流程

整個流程能夠用下面這種圖來歸納 機器學習

)

1.特徵使用方案

在肯定好咱們的目標後,咱們首先要作的就是根據業務場景,分析要實現咱們的目標須要哪些數據。也就是基於業務理解,儘量找出對因變量有影響的全部自變量。 好比:我如今要預測用戶對商品的下單狀況,或者我要給 用戶作商品推薦,那我須要採集什麼信息呢? 能夠分爲三個方向去採集,分佈式

  1. 店家:店家的類別,店家評分,店家所用快遞等
  2. 商品:商品的類別,評分,購買人數,顏色等
  3. 用戶:歷史購買信息,消費能力,購物車轉換比,商品停留時間,用戶年齡,所在地址等

而後,咱們針對咱們所須要的數據,須要進行可用性評估函數

  1. 獲取難度,數據咱們可以採集到嗎? 好比對於用戶年齡來講,就比較難於獲取,並非每一個人都在註冊時都會去填寫年齡
  2. 覆蓋率,有些數據並非每一個對象都有的,好比對於歷史購買信息,對於新用戶來講,是沒有的
  3. 準確率, 像用戶年齡,店家評分,也都會有準確率的問題,由於店家可能刷單,用戶也可能不寫真實年齡
  4. 線上實時計算的時候獲取是否快捷?

2.特徵獲取方案

在肯定好咱們須要的特徵以後,接下來就要進行考慮特徵的獲取和存儲,主要分爲離線特徵獲取和在線特徵獲取工具

1 離線特徵獲取方案
離線可使用海量的數據,藉助於分佈式文件存儲平臺,例如HDFS等,使用例如MapReduce,Spark等處理工具來處理海量的數據等。

2 在線特徵獲取方案
在線特徵比較注重獲取數據的延時,因爲是在線服務,須要在很是短的時間內獲取到相應的數據,對查找性能要求很是高,能夠將數據存儲在索引、kv存儲等。而查找性能與數據的數據量會有矛盾,須要折衷處理,咱們使用了特徵分層獲取方案,以下圖所示。

3.特徵處理

接下來就是特徵工程中最重要的,也是咱們主要在作的,特徵處理了

3.1特徵清洗

在特徵處理中,首先須要進行的是特徵清洗,主要作兩件事情

3.1.1清洗髒數據(異常數據)

如何檢測異常數據呢?主要有下面幾種

1.基於統計的異常點檢測算法
(1).簡單統計分析:
好比對屬性值進行一個描述性的統計,從而查看哪些值是不合理的,好比針對年齡來講,咱們規定範圍維 [0,100],則不在這個範圍的樣本,則就認爲是異常樣本
(2).3δ原則(δ爲方差):
當數據服從正態分佈:根據正態分佈的定義可知,距離平均值3δ以外的機率爲 P(|x-μ|>3δ) <= 0.003 ,這屬於極小機率事件,在默認狀況下咱們能夠認定,距離超過平均值3δ的樣本是不存在的。 所以,當樣本距離平均值大於3δ,則認定該樣本爲異常值
(3).經過極差和四分位數間距,進行異常數據的檢測

2.基於距離的異常點檢測算法(其實和K近鄰算法的思想同樣)
主要經過距離方法來檢測異常點,將一個數據點與大多數點之間距離大於某個閾值的點視爲異常點,主要使用的距離度量方法有絕對距離(曼哈頓距離)、歐氏距離和馬氏距離等方法

3.基於密度的異常點檢測算法
考察當前點周圍密度,能夠發現局部異常點

3.1.2缺失值處理

對於一個特徵來講

  1. 若是全部樣本中的的缺失值極多,則能夠直接去掉
  2. 若是缺失值不是不少,能夠考慮用全局均值,或者中位數進行填充
  3. 將此特徵做爲目標,根據未缺失的數據,利用相關算法模型,對缺失值進行預測

3.1.3數據採樣

數據採樣主要是爲了處理樣本不均衡問題的。好比有些狀況下,獲取來的數據,正負樣本個數差距很大,而大多數模型對正負樣本比是敏感的(好比邏輯迴歸),因此,須要經過數據採樣,來使數據正負樣本均衡

在處理樣本不均衡問題時,主要分爲兩種狀況

  1. 正負樣本個數差距很大,而且同時正負樣本個數自己也很大,這個時候能夠採起下采樣方法。
    下采樣:對訓練集裏面樣本數量較多的類別(多數類)進行欠採樣,拋棄一些樣原本緩解類不平衡。

  2. 正負樣本個數差距很大,而且同時正負樣本個數自己比較小,這個時候能夠採起上採樣方法。
    上採樣:對訓練集裏面樣本數量較少的類別(少數類)進行過採樣,合成新的樣原本緩解類不平衡。 這個時候會用到一個很是經典的過採樣算法SMOTE(關於過採樣SMOTE算法,在以前的一篇文章中(機器學習項目實戰 交易數據異常檢測),裏面有進行說明和應用,在這塊再也不重複)

3.2特徵預處理

對於不一樣類型的特徵,處理方式不一樣,下面分別來概述

3.2.1數值型(指的是連續型數據)

數值型特徵,通常須要作如下幾個方面處理

1.1統計值。

須要查看對應特徵的最大值,最小值,平均值,方差等,從而對數據進行更好的分析,
下面以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.無量綱化。 經常使用的無量綱化方法有標準化和區間縮放法。

(1).標準化:標準化須要計算對應特徵下數據的均值和方差,而後看當前特徵下每一個值距離均值多少個方差,具體公式以下:

x' = \frac{x - \overline{X}}{S}

(2).區間縮放法:區間縮放法的思路有多種,常見的一種爲利用兩個最值進行縮放,具體公式以下:

x' = \frac{x-Min}{Max-Min}

(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]])
複製代碼

1.3.離散化

離散化是數值型特徵很是重要的一個處理,其實就是要將數值型數據轉化成類別型數據
連續值的取值空間多是無窮的,爲了便於表示和在模型中處理,須要對連續值特徵進行離散化處理
在工業界,不多直接將連續值做爲特徵餵給邏輯迴歸模型,而是將連續特徵離散化爲一系列0、1特徵交給邏輯迴歸模型,這樣作的優點有如下幾點:

  1. 稀疏向量內積乘法運算速度快,計算結果方便存儲,容易scalable(擴展)。

  2. 離散化後的特徵對異常數據有很強的魯棒性:好比一個特徵是年齡>30是1,不然0。若是特徵沒有離散化,一個異常數據「年齡300歲」會給模型形成很大的干擾。

  3. 邏輯迴歸屬於廣義線性模型,表達能力受限;單變量離散化爲N個後,每一個變量有單獨的權重,至關於爲模型引入了非線性,可以提高模型表達能力,加大擬合。

  4. 離散化後能夠進行特徵交叉,由M N個變量變爲M*N個變量,進一步引入非線性,提高表達能力。

  5. 特徵離散化後,模型會更穩定,好比若是對用戶年齡離散化,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
複製代碼

3.2.2類別型數據

one-hot編碼

對於類別型數據,最主要的一個處理,就是進行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.]])
複製代碼

3.2.3時間型數據

對於時間型數據來講,便可以把它轉換成連續值,也能夠轉換成離散值。

連續值

好比持續時間(單頁瀏覽時長),間隔時間(上次購買/點擊離如今的時間)

離散值

好比一天中哪一個時間段(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)
複製代碼

3.3特徵降維

在實際項目中,並非維數越高越好,爲何要進行降維操做,主要是出於一下考慮

  1. 特徵維數越高,模型越容易過擬合,此時更復雜的模型就很差用。
  2. 相互獨立的特徵維數越高,在模型不變的狀況下,在測試集上達到相同的效果表現所須要的訓練樣本的數目就越大。
  3. 特徵數量增長帶來的訓練、測試以及存儲的開銷都會增大。
  4. 在某些模型中,例如基於距離計算的模型KMeans,KNN等模型,在進行距離計算時,維度太高會影響精度和性能。5.可視化分析的須要。在低維的狀況下,例如二維,三維,咱們能夠把數據繪製出來,可視化地看到數據。當維度增高時,就難以繪製出來了。
    在機器學習中,有一個很是經典的維度災難的概念。

正是因爲高維特徵有如上描述的各類各樣的問題,因此咱們須要進行特徵降維和特徵選擇等工做。特徵降維經常使用的算法有PCA,LDA等。特徵降維的目標是將高維空間中的數據集映射到低維空間數據,同時儘量少地丟失信息,或者降維後的數據點儘量地容易被區分 關於PCA算法,在以前的文章有介紹 PCA算法分析

3.4 特徵選擇

當數據預處理完成後,咱們須要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。
特徵選擇的目標是尋找最優特徵子集。特徵選擇能剔除不相關(irrelevant)或冗餘(redundant )的特徵,從而達到減小特徵個數,提升模型精確度,減小運行時間的目的。另外一方面,選取出真正相關的特徵簡化模型,協助理解數據產生的過程。

根據特徵選項的形式,能夠將特徵選擇方法分爲三種

  1. Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇閾值的個數,排序留下Top 相關的特徵部分。
  2. Wrapper:包裝法,根據目標函數(一般是預測效果評分),每次選擇若干特徵,或者排除若干特徵。
  3. Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,獲得各個特徵的權值係數,根據係數從大到小選擇特徵。相似於Filter方法,可是是經過訓練來肯定特徵的優劣。

3.4.1 Filter(過濾法)

方差選擇法

使用方差選擇法,先要計算各個特徵的方差,而後根據閾值,選擇方差大於閾值的特徵。

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的樣本頻數的觀察值與指望的差距,構建統計量:

\chi^2 = \sum\frac{(A-E)^2}{E}

用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]])
複製代碼

3.4.2 Wrapper(包裹型)

把特徵選擇看作一個特徵子集搜索問題,篩選各類特 徵子集,用模型評估效果。
典型的包裹型算法爲 「遞歸特徵刪除算 法」

遞歸特徵消除法

遞歸消除特徵法使用一個基模型來進行多輪訓練,每輪訓練後,消除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。
好比用邏輯迴歸,怎麼作這個事情呢?
①  用全量特徵跑一個模型
②  根據線性模型的係數(體現相關性),刪掉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]])
複製代碼

3.4.3 Embedded(嵌入型)

基於懲罰項的特徵選擇法

使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用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計算機視覺工坊,本公衆號不按期推送機器學習,深度學習,計算機視覺等相關文章,歡迎你們和我一塊兒學習,交流。

相關文章
相關標籤/搜索