全網(wǎng)搜集目標檢測相關(guān),人工篩選最優(yōu)價值內(nèi)容 特征工程(Feature Engineering)是將原始數(shù)據(jù)轉(zhuǎn)化成更好的表達問題本質(zhì)的特征的過程,使得將這些特征運用到預測模型中能提高對不可見數(shù)據(jù)的模型預測精度。 作 者 | 正陽@知乎
鏈接 | https://www.zhihu.com/people/sun.zhengyang
一、特征工程介紹(Feature Engineering)
什么是特征工程?特征工程解決了什么問題?為什么特征工程對機器學習很重要?怎么做特征工程?怎么做好特征工程?集眾多博友智慧,一文全面了解并應用特征工程。 1 定義及意義 (1)定義 特征工程(Feature Engineering)特征工程是將原始數(shù)據(jù)轉(zhuǎn)化成更好的表達問題本質(zhì)的特征的過程,使得將這些特征運用到預測模型中能提高對不可見數(shù)據(jù)的模型預測精度。 特征工程簡單講就是發(fā)現(xiàn)對因變量y有明顯影響作用的特征,通常稱自變量x為特征,特征工程的目的是發(fā)現(xiàn)重要特征。 如何能夠分解和聚合原始數(shù)據(jù),以更好的表達問題的本質(zhì)?這是做特征工程的目的?!癴eature engineering is manually designing what the input x’s should be.” “you have to turn your inputs into things the algorithm can understand.” 特征工程是數(shù)據(jù)挖掘模型開發(fā)中最耗時、最重要的一步。 (2)意義 特征工程是一個包含內(nèi)容很多的主題,也被認為是成功應用機器學習的一個很重要的環(huán)節(jié)。如何充分利用數(shù)據(jù)進行預測建模就是特征工程要解決的問題!“實際上,所有機器學習算法的成功取決于如何呈現(xiàn)數(shù)據(jù)?!?“特征工程是一個看起來不值得在任何論文或者書籍中被探討的一個主題。但是他卻對機器學習的成功與否起著至關(guān)重要的作用。機器學習算法很多都是由于建立一個學習器能夠理解的工程化特征而獲得成功的?!薄猄cottLocklin,in “Neglected machine learning ideas” 數(shù)據(jù)中的特征對預測的模型和獲得的結(jié)果有著直接的影響。可以這樣認為,特征選擇和準備越好,獲得的結(jié)果也就越好。這是正確的,但也存在誤導。預測的結(jié)果其實取決于許多相關(guān)的屬性:比如說能獲得的數(shù)據(jù)、準備好的特征以及模型的選擇。
(3)相關(guān)概念
Feature:An attribute useful for your modeling task. Feature Selection:From many features to a few that are useful Feature Extraction:The automatic construction of new features from raw data. Feature Construction:The manual construction of new features from raw data. Feature Importance:An estimate of the usefulness of a feature.
1)特征與屬性的區(qū)別?
并不是所有的屬性都可以看做特征,區(qū)分它們的關(guān)鍵在于看這個屬性對解決這個問題有沒有影響!可以認為特征是對于建模任務有用的屬性。表格式的數(shù)據(jù)是用行來表示一個實例,列來表示屬性和變量。每一個屬性可以是一個特征。特征與屬性的不同之處在于,特征可以表達更多的跟問題上下文有關(guān)的內(nèi)容。特征是一個對于問題建模有意義的屬性。我們使用有意義(有用的)來區(qū)別特征和屬性,認為如果一個特征沒有意義是不會被認為是特征的,如果一個特征對問題沒有影響,那就不是這個問題的一部分。在計算機視覺領(lǐng)域,一幅圖像是一個對象,但是一個特征可能是圖像中的一行;在自然語言處理中每一個文檔或者一條微博是一個對象,一個短語或者單詞的計數(shù)可以作為特征;在語音識別中,一段聲音是一個實例,一個特征可能是單個詞或者發(fā)音。
2)什么是特征重要性?
特征重要性,可以被認為是一個選擇特征重要的評價方法。特征可以被分配一個分值,然后按照這個分值排序,那些具有較高得分的特征可以被選出來包含在訓練集中,同時剩余的就可以被忽略。特征重要性得分可以幫助我們抽取或者構(gòu)建新的特征。挑選那些相似但是不同的特征作為有用的特征。如果一個特征與因變量(被預測的事物)高度相關(guān),那么這個特征可能很重要。相關(guān)系數(shù)和其他單變量的方法(每一個變量被認為是相互獨立的)是比較通用的評估方法。更復雜的方法是通過預測模型算法來對特征進行評分。這些預測模型內(nèi)部有這樣的特征選擇機制,比如MARS,隨機森林,梯度提升機。這些模型也可以得出變量的重要性。
2 流程及方法
特征工程的定義形形色色,筆者同樣對特征工程的全流程有著自己的理解。下面三幅圖是比較常見的特征工程流程,可以參考,便于理解。跟深入了解特征工程,還是需要在廣泛學習的基礎(chǔ)上對其有充分的自我理解。
要實現(xiàn)特征工程目標,要用到什么數(shù)據(jù)?需要結(jié)合特定業(yè)務,具體情況具體分析。重點考慮如下三方面: ①數(shù)據(jù)獲取途徑 - 如何獲取特征(接口調(diào)用or自己清洗or/github資源下載等) - 如何存儲?(/data/csv/txt/array/Dataframe//其他常用分布式) ②數(shù)據(jù)可用性評估 - 獲取難度 - 覆蓋率 - 準確率
三、數(shù)據(jù)描述(Feature Describe)
通過數(shù)據(jù)獲取,我們得到未經(jīng)處理的特征,這時的特征可能有以下問題:- 存在缺失值:缺失值需要補充。- 不屬于同一量綱:即特征的規(guī)格不一樣,不能夠放在一起比較。- 信息冗余:對于某些定量特征,其包含的有效信息為區(qū)間劃分,例如學習成績,假若只關(guān)心“及格”或不“及格”,那么需要將定量的考分,轉(zhuǎn)換成“1”和“0”表示及格和未及格。- 定性特征不能直接使用:某些機器學習算法和模型只能接受定量特征的輸入,那么需要將定性特征轉(zhuǎn)換為定量特征。- 信息利用率低:不同的機器學習算法和模型對數(shù)據(jù)中信息的利用是不同的。 那么最好先對數(shù)據(jù)的整體情況做一個描述、統(tǒng)計、分析,并且可以嘗試相關(guān)的可視化操作。主要可分為以下幾方面:
1 數(shù)據(jù)結(jié)構(gòu) 2 質(zhì)量檢驗 標準性、唯一性、有效性、正確性、一致性、缺失值、異常值、重復值 3 分布情況 統(tǒng)計值
包括max, min, mean, std等。python中用pandas庫序列化數(shù)據(jù)后,可以得到數(shù)據(jù)的統(tǒng)計值。
探索性數(shù)據(jù)分析(EDA,Exploratory Data Analysis) 集中趨勢、離中趨勢、分布形狀
四、特征處理(Feature Processing)
對數(shù)據(jù)的整體性有一個宏觀的了解之后,即需要進入特征工程第一個重要的環(huán)節(jié)——特征處理,特征處理會消耗大量時間,并且直接影響特征選擇的結(jié)果。特征處理主要包括:①數(shù)據(jù)預處理。即數(shù)據(jù)的清洗工作,主要為缺失值、異常值、錯誤值、數(shù)據(jù)格式、采樣度等問題的處理。②特征轉(zhuǎn)換。即連續(xù)變量、離散變量、時間序列等的轉(zhuǎn)換,便于入模。
1 數(shù)據(jù)預處理
【特征工程】python特征預處理大全(https://blog.csdn.net/overfit/article/details/79856417)
(1)缺失值處理
有些特征可能因為無法采樣或者沒有觀測值而缺失.例如距離特征,用戶可能禁止獲取地理位置或者獲取地理位置失敗,此時需要對這些特征做特殊的處理,賦予一個缺失值。我們在進行模型訓練時,不可避免的會遇到類似缺失值的情況,下面整理了幾種填充空值的方法
1)缺失值刪除(dropna) ①刪除實例 ②刪除特征 2)缺失值填充(fillna) ①用固定值填充
對于特征值缺失的一種常見的方法就是可以用固定值來填充,例如0,9999, -9999, 例如下面對灰度分這個特征缺失值全部填充為-99 data['灰度分'] = data['灰度分'].fillna('-99')
②用均值填充
對于數(shù)值型的特征,其缺失值也可以用未缺失數(shù)據(jù)的均值填充,下面對灰度分這個特征缺失值進行均值填充 data['灰度分'] = data['灰度分'].fillna(data['灰度分'].mean()))
③用眾數(shù)填充
與均值類似,可以用未缺失數(shù)據(jù)的眾數(shù)來填充缺失值 data['灰度分'] = data['灰度分'].fillna(data['灰度分'].mode()))
④用上下數(shù)據(jù)進行填充
data['灰度分'] = data['灰度分'].fillna(method='pad')
data['灰度分'] = data['灰度分'].fillna(method='bfill')
⑤用插值法填充
data['灰度分'] = data['灰度分'].interpolate()
⑥用KNN進行填充 from fancyimpute import BiScaler, KNN, NuclearNormMinimization, SoftImpute dataset = KNN(k=3).complete(dataset) ⑦random forest進行填充 from sklearn.ensemble import RandomForestRegressor zero_columns_2 = ['機構(gòu)查詢數(shù)量', '直接聯(lián)系人數(shù)量', '直接聯(lián)系人在黑名單數(shù)量', '間接聯(lián)系人在黑名單數(shù)量', '引起黑名單的直接聯(lián)系人數(shù)量', '引起黑名單的直接聯(lián)系人占比'] #將出現(xiàn)空值的除了預測的列全部取出來,不用于訓練 dataset_list2 = [x for x in dataset if x not in zero_columns_2] dataset_2 = dataset[dataset_list2] # 取出灰度分不為空的全部樣本進行訓練 know = dataset_2[dataset_2['灰度分'].notnull()] print(know.shape) #26417, 54 # 取出灰度分為空的樣本用于填充空值 unknow = dataset_2[dataset_2['灰度分'].isnull()] print(unknow.shape) #2078, 54 y = ['灰度分'] x = [1] know_x2 = know.copy() know_y2 = know.copy() print(know_y2.shape) # know_x2.drop(know_x2.columns[x], axis=1, inplace=True) print(know_y2.shape) print(know_x2.shape) # know_y2 = know[y] # RandomForestRegressor rfr = RandomForestRegressor(random_state=666, n_estimators=2000, n_jobs=-1) rfr.fit(know_x2, know_y2) # 填充為空的樣本 unknow_x2 = unknow.copy() unknow_x2.drop(unknow_x2.columns[x], axis=1, inplace=True) print(unknow_x2.shape) #(2078, 53) unknow_y2 = rfr.predict(unknow_x2) unknow_y2 = pd.DataFrame(unknow_y2, columns=['灰度分']) ⑧使用fancyimpute包中的其他方法 # matrix completion using convex optimization to find low-rank solution # that still matches observed values. Slow! X_filled_nnm = NuclearNormMinimization().complete(X_incomplete) # Instead of solving the nuclear norm objective directly, instead # induce sparsity using singular value thresholding X_filled_softimpute = SoftImpute().complete(X_incomplete_normalized) # print mean squared error for the three imputation methods above nnm_mse = ((X_filled_nnm[missing_mask] - X[missing_mask]) ** 2).mean() # print mean squared error for the three imputation methods above nnm_mse = ((X_filled_nnm[missing_mask] - X[missing_mask]) ** 2).mean() print("Nuclear norm minimization MSE: %f" % nnm_mse) softImpute_mse = ((X_filled_softimpute[missing_mask] - X[missing_mask]) ** 2).mean() print("SoftImpute MSE: %f" % softImpute_mse) knn_mse = ((X_filled_knn[missing_mask] - X[missing_mask]) ** 2).mean() print("knnImpute MSE: %f" % knn_mse) ⑨缺失值作為數(shù)據(jù)的一部分不填充
LightGBM和XGBoost都能將NaN作為數(shù)據(jù)的一部分進行學習,所以不需要處理缺失值。
(2)異常值處理 1)特征異常平滑 基于統(tǒng)計的異常點檢測算法 例如極差,四分位數(shù)間距,均差,標準差等,這種方法適合于挖掘單變量的數(shù)值型數(shù)據(jù)。 基于距離的異常點檢測算法 主要通過距離方法來檢測異常點,將數(shù)據(jù)集中與大多數(shù)點之間距離大于某個閾值的點視為異常點,主要使用的距離度量方法有絕對距離(曼哈頓距離)、歐氏距離和馬氏距離等方法。 基于密度的異常點檢測算法 考察當前點周圍密度,可以發(fā)現(xiàn)局部異常點。 (3)重復值處理
(4)數(shù)據(jù)格式處理 (5)數(shù)據(jù)采樣
多的類別過采樣/少的類別欠采樣來平衡分布欠采樣(undersampling)和過采樣(oversampling)會對模型帶來不一樣的影響。
2 特征轉(zhuǎn)換
特征也就是我們常常說的變量/自變量,一般分為三類:- 連續(xù)型 - 無序類別(離散)型 - 有序類別(離散)型
(1)連續(xù)型特征處理 1)函數(shù)轉(zhuǎn)換
有時我們的模型的假設(shè)條件是要求自變量或因變量服從某特殊分布(如正態(tài)分布),或者說自變量或因變量服從該分布時,模型的表現(xiàn)較好。這個時候我們就需要對特征或因變量進行非線性函數(shù)轉(zhuǎn)換。這個方法操作起來很簡單,但記得對新加入的特征做歸一化。對于特征的轉(zhuǎn)換,需要將轉(zhuǎn)換之后的特征和原特征一起加入訓練模型進行訓練。
2)特征縮放
某些特征比其他 特征具有較大的跨度值。舉個例子,將一個人的收入和他的年齡進行比較,更具體的例子,如某些模型(像嶺回歸)要求你必須將特征值縮放到相同的范圍值內(nèi)。通過縮放可以避免某些特征比其他特征獲得大小非常懸殊的權(quán)重值。
3)無量綱化
無量綱化使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格。常見的無量綱化方法有標準化、歸一化、區(qū)間縮放法。標準化的前提是特征值服從正態(tài)分布,標準化后,其轉(zhuǎn)換成標準正態(tài)分布。區(qū)間縮放法利用了邊界值信息,將特征的取值區(qū)間縮放到某個特點的范圍,例如[0, 1]等。把數(shù)據(jù)放縮到同樣的范圍 SVM/NN影響很大 樹模型影響小。不是什么時候都需要標準化,比如物理意義非常明確的經(jīng)緯度,如果標準化,其本身的意義就會丟失。
①標準化 · 均值方差法 · z-score標準化 · StandardScaler標準化
標準化是依照特征矩陣的列處理數(shù)據(jù),其通過求z-score的方法,將樣本的特征值轉(zhuǎn)換到同一量綱下。標準化需要計算特征的均值和標準差,公式表達為: 使用preproccessing庫的StandardScaler類對數(shù)據(jù)進行標準化的代碼如下:
from sklearn.preprocessing import StandardScaler #標準化,返回值為標準化后的數(shù)據(jù) StandardScaler().fit_transform(iris.data) ②歸一化 · 最大最小歸一化(最常用) · 對數(shù)函數(shù)轉(zhuǎn)換(log) · 反余切轉(zhuǎn)換
歸一化是依照特征矩陣的行處理數(shù)據(jù),其目的在于樣本向量在點乘運算或其他核函數(shù)計算相似性時,擁有統(tǒng)一的標準,也就是說都轉(zhuǎn)化為“單位向量”。規(guī)則為l2的歸一化公式如下: 使用preproccessing庫的Normalizer類對數(shù)據(jù)進行歸一化的代碼如下:
from sklearn.preprocessing import Normalizer #歸一化,返回值為歸一化后的數(shù)據(jù) Normalizer().fit_transform(iris.data) ③區(qū)間縮放法
區(qū)間縮放法的思路有多種,常見的一種為利用兩個最值進行縮放,公式表達為: 使用preproccessing庫的MinMaxScaler類對數(shù)據(jù)進行區(qū)間縮放的代碼如下: from sklearn.preprocessing import MinMaxScaler #區(qū)間縮放,返回值為縮放到[0, 1]區(qū)間的數(shù)據(jù) MinMaxScaler().fit_transform(iris.data) 壓縮范圍 有些分類變量的少部分取值可能占據(jù)了90%的case,這種情況下可以采用預測模型、領(lǐng)域?qū)<?、或者簡單的頻率分布統(tǒng)計。具體問題具體分析,高頻和低頻都是需要特別處理的地方,拋棄效果不好時,可以考慮采樣(高頻)或上采樣(低頻),加權(quán)等等方法。
4)二值化(定量特征)
特征的二值化處理是將數(shù)值型數(shù)據(jù)輸出為布爾類型。其核心在于設(shè)定一個閾值,當樣本書籍大于該閾值時,輸出為1,小于等于該閾值時輸出為0。我們通常使用preproccessing庫的Binarizer類對數(shù)據(jù)進行二值化處理。定量特征二值化的核心在于設(shè)定一個閾值,大于閾值的賦值為1,小于等于閾值的賦值為0,公式表達如下: 使用preproccessing庫的Binarizer類對數(shù)據(jù)進行二值化的代碼如下:
from sklearn.preprocessing import Binarizer #二值化,閾值設(shè)置為3,返回值為二值化后的數(shù)據(jù) Binarizer(threshold=3).fit_transform(iris.data) 5)離散化分箱處理(數(shù)值型轉(zhuǎn)類別型)
有時候,將數(shù)值型屬性轉(zhuǎn)換成類別型更有意義,同時將一定范圍內(nèi)的數(shù)值劃分成確定的塊,使算法減少噪聲的干擾。在實際應用中,當你不想讓你的模型總是嘗試區(qū)分值之間是否太近時,分區(qū)能夠避免過擬合。例如,如果你所感興趣的是將一個城市作為整體,這時你可以將所有落入該城市的維度值進行整合成一個整體。分箱也能減小錯誤的影響,通過將一個給定值劃入到最近的塊中。對于一些特殊的模型(信用評分卡)開發(fā),有時候我們需要對連續(xù)型的特征(年齡、收入)進行離散化。常用的離散化方法包括等值劃分和等量劃分。例如某個特征的取值范圍為[0,10],我們可以將其劃分為10段,[0,1),[1,2),?,[9,10) - 離散特征的增加和減少都很容易,易于模型的快速迭代;- 稀疏向量內(nèi)積乘法運算速度快,計算結(jié)果方便存儲,容易擴展;- 離散化后的特征對異常數(shù)據(jù)有很強的魯棒性模型也會更穩(wěn)定;- 離散化后可以進行特征交叉,由M+N個變量變?yōu)镸*N個變量,進一步引入非線性 提 升表達能力;- 特征離散化以后,起到了簡化了邏輯回歸模型的作用,降低了模型過擬合的風險 離散化方法的關(guān)鍵是怎么確定分段中的離散點,下面介紹幾種常用的離散化方法:- 等距離離散(等距分組) 顧名思義,就是離散點選取等距點。- 等樣本點離散(等深分組) 選取的離散點保證落在每段里的樣本點數(shù)量大致相同 - 決策樹離散化(最優(yōu)分組) 決策樹離散化方法通常也是每次離散化一個連續(xù)特征,原理如下:單獨用此特征和目標值y訓練一個決策樹模型,然后把訓練獲得的模型內(nèi)的特征分割點作為離散化的離散點。- 其他離散化方法 其中,最優(yōu)分組除決策樹方法以外,還可以使用卡方分箱的方法,這種方法在評分卡開發(fā)中比較常見。
6)不處理
除了歸一化(去中心,方差歸一),不用做太多特殊處理,可以直接把連續(xù)特征扔到模型里使用。根據(jù)模型類型而定。
(2)離散型特征處理 1)數(shù)值化處理
二分類問題:能夠?qū)㈩悇e屬性轉(zhuǎn)換成一個標量,最有效的場景應該就是二分類的情況。即{0,1}對應{類別1,類別2}。這種情況下,并不需要排序,并且你可以將屬性的值理解成屬于類別1或類別2的概率。多分類問題:選取多分類,編碼到[0,classnum)。類別不平衡問題:樣本層面可以采用oversampling/undersampling. 算法層面可以采用代價敏感方法/樣本設(shè)置權(quán)重 也不是所有的無序變量都需要做數(shù)值化處理,決策樹、隨機森林等樹模型可能不需要處理,視情況而定。 例:label encoder 一個變量的k個值,按序轉(zhuǎn)換成k個數(shù)字(1,2,3…k)。例如一個人的狀態(tài)status有三種取值:bad, normal, good,顯然bad < normal < good。這個時候bad, normal, good就可以分別轉(zhuǎn)換成 1、2、3。該方法局限性較大:- 不適用于建立預測具體數(shù)值的模型,比如線性回歸,只能用于分類, - 即使用于分類,也有一些模型不適合, - 可能結(jié)果的精度不如one-hot編碼。
2)啞編碼 ①獨熱編碼(one-hot)
例:再次舉一個簡單的例子,由{紅,綠、藍}組成的顏色屬性,最常用的方式是把每個類別屬性轉(zhuǎn)換成二元屬性,即從{0,1}取一個值。因此基本上增加的屬性等于相應數(shù)目的類別。對于數(shù)據(jù)集中的每個實例,只有一個是1(其他的為0),這也就是獨熱(one-hot)編碼方式(類似于轉(zhuǎn)換成啞變量)。如果你不了解這個編碼的話,你可能會覺得分解會增加沒必要的麻煩(因為編碼大量的增加了數(shù)據(jù)集的維度)。相反,你可能會嘗試將類別屬性轉(zhuǎn)換成一個標量值,例如顏色屬性可能會用{1,2,3}表示{紅,綠,藍}。這里存在兩個問題,首先,對于一個數(shù)學模型,這意味著某種意義上紅色和綠色比和藍色更“相似”(因為|1-3| > |1-2|)。除非你的類別擁有排序的屬性(比如鐵路線上的站),這樣可能會誤導你的模型。然后,可能會導致統(tǒng)計指標(比如均值)無意義,更糟糕的情況是,會誤導你的模型。還是顏色的例子,假如你的數(shù)據(jù)集包含相同數(shù)量的紅色和藍色的實例,但是沒有綠色的,那么顏色的均值可能還是得到2,也就是綠色的意思。 啞編碼主要是采用N位狀態(tài)寄存器來對N個狀態(tài)進行編碼,一個變量N個值就轉(zhuǎn)換成N個虛擬變量,每個狀態(tài)都由他獨立的寄存器位,并且在任意時候只有一位有效。使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對 應歐式空間的某個點。在回歸,分類,聚類等機器等學習算法中,特征之間距離的計算或相似度的計算是 非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算 余弦相似性,基于的就是歐式空間。 優(yōu)點:簡單,且保證無共線性。將離散型特征使用one-hot編碼,確實會讓特征之間的距離計算更加合理。對離散型特征進行one-hot編碼可以加快計算速度。缺點:太?。ㄏ∈杈仃嚕?避免產(chǎn)生稀疏矩陣的常見方法是降維,將變量值較多的分類維度,盡可能降到最少,能降則降,不能降的,別勉強。
②順序性啞變量
與one-hot編碼一樣,都是將一個變量的k個值生成k個啞變量,但同時保護了特征的順序關(guān)系。一般的表達方式如下: (上面這種表達方式很巧妙地利用遞進表達了值之間的順序關(guān)系。)
(3)時間序列處理 1)時間戳處理
時間戳屬性通常需要分離成多個維度比如年、月、日、小時、分鐘、秒鐘。但是在很多的應用中,大量的信息是不需要的。比如在一個監(jiān)督系統(tǒng)中,嘗試利用一個’位置+時間‘的函數(shù)預測一個城市的交通故障程度,這個實例中,大部分會受到誤導只通過不同的秒數(shù)去學習趨勢,其實是不合理的。并且維度’年’也不能很好的給模型增加值的變化,我們可能僅僅需要小時、日、月等維度。因此在呈現(xiàn)時間的時候,試著保證你所提供的所有數(shù)據(jù)是你的模型所需要的。并且別忘了時區(qū),假如你的數(shù)據(jù)源來自不同的地理數(shù)據(jù)源,別忘了利用時區(qū)將數(shù)據(jù)標準化。
五、特征選擇(Feature Selection)
1 特征檢驗 (1)單變量 1)正態(tài)性檢驗 2)顯著性分析 (2)多變量 1)一致性檢驗 2)多重共線性 2 特征選擇 (1)定義
從大量的特征中選擇少量的有用特征。不是所有的特征都是平等的。那些與問題不相關(guān)的屬性需要被刪除;還有一些特征可以比其他特征更重要;也有的特征跟其他的特征是冗余的。特征選擇就是自動地選擇對于問題最重要的特征的一個子集。
(2)作用 (3)方法
判斷特征是否發(fā)散:如果一個特征不發(fā)散,就是說這個特征大家都有或者非常相似,說明這個特征不需要。判斷特征和目標是否相關(guān):與目標的相關(guān)性越高,越應該優(yōu)先選擇。按照特征評價標準分類:選擇使分類器的錯誤概率最小的特征或者特征組合。利用距離來度量樣本之間相似度。利用具有最小不確定性(Shannon熵、Renyi熵和條件熵)的那些特征來分類。利用相關(guān)系數(shù), 找出特征和類之間存在的相互關(guān)系;利用特征之間的依賴關(guān)系, 來表示特征的冗余性加以去除。- 特征選擇算法可以利用得分排序的方法選擇特征,如相關(guān)性和其他特征重要性手段;- 更高級的方法通過試錯來搜索特征子集。這些方法通過建立模型,評價模型,然后自動的獲得對于目標最具預測能力的特征子集。- 還有一些算法能得到特征選擇的副產(chǎn)品。比如說逐步回歸就是能夠自動的選擇特征來構(gòu)建模型。- 正則化的方法比如lasso和嶺回歸可以作為特征選擇的算法。他們在構(gòu)建模型的過程中刪去或者減小不重要特征的貢獻。(An Introduction to feature selection) 根據(jù)特征選擇的形式可以將特征選擇方法分為3種:- Filter:過濾法,按照發(fā)散性或者相關(guān)性對各個特征進行評分,設(shè)定閾值或者待選擇閾值的個數(shù),選擇特征。- Wrapper:包裝法,根據(jù)目標函數(shù)(通常是預測效果評分),每次選擇若干特征,或者排除若干特征。- Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特征的權(quán)值系數(shù),根據(jù)系數(shù)從大到小選擇特征。類似于Filter方法,但是是通過訓練來確定特征的優(yōu)劣。
1)過濾式(Filter)
過濾式特征選擇的評價標準從數(shù)據(jù)集本身的內(nèi)在性質(zhì)獲得,與特定的學習算法無關(guān),因此具有較好的通用性。通常選擇和類別相關(guān)度大的特征或者特征子集。過濾式特征選擇的研究者認為,相關(guān)度較大的特征或者特征子集會在分類器上獲得較高的準確率。過濾式特征選擇的評價標準分為四種,即距離度量、信息度量、關(guān)聯(lián)度度量以及一致性度量。優(yōu)點:算法的通用性強;省去了分類器的訓練步驟,算法復雜性低,因而適用于大規(guī)模數(shù)據(jù)集;可以快速去除大量不相關(guān)的特征,作為特征的預篩選器非常合適。缺點:由于算法的評價標準獨立于特定的學習算法,所選的特征子集在分類準確率方面通常低于Wrapper方法。
①方差選擇法
使用方差選擇法,先要計算各個特征的方差,選擇方差大于閾值的特征 (Analysis of Variance:ANOVA,方差分析,通過分析研究不同來源的變異對總變異的貢獻大小,從而確定可控因素對研究結(jié)果影響力的大小)。
from sklearn.feature_selection import VarianceThreshold #方差選擇法,返回值為特征選擇后的數(shù)據(jù) #參數(shù)threshold為方差的閾值 VarianceThreshold(threshold=3).fit_transform(iris.data)
②相關(guān)系數(shù)法
使用相關(guān)系數(shù)法,先要計算各個特征對目標值的相關(guān)系數(shù)以及相關(guān)系數(shù)的P值。用feature_selection庫的SelectKBest類結(jié)合相關(guān)系數(shù)來選擇特征的代碼如下: from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr #選擇K個最好的特征,返回選擇特征后的數(shù)據(jù) #第一個參數(shù)為計算評估特征是否好的函數(shù),該函數(shù)輸入特征矩陣和目標向量,輸出二元組(評分,P值)的數(shù)組,數(shù)組第i項為第i個特征的評分和P值。在此定義為計算相關(guān)系數(shù) #參數(shù)k為選擇的特征個數(shù) SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target) 皮爾遜系數(shù)只能衡量線性相關(guān)性而互信息系數(shù)能夠很好地度量各種相關(guān)性,但是計算相對復雜一些,好在很多toolkit里邊都包含了這個工具(如sklearn的MINE),得到相關(guān)性之后就可以排序選擇特征了 (皮爾遜相關(guān)系數(shù),更多反應兩個服從正態(tài)分布的隨機變量的相關(guān)性,取值范圍在 [-1,+1] 之間。)
③互信息法
計算各個特征的信息增益 Linear Discriminant Analysis(LDA,線性判別分析):更 像一種特征抽取方式,基本思想是將高維的特征影到最佳鑒別矢量空間,這樣就可以抽取分類信息和達到壓縮特征空間維數(shù)的效果。投影后的樣本在子空間有最大可分離性。經(jīng)典的互信息也是評價定性自變量對定性因變量的相關(guān)性的,互信息計算公式如下: 為了處理定量數(shù)據(jù),最大信息系數(shù)法被提出,使用feature_selection庫的SelectKBest類結(jié)合最大信息系數(shù)法來選擇特征的代碼如下: from sklearn.feature_selection import SelectKBest from minepy import MINE #由于MINE的設(shè)計不是函數(shù)式的,定義mic方法將其為函數(shù)式的,返回一個二元組,二元組的第2項設(shè)置成固定的P值0.5 def mic(x, y): m = MINE() m.compute_score(x, y) return (m.mic(), 0.5) #選擇K個最好的特征,返回特征選擇后的數(shù)據(jù) SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
④卡方檢驗(Chi-Square)
就是統(tǒng)計樣本的實際觀測值與理論推斷值之間的偏離程度,實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趨于符合。優(yōu)點:快速, 只需要基礎(chǔ)統(tǒng)計知識。缺點:特征之間的組合效應難以挖掘。經(jīng)典的卡方檢驗是檢驗定性自變量對定性因變量的相關(guān)性。假設(shè)自變量有N種取值,因變量有M種取值,考慮自變量等于i且因變量等于j的樣本頻數(shù)的觀察值與期望的差距,構(gòu)建統(tǒng)計量: 這個統(tǒng)計量的含義簡而言之就是自變量對因變量的相關(guān)性。用feature_selection庫的SelectKBest類結(jié)合卡方檢驗來選擇特征的代碼如下: from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 #選擇K個最好的特征,返回選擇特征后的數(shù)據(jù) SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target) 特點:執(zhí)行時間短(+):一般不會在數(shù)據(jù)集上進行迭代計算,且是分類器無關(guān)的,相比于訓練分類器要快。一般性(+):評價數(shù)據(jù)中屬性的本身的性質(zhì),而不是屬性與特定分類器的關(guān)聯(lián)關(guān)系(適合程度),所以得到的結(jié)果更具有一般性,而且對于很多分類器都能表現(xiàn)“良好”。選擇大規(guī)模子集(-):傾向于選擇全部最優(yōu)的特征子集,導致決定停止的條件決定權(quán)交給了用戶,具有較強的主觀性
2)封裝式(Wrapper)
Wrapper:封裝式特征選擇是利用學習算法的性能評價特征子集的優(yōu)劣。因此,對于一個待評價的特征子集,Wrapper方法需要訓練一個分類器,根據(jù)分類器的性能對該特征子集進行評價。Wrapper方法中用以評價特征的學習算法是多種多樣的,例如決策樹、神經(jīng)網(wǎng)絡、貝葉斯分類器、近鄰法、支持向量機等等。優(yōu)點:相對于Filter方法,Wrapper方法找到的特征子集分類性能通常更好。缺點:Wrapper方法選出的特征通用性不強,當改變學習算法時,需要針對該學習算法重新進行特征選擇;由于每次對子集的評價都要進行分類器的訓練和測試,所以算法計算復雜度很高,尤其對于大規(guī)模數(shù)據(jù)集來說,算法的執(zhí)行時間很長。
①完全搜索[窮舉] · 遞歸特征消除法
遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進行下一輪訓練。使用feature_selection庫的RFE類來選擇特征的代碼如下:
· 遞歸特征消除法遞歸消除法
使用基模型(如LR)在訓練中進行迭代,選擇不同 特征 構(gòu)建單個特征的模型,通過模型的準確性為特征排序,借此來選擇特征
②啟發(fā)式搜索[貪心] · 前向選擇法
從0開始不斷向模型加能最大限度提升模型效果的特征數(shù)據(jù)用以訓練,直到任何訓練數(shù)據(jù)都無法提升模型表現(xiàn)。
· 后向剃除法
先用所有特征數(shù)據(jù)進行建模,再逐一丟棄貢獻最低的特征來提升模型效果,直到模型效果收斂。優(yōu)點:直接面向算法優(yōu)化, 不需要太多知識。缺點:龐大的搜索空間, 需要定義啟發(fā)式策略。 from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression #遞歸特征消除法,返回特征選擇后的數(shù)據(jù) #參數(shù)estimator為基模型 #參數(shù)n_features_to_select為選擇的特征個數(shù) RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
③隨機搜索[策略+好運氣]
Wrapper特點:準確性(+):由于特征子集是針對特定的分類器調(diào)準,能獲得較好的識別率。泛化能力(+):有很多機制可以防止過擬合,例如在分類器中可以使用交叉驗證等技術(shù)。執(zhí)行速度(-):對于每個候選的特征子集,必須重新訓練一個分類器甚至多個分類器(交叉驗證),所以對于計算密集型非常不適合。一般性(-):由于此種方法對分類器敏感,而不同的分類器具有不同原理的評價函數(shù)(損失函數(shù)),只能說最終選擇特征子集是對當前分類器“最好”的。
3)嵌入式(Embedded)
在嵌入式特征選擇中,特征選擇算法本身作為組成部分嵌入到學習算法里。最典型的即決策樹算法,如ID3、C4.5以及CART算法等,決策樹算法在樹增長過程的每個遞歸步都必須選擇一個特征,將樣本集劃分成較小的子集,選擇特征的依據(jù)通常是劃分后子節(jié)點的純度,劃分后子節(jié)點越純,則說明劃分效果越好,可見決策樹生成的過程也就是特征選擇的過程。嵌入法Embedded(效果最好速度最快,模式單調(diào),快速并且效果明顯, 但是如何參數(shù)設(shè)置, 需要深厚的背景知識。) 在模型既定的條件下,尋找最優(yōu)特征子集 - 正則化項( L1、L2 ) - LASSO回歸 - 嶺回歸(RidgeRegression) - 決策樹 - ID3、C4.5、CART - 深度學習
①基于懲罰項
使用帶懲罰項的基模型,除了篩選出特征外,同時也進行了降維。使用帶懲罰項的基模型進行特征選擇 比如LR加入正則。通過L1正則項來選擇特征:L1正則方法具有稀疏解的特性,因此天然具備特征選擇的特性,但是要注意,L1沒有選到的特征不代表不重要,原因是兩個具有高相關(guān)性的特征可能只保留了一個,如果要確定哪個特征重要應再通過L2正則方法交叉檢驗 使用feature_selection庫的SelectFromModel類結(jié)合帶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)
L1懲罰項降維的原理在于保留多個對目標值具有同等相關(guān)性的特征中的一個,所以沒選到的特征不代表不重要。故,可結(jié)合L2懲罰項來優(yōu)化。具體操作為:若一個特征在L1中的權(quán)值為1,選擇在L2中權(quán)值差別不大且在L1中權(quán)值為0的特征構(gòu)成同類集合,將這一集合中的特征平分L1中的權(quán)值,故需要構(gòu)建一個新的邏輯回歸模型: from sklearn.linear_model import LogisticRegression class LR(LogisticRegression): def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1): #權(quán)值相近的閾值 self.threshold = threshold LogisticRegression.__init__(self, penalty='l1', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs) #使用同樣的參數(shù)創(chuàng)建L2邏輯回歸 self.l2 = LogisticRegression(penalty='l2', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs) def fit(self, X, y, sample_weight=None): #訓練L1邏輯回歸 super(LR, self).fit(X, y, sample_weight=sample_weight) self.coef_old_ = self.coef_.copy() #訓練L2邏輯回歸 self.l2.fit(X, y, sample_weight=sample_weight) cntOfRow, cntOfCol = self.coef_.shape #權(quán)值系數(shù)矩陣的行數(shù)對應目標值的種類數(shù)目 for i in range(cntOfRow): for j in range(cntOfCol): coef = self.coef_[i][j] #L1邏輯回歸的權(quán)值系數(shù)不為0 if coef != 0: idx = [j] #對應在L2邏輯回歸中的權(quán)值系數(shù) coef1 = self.l2.coef_[i][j] for k in range(cntOfCol): coef2 = self.l2.coef_[i][k] #在L2邏輯回歸中,權(quán)值系數(shù)之差小于設(shè)定的閾值,且在L1中對應的權(quán)值為0 if abs(coef1-coef2) < self.threshold and j != k and self.coef_[i][k] == 0: idx.append(k) #計算這一類特征的權(quán)值系數(shù)均值 mean = coef / len(idx) self.coef_[i][idx] = mean return self
使用feature_selection庫的SelectFromModel類結(jié)合帶L1以及L2懲罰項的邏輯回歸模型,來選擇特征的代碼如下: from sklearn.feature_selection import SelectFromModelSelectFromModel(LR(threshold=0.5 , C=0.1 )).fit_transform(iris.data, iris.target)
②基于樹模型
基于樹模型的特征選擇法 樹模型中GBDT也可用來作為基模型進行特征選擇,使用feature_selection庫的SelectFromModel類結(jié)合GBDT模型,來選擇特征的代碼如下:訓練能夠?qū)μ卣鞔蚍值念A選模型:RandomForest和Logistic Regression等都能對模型的特征打分,通過打分獲得相關(guān)性后再訓練最終模型;- Lasso - Elastic Net - Ridge Regression 優(yōu)點:快速, 并且面向算法。缺點:需要調(diào)整結(jié)構(gòu)和參數(shù)配置, 而這需要深入的知識和經(jīng)驗。 from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import GradientBoostingClassifier #GBDT作為基模型的特征選擇 SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
③深度學習
目前這種手段正在隨著深度學習的流行而成為一種手段,尤其是在計算機視覺領(lǐng)域,原因是深度學習具有自動學習特征的能力,這也是深度學習又叫unsupervised feature learning的原因。從深度學習模型中選擇某一神經(jīng)層的特征后就可以用來進行最終目標模型的訓練了。在特征學習中,K-means算法可以將一些沒有標簽的輸入數(shù)據(jù)進行聚類,然后使用每個類別的質(zhì)心來生成新的特征。
3 特征構(gòu)造 (1)定義
從原始數(shù)據(jù)中構(gòu)造新特征 在機器學習或者統(tǒng)計學中,又稱為變量選擇、屬性選擇或者變量子集選擇,是在模型構(gòu)建中,選擇相關(guān)特征并構(gòu)成特征子集的過程。根據(jù)已有特征生成新特征,增加特征的非線性。常見的數(shù)據(jù)變換有基于多項式的、基于指數(shù)函數(shù)的、基于對數(shù)函數(shù)的。特征工程中引入的新特征,需要驗證它確實能提高預測得準確度,而不是加入一個無用的特征增加算法運算的復雜度。特征重要性和特征選擇可以告訴你特征的效用。你需要構(gòu)造新的特征出來。這要求你在樣本數(shù)據(jù)上花費大量的時間并且思考問題的本質(zhì),數(shù)據(jù)的結(jié)構(gòu),以及怎么最好的在預測模型中利用他們。
(2)作用
對于表格型數(shù)據(jù),通常對特征進行混合聚集,組合或者分解分割來創(chuàng)造新的特征;對于文本數(shù)據(jù)通常需要設(shè)計特定的與問題相關(guān)的文檔指標;對于圖像數(shù)據(jù)通常需要花費大量時間指示過濾器發(fā)現(xiàn)相關(guān)的特征。這部分就是人們通常認為的特征工程最具藝術(shù)性的部分。這是一個漫長的部分,需要耗費大量的腦力和時間,并可以產(chǎn)生巨大的不同。
(3)方法 1)簡單構(gòu)造 ①四則運算
比如原來的特征是x1和x2,那么x1+x2就是一個新的特征,或者當x1大于某個數(shù)c的時候,就產(chǎn)生一個新的變量x3,并且x3=1,當x1小于c的時候,x3=0,所以這樣看來呢,可以按照這種方法構(gòu)造出很多特征,這個就是構(gòu)造。
②特征交叉(組合分類特征)
交叉特征算是特征工程中非常重要的方法之一了,它是將兩個或更多的類別屬性組合成一個。當組合的特征要比單個特征更好時,這是一項非常有用的技術(shù)。數(shù)學上來說,是對類別特征的所有可能值進行交叉相乘。假如擁有一個特征A,A有兩個可能值{A1,A2}。擁有一個特征B,存在{B1,B2}等可能值。然后,A&B之間的交叉特征如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)},并且你可以給這些組合特征取任何名字,但是需要明白每個組合特征其實代表著A和B各自信息協(xié)同作用。一個更好地詮釋好的交叉特征的實例是類似于(經(jīng)度,緯度)。一個相同的經(jīng)度對應了地圖上很多的地方,緯度也是一樣。但是一旦你將經(jīng)度和緯度組合到一起,它們就代表了地理上特定的一塊區(qū)域,區(qū)域中每一部分是擁有著類似的特性。
③分解類別特征
對于一個特征item_color有‘red’、‘green’、‘unknown’三個取值,那么可以創(chuàng)造一些新的特征例如:- 二值特征has_color:1知道具體顏色,0表示不知道。這個可以替換item_color特征用到更簡單的線性模型中。- 三個二值特征is_red、is_green和is_unknown。這個可以添加到原有特征中用到?jīng)Q策樹模型中。
④重構(gòu)數(shù)值量
單位轉(zhuǎn)換 整數(shù)部分與小數(shù)部分分離 構(gòu)造范圍二值特征 構(gòu)造階段性的統(tǒng)計特征 構(gòu)造其他二值特征
⑤分解Datatime ⑥窗口變量統(tǒng)計 2)機器學習 ①監(jiān)督式學習 ②非監(jiān)督式學習 4 特征提取 (1)定義
可能由于特征矩陣過大,一些樣本如果直接使用預測模型算法可能在原始數(shù)據(jù)中有太多的列被建模,導致計算量大,訓練時間長的問題,因此降低特征矩陣維度也是必不可少的。特征提取是一個自動化的降維過程。使得特征太多的樣本被建模的維數(shù)降低。
(2)作用
最大限度地降低數(shù)據(jù)的維度的前提下能夠同時保證保留目標的重要的信息,特征提取涉及到從原始屬性中自動生成一些新的特征集的一系列算法,降維算法就屬于這一類。特征提取是一個自動將觀測值降維到一個足夠建模的小數(shù)據(jù)集的過程。 數(shù)據(jù)降維有以下幾點好處:1、避免維度災難,導致算法失效,或者時間復雜度高 2、避免高維數(shù)據(jù)中引入的噪聲,防止過擬合 3、壓縮存儲,可視化分析
(3)方法
對于列表數(shù)據(jù),可使用的方法包括一些投影方法,像主成分分析和無監(jiān)督聚類算法。對于圖形數(shù)據(jù),可能包括一些直線檢測和邊緣檢測,對于不同領(lǐng)域有各自的方法。特征提取的關(guān)鍵點在于這些方法是自動的(只需要從簡單方法中設(shè)計和構(gòu)建得到),還能夠解決不受控制的高維數(shù)據(jù)的問題。大部分的情況下,是將這些不同類型數(shù)據(jù)(如圖,語言,視頻等)存成數(shù)字格式來進行模擬觀察。 不同的數(shù)據(jù)降維方法除了實現(xiàn)降維目標的作用,同時具有各自的特點,比如主成分分析,降維后的各個特征在坐標上是正交;非負矩陣分解,因為在一些文本,圖像領(lǐng)域數(shù)據(jù)要求非負性,非負矩陣分解在降維的同時保證降維后的數(shù)據(jù)均非負;字典學習,可以基于任意基向量表示,特征之間不再是獨立,或者非負;局部線性嵌入,是一種典型的流型學習方法,具有在一定鄰域保證樣本之間的距離不變性。
1)線性降維
常見的降維方法除了基于L1懲罰項的模型以外,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析本身也是一個分類模型。PCA和LDA有很多的相似點,其本質(zhì)是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標不一樣:PCA是為了讓映射后的樣本具有最大的發(fā)散性;而LDA是為了讓映射后的樣本有最好的分類性能。所以說PCA是一種無監(jiān)督的降維方法,而LDA是一種有監(jiān)督的降維方法。
①主成分分析法(PCA)
主成分分析 主成分分析算法(PCA)利用主成分分析方法,實現(xiàn)降維和降噪的功能。目前支持稠密數(shù)據(jù)格式。 選擇方差最大的K個特征[無監(jiān)督] 使用decomposition庫的PCA類選擇特征的代碼如下:
from sklearn.decomposition import PCA #主成分分析法,返回降維后的數(shù)據(jù) #參數(shù)n_components為主成分數(shù)目 PCA(n_components=2).fit_transform(iris.data)
【特征工程】PCA原理(https://en.wikipedia.org/wiki/Principal_component_analysis?spm=a2c63.p38356.a3.15.5e352c87Nd0eJc)
②線性判別分析法(LDA)
選擇分類性能最好的特征[有監(jiān)督] 使用lda庫的LDA類選擇特征的代碼如下: from sklearn.lda import LDA LDA(n_components=2 ).fit_transform(iris.data, iris.target)
③局部線性嵌入/LLE
④拉普拉斯特征映射/LE
⑤隨機鄰域嵌入/SNE
⑥t-分布鄰域嵌入/T-SNE
2)非線性降維 ①核主成分分析(KPCA):帶核函數(shù)的PCA
局部線性嵌入(LLE):利用流形結(jié)構(gòu)進行降維 還有拉普拉斯圖、MDS等
3)遷移學習降維 ①遷移成分分析(TCA):不同領(lǐng)域之間遷移學習降維
1 作用
模型評估一般有兩個目的:1. 檢驗特征工程的工作,查看所選擇的特征是否有利于提升模型的性能。2. 檢查參數(shù)調(diào)整的工作,通過調(diào)整模型參數(shù),找到最佳參數(shù)使得模型的分類、預測性能最佳。 特征工程需要在機器學習的應用中加深理解一個完整的特征工程、機器學習的處理過程是:應用機器學習的過程包含許多步驟。從問題的定義,到數(shù)據(jù)的選擇和準備,以及模型的準備,模型的評價和調(diào)參,最后是結(jié)果的表達。這個過程中與我們的話題相關(guān)的部分可以用下面幾步描述:1.選擇數(shù)據(jù):整合數(shù)據(jù),規(guī)范化到數(shù)據(jù)集中,集中數(shù)據(jù) 2.預處理數(shù)據(jù):格式化,清理,采樣 3.轉(zhuǎn)換數(shù)據(jù):特征工程要做的事情 4.建模數(shù)據(jù):建立模型,評價模型,調(diào)整模型 我們看到緊隨著特征工程就是建模。這表明,我們做特征工程需要與模型,表現(xiàn)度量相結(jié)合。同時也表明,我們需要留下那些適合建模的數(shù)據(jù)。比如說在最后一步規(guī)范化和標準化數(shù)據(jù)。這看起來是一個預處理的步驟,但實際上他幫助我們意識到對于一個有效模型需要什么樣的最終形態(tài)。 特征工程的迭代過程:知道特征工程的地位,我們就明確特征工程不是一個孤立的過程。特征工程是一個根據(jù)模型評價一次又一次的迭代過程。這個過程主要包括以下幾個步驟:1、頭腦風暴:深入了解問題,觀察數(shù)據(jù),研究特征工程和其他相關(guān)問題。2、設(shè)計特征:這個依賴于具體的問題,但是你可能使用自動化的特征提取方式,或者人工構(gòu)造,或者二者結(jié)合。3、選擇特征:使用不同的特征重要性評價指標以及不同的特征選擇方法。4、評價模型:在未知數(shù)據(jù)集上測試模型性能 認真考慮并且設(shè)計在未知數(shù)據(jù)集上的測試方式。這是對特征工程過程最好的評價方式。
2 回歸預測問題
對于連續(xù)型目標變量的回歸預測問題,評估模型的方法一般有:R^2值 R^2越大,模型的預測效果越好。(后續(xù)補充)
3 分類預測問題
對于離散型目標變量的分類預測問題,評估模型的方法一般有:交叉檢驗 觀察模型的預測準確率,越大越好。但注意使用決策樹或隨機森林時的過擬合問題。AUC、ROC 觀察模型的ROC曲線及AUC值,越大越好
特征工程做的好,后期的模型調(diào)參更容易甚至不用調(diào)參,模型的穩(wěn)定性,可解釋性也要更好。如果特征工程做得不好,模型評估怎么調(diào)參都調(diào)不到理想的效果,那么就需要大量消耗時間繼續(xù)重復處理、篩選特征,直到模型達到理想的效果。所以,特征工程是一件極其繁瑣同時也極其重要的一件事情,至少暫用建模80%以上的時間,所以 需要以提升模型的性能和可解釋性為目標,有耐心地、邏輯清晰地去做。加油!
雙一流大學研究生團隊創(chuàng)建,專注于目標檢測與深度學習,希望可以將分享變成一種習慣! 整理不易,點贊 三連↓