前言:特征工程是機器學(xué)習(xí)的重點,他直接影響著模型的好壞。
數(shù)據(jù)收集
在進行機器學(xué)習(xí)之前,收集數(shù)據(jù)的過程中,我們主要按照以下規(guī)則找出我們所需 要的數(shù)據(jù):
- 業(yè)務(wù)的實現(xiàn)需要哪些數(shù)據(jù)? 基于對業(yè)務(wù)規(guī)則的理解,盡可能多的找出對因變量有影響的所有自變量數(shù)據(jù)。
- 數(shù)據(jù)可用性評估 在獲取數(shù)據(jù)的過程中,首先需要考慮的是這個數(shù)據(jù)獲取的成本; 獲取得到的數(shù)據(jù),在使用之前,需要考慮一下這個數(shù)據(jù)是否覆蓋了所有情況以及這個數(shù) 據(jù)的可信度情況。
- 數(shù)據(jù)源
用戶行為日志數(shù)據(jù):記錄的用戶在系統(tǒng)上所有操作所留下來的日志行為數(shù)據(jù) 業(yè)務(wù)數(shù)據(jù):
商品/物品的信息、用戶/會員的信息......
第三方數(shù)據(jù):爬蟲數(shù)據(jù)、購買的數(shù)據(jù)、合作方的數(shù)據(jù).... - 數(shù)據(jù)儲存
一般情況下,用于后期模型創(chuàng)建的數(shù)據(jù)都是存在在本地磁盤、關(guān)系型數(shù)據(jù)庫或者 一些相關(guān)的分布式數(shù)據(jù)存儲平臺的。 本地磁盤 MySQL Oracle HBase HDFS Hive
數(shù)據(jù)清洗
- 預(yù)處理
在數(shù)據(jù)預(yù)處理過程主要考慮兩個方面,如下: 選擇數(shù)據(jù)處理工具:關(guān)系型數(shù)據(jù)庫或者Python 查看數(shù)據(jù)的元數(shù)據(jù)以及數(shù)據(jù)特征:一是查看元數(shù)據(jù),包括字段解釋、數(shù)據(jù)來源等一 切可以描述數(shù)據(jù)的信息;另外是抽取一部分數(shù)據(jù),通過人工查看的方式,對數(shù)據(jù)本 身做一個比較直觀的了解,并且初步發(fā)現(xiàn)一些問題,為之后的數(shù)據(jù)處理做準(zhǔn)備。 - 格式內(nèi)容錯誤數(shù)據(jù)清洗
時間、日期、數(shù)值、半全角等顯示格式不一致:直接將數(shù)據(jù)轉(zhuǎn)換為一類格式即可,該問 題一般出現(xiàn)在多個數(shù)據(jù)源整合的情況下。
內(nèi)容中有不該存在的字符:最典型的就是在頭部、中間、尾部的空格等問題,這種情況 下,需要以半自動校驗加半人工方式來找出問題,并去除不需要的字符。
內(nèi)容與該字段應(yīng)有的內(nèi)容不符:比如姓名寫成了性別、身份證號寫成手機號等問題。 - 去除不需要的數(shù)據(jù)
一般情況下,我們會盡可能多的收集數(shù)據(jù),但是不是所有的字段數(shù)據(jù)都是可以應(yīng) 用到模型構(gòu)建過程的,也不是說將所有的字段屬性都放到構(gòu)建模型中,最終模型 的效果就一定會好,實際上來講,字段屬性越多,模型的構(gòu)建就會越慢,所以有 時候可以考慮將不要的字段進行刪除操作。在進行該過程的時候,要注意備份原 始數(shù)據(jù)。 - 關(guān)聯(lián)性驗證
如果數(shù)據(jù)有多個來源,那么有必要進行關(guān)聯(lián)性驗證,該過程常應(yīng)用到多數(shù)據(jù)源合 并的過程中,通過驗證數(shù)據(jù)之間的關(guān)聯(lián)性來選擇比較正確的特征屬性,比如:汽 車的線下購買信息和電話客服問卷信息,兩者之間可以通過姓名和手機號進行關(guān) 聯(lián)操作,匹配兩者之間的車輛信息是否是同一輛,如果不是,那么就需要進行數(shù) 據(jù)調(diào)整。
數(shù)據(jù)不平衡

- 設(shè)置損失函數(shù)的權(quán)重,使得少數(shù)類別數(shù)據(jù)判斷錯誤的損失大于多數(shù)類別數(shù)據(jù)判斷 錯誤的損失,即當(dāng)我們的少數(shù)類別數(shù)據(jù)預(yù)測錯誤的時候,會產(chǎn)生一個比較大的損 失值,從而導(dǎo)致模型參數(shù)往讓少數(shù)類別數(shù)據(jù)預(yù)測準(zhǔn)確的方向偏??梢酝ㄟ^scikitlearn中的class_weight參數(shù)來設(shè)置權(quán)重。
- 下采樣/欠采樣(under sampling):從多數(shù)類中隨機抽取樣本從而減少多數(shù)類別 樣本數(shù)據(jù),使數(shù)據(jù)達到平衡的方式。
*采用數(shù)據(jù)合成的方式生成更多的樣本,該方式在小數(shù)據(jù)集場景下具有比較成功的 案例。常見算法是SMOTE算法,該算法利用小眾樣本在特征空間的相似性來生 成新樣本。
特征轉(zhuǎn)換
特征轉(zhuǎn)換主要指將原始數(shù)據(jù)中的字段數(shù)據(jù)進行轉(zhuǎn)換操作,從而得到適合進行算法 模型構(gòu)建的輸入數(shù)據(jù)(數(shù)值型數(shù)據(jù)),在這個過程中主要包括但不限于以下幾種數(shù) 據(jù)的處理:
文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)
缺省值填充
定性特征屬性啞編碼
定量特征屬性二值化
特征標(biāo)準(zhǔn)化與歸一化
- 文本特征屬性轉(zhuǎn)換
機器學(xué)習(xí)的模型算法均要求輸入的數(shù)據(jù)必須是數(shù)值型的,所以對于文本類型的特 征屬性,需要進行文本數(shù)據(jù)轉(zhuǎn)換,也就是需要將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值型數(shù)據(jù)。常 用方式如下:
詞袋法(BOW/TF)
TF-IDF(Term frequency-inverse document frequency)
HashTF
Word2Vec(主要用于單詞的相似性考量) - 缺省值填充
缺省值是數(shù)據(jù)中最常見的一個問題,處理缺省值有很多方式,主要包括以下四個 步驟進行缺省值處理:
確定缺省值范圍
去除不需要的字段
填充缺省值內(nèi)容
重新獲取數(shù)據(jù)
注意:最重要的是缺省值內(nèi)容填充。 - 啞編碼
啞編碼(OneHotEncoder):對于定性的數(shù)據(jù)(也就是分類的數(shù)據(jù)),可以采用N位 的狀態(tài)寄存器來對N個狀態(tài)進行編碼,每個狀態(tài)都有一個獨立的寄存器位,并且 在任意狀態(tài)下只有一位有效;是一種常用的將特征數(shù)字化的方式。比如有一個特 征屬性:['male','female'],那么male使用向量[1,0]表示,female使用[0,1]表示。
示例:
#-*- conding:utf-8 -*-
'''
亞編碼,先把特征轉(zhuǎn)為數(shù)字,再進行亞編碼處理
'''
import numpy as np
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import OneHotEncoder
path = "car.data"
data = pd.read_csv(path, header=None)
#查看數(shù)據(jù)
for i in range(7):
print(np.unique(data[i]))
#將字符串轉(zhuǎn)化為數(shù)字,用pd.Categorical
# pd.Categorical(data)
x=data.apply(lambda x:pd.Categorical(x).codes)
print(x.head(5))
#進行亞編碼操作,toarray()方法轉(zhuǎn)化為數(shù)組
en=OneHotEncoder()
x = en.fit_transform(x)
print(x.toarray())
print(en.n_values_)
#在進行轉(zhuǎn)化
df=pd.DataFrame(x.toarray())
print(df.head(5))
- 二值化
二值化(Binarizer):對于定量的數(shù)據(jù)(特征取值連續(xù))根據(jù)給定的閾值,將其進 行轉(zhuǎn)換,如果大于閾值,那么賦值為1;否則賦值為0
注意:二值化非常常用,對每個特征按照不同閾值進行拆分,再進行合并
延伸為多值花,設(shè)定多個閾值。 -
標(biāo)準(zhǔn)化(z-score)
標(biāo)準(zhǔn)化:基于特征屬性的數(shù)據(jù)(也就是特征矩陣的列),獲取均值和方差,然后將 特征值轉(zhuǎn)換至服從標(biāo)準(zhǔn)正態(tài)分布。計算公式如下:
-
區(qū)間縮放法
區(qū)間縮放法:是指按照數(shù)據(jù)的取值范圍特性對數(shù)據(jù)進行縮放操作,將數(shù)據(jù)縮放到 給定區(qū)間上,常用的計算方式如下:
-
正則化
正則化:和標(biāo)準(zhǔn)化不同,正則化是基于矩陣的行進行數(shù)據(jù)處理,其目的是將矩陣 的行均轉(zhuǎn)換為“單位向量”,l2規(guī)則轉(zhuǎn)換公式如下:
- 比較
標(biāo)準(zhǔn)化的目的是為了降低不同特征的不同范圍的取值對于模型訓(xùn)練的影響;比如對于同 一個特征,不同的樣本的取值可能會相差的非常大,那么這個時候一些異常小或者異常 大的數(shù)據(jù)可能會誤導(dǎo)模型的正確率;另外如果數(shù)據(jù)在不同特征上的取值范圍相差很大, 那么也有可能導(dǎo)致最終訓(xùn)練出來的模型偏向于取值范圍大的特征,特別是在使用梯度下 降求解的算法中;通過改變數(shù)據(jù)的分布特征,具有以下兩個好處:1. 提高迭代求解的收 斂速度;2. 提高迭代求解的精度
歸一化對于不同特征維度的伸縮變換的主要目的是為了使得不同維度度量之間特征具有 可比性,同時不改變原始數(shù)據(jù)的分布(相同特性的特征轉(zhuǎn)換后,還是具有相同特性)。和 標(biāo)準(zhǔn)化一樣,也屬于一種無量綱化的操作方式。
正則化則是通過范數(shù)規(guī)則來約束特征屬性,通過正則化我們可以降低數(shù)據(jù)訓(xùn)練處來的模 型的過擬合可能,和之前在機器學(xué)習(xí)中所講述的L1、L2正則的效果一樣。在進行正則化 操作的過程中,不會改變數(shù)據(jù)的分布情況,但是會改變數(shù)據(jù)特征之間的相關(guān)特性。 備注:廣義上來講,標(biāo)準(zhǔn)化、區(qū)間縮放法、正則化都是具有類似的功能。在有一些書籍 上,將標(biāo)準(zhǔn)化、區(qū)間縮放法統(tǒng)稱為標(biāo)準(zhǔn)化,把正則化稱為歸一化操作。
簡單來說
標(biāo)準(zhǔn)化會改變數(shù)據(jù)的分布情況,歸一化不會,標(biāo)準(zhǔn) 化的主要作用是提高迭代速度,降低不同維度之間影響權(quán)重不一致的問題。
增維
- 多項式擴展
多項式數(shù)據(jù)變換主要是指基于輸入的特征數(shù)據(jù)按照既定的多項式規(guī)則構(gòu)建更多的 輸出特征屬性,比如輸入特征屬性為[a,b],當(dāng)設(shè)置degree為2的時候,那么輸出 的多項式特征為[1, a, b, a^2, ab, b^2] - 核函數(shù)
- GBDT+LR
認為每個樣本在決策樹落在決策樹 的每個葉子上就表示屬于一個類別, 那么我們可以進行基于GBDT或者隨 機森林的維度擴展,經(jīng)常我們會將其 應(yīng)用在GBDT將數(shù)據(jù)進行維度擴充, 然后使用LR進行數(shù)據(jù)預(yù)測,這也是我 們進行所說的GBDT+LR做預(yù)測
降維
以后再說
特征選擇
當(dāng)做完特征轉(zhuǎn)換后,實際上可能會存在很多的特征屬性,比如:多項式擴展轉(zhuǎn)換、文本 數(shù)據(jù)轉(zhuǎn)換等等,但是太多的特征屬性的存在可能會導(dǎo)致模型構(gòu)建效率降低,同時模型的 效果有可能會變的不好,那么這個時候就需要從這些特征屬性中選擇出影響最大的特征 屬性作為最后構(gòu)建模型的特征屬性列表。
在選擇模型的過程中,通常從兩方面來選擇特征:
特征是否發(fā)散:如果一個特征不發(fā)散,比如方差解決于0,也就是說這樣的特征對于樣本的 區(qū)分沒有什么作用。
特征與目標(biāo)的相關(guān)性:如果與目標(biāo)相關(guān)性比較高,應(yīng)當(dāng)優(yōu)先選擇。
特征選擇的方法主要有以下三種:
- Filter:過濾法,按照發(fā)散性或者相關(guān)性對各個特征進行評分,設(shè)定閾值或者待選擇 閾值的個數(shù),從而選擇特征;常用方法包括方差選擇法、相關(guān)系數(shù)法、卡方檢驗、 互信息法等。
- Wrapper:包裝法,根據(jù)目標(biāo)函數(shù)(通常是預(yù)測效果評分),每次選擇若干特征或 者排除若干特征;常用方法主要是遞歸特征消除法。
- Embedded:嵌入法,先使用某些機器學(xué)習(xí)的算法和模型進行訓(xùn)練,得到各個特征 的權(quán)重系數(shù),根據(jù)系數(shù)從大到小選擇特征;常用方法主要是基于懲罰項的特征選擇 法。
把以上進行一個匯總,如下圖:

我的博客即將搬運同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan


