【机器学习基础】一文归纳Python特征生成方法(全)
創(chuàng)造新的特征是一件十分困難的事情,需要豐富的專業(yè)知識(shí)和大量的時(shí)間。機(jī)器學(xué)習(xí)應(yīng)用的本質(zhì)基本上就是特征工程。——Andrew Ng
業(yè)內(nèi)常說(shuō)數(shù)據(jù)決定了模型效果上限,而機(jī)器學(xué)習(xí)算法是通過(guò)數(shù)據(jù)特征做出預(yù)測(cè)的,好的特征可以顯著地提升模型效果。這意味著通過(guò)特征生成(即從數(shù)據(jù)設(shè)計(jì)加工出模型可用特征),是特征工程相當(dāng)關(guān)鍵的一步。
本文從特征生成作用、特征生成的方法(人工設(shè)計(jì)、自動(dòng)化特征生成)展開(kāi)闡述并附上代碼。
1 特征生成的作用
特征生成是特征提取中的重要一步,作用在于:
增加特征的表達(dá)能力,提升模型效果;(如體重除以身高就是表達(dá)健康情況的重要特征,而單純看身高或體重,對(duì)健康情況表達(dá)就有限。)
可以融入業(yè)務(wù)上的理解設(shè)計(jì)特征,增加模型的可解釋性;
2 數(shù)據(jù)情況分析
本文示例的數(shù)據(jù)集是客戶的資金變動(dòng)情況,如下數(shù)據(jù)字典:
cust_no:客戶編號(hào);I1 :性別;I2:年齡?;E1:開(kāi)戶日期;?? B6 :近期轉(zhuǎn)賬日期;C1 (后綴_fir表示上個(gè)月):存款;C2:存款產(chǎn)品數(shù);? X1:理財(cái)存款;X2:結(jié)構(gòu)性存款;? label:資金情況上升下降情況。這里安利一個(gè)超實(shí)用Python庫(kù),可以一鍵數(shù)據(jù)分析(數(shù)據(jù)概況、缺失、相關(guān)性、異常值等等),方便結(jié)合數(shù)據(jù)分析報(bào)告做特征生成。
#?一鍵數(shù)據(jù)分析 import?pandas_profilingpandas_profiling.ProfileReport(df)3 ? 特征生成的方法
特征生成方法可以分為兩類:聚合方式、轉(zhuǎn)換方式。
3.1 聚合方式
聚合方式是指對(duì)存在一對(duì)多的字段,將其對(duì)應(yīng)多條記錄分組聚合后統(tǒng)計(jì)平均值、計(jì)數(shù)、最大值等數(shù)據(jù)特征。如以上述數(shù)據(jù)集,同一cust_no對(duì)應(yīng)多條記錄,通過(guò)對(duì)cust_no(客戶編號(hào))做分組聚合,統(tǒng)計(jì)C1字段個(gè)數(shù)、唯一數(shù)、平均值、中位數(shù)、標(biāo)準(zhǔn)差、總和、最大、最小值,最終得到按每個(gè)cust_no統(tǒng)計(jì)的C1平均值、最大值等特征。
#?以cust_no做聚合,C1字段統(tǒng)計(jì)個(gè)數(shù)、唯一數(shù)、平均值、中位數(shù)、標(biāo)準(zhǔn)差、總和、最大、最小值 df.groupby('cust_no').C1.agg(['count','nunique','mean','median','std','sum','max','min'])此外還可以pandas自定義聚合函數(shù)生成特征,比如加工聚合元素的平方和:
#?自定義分組聚合統(tǒng)計(jì)函數(shù) def?x2_sum(group):return?sum(group**2)df.groupby('cust_no').C1.apply(x2_sum)????3.2 轉(zhuǎn)換方式
轉(zhuǎn)換方式是指對(duì)字段間做加減乘除等運(yùn)算生成數(shù)據(jù)特征的過(guò)程,對(duì)不同字段類型有不同轉(zhuǎn)換方式。
3.2.1 數(shù)值類型
加減乘除 多個(gè)字段做運(yùn)算生成新的特征,這通常需要結(jié)合業(yè)務(wù)層面的理解以及數(shù)據(jù)分布的情況,以生成較優(yōu)的特征集。
多個(gè)列統(tǒng)計(jì) 直接用聚合函數(shù)統(tǒng)計(jì)多列的方差、均值等
排名編碼特征 按特征值對(duì)全體樣本進(jìn)行排序,以排序序號(hào)作為特征值。這種特征對(duì)異常點(diǎn)不敏感,也不容易導(dǎo)致特征值沖突。
3.2.2 字符類型
截取 當(dāng)字符類型的值過(guò)多,通常可對(duì)字符類型變量做截取,以減少模型過(guò)擬合。如具體的家庭住址,可以截取字符串到城市級(jí)的粒度。
字符長(zhǎng)度 統(tǒng)計(jì)字符串長(zhǎng)度。如轉(zhuǎn)賬場(chǎng)景中,轉(zhuǎn)賬留言的字?jǐn)?shù)某些程度可以刻畫(huà)這筆轉(zhuǎn)賬的類型。
頻次 通過(guò)統(tǒng)計(jì)字符出現(xiàn)頻次。如欺詐場(chǎng)景中地址出現(xiàn)次數(shù)越多,越有可能是團(tuán)伙欺詐。
3.2.3 日期類型
常用的有計(jì)算日期間隔、周幾、幾點(diǎn)等等。
#?日期類型 df['E1_B6_interval']?=?(df.E1.astype('datetime64[ns]')?-?df.B6.astype('datetime64[ns]')).map(lambda?x:x.days) df['E1_is_month_end']?=?pd.to_datetime(df.E1).map(lambda?x?:x.is_month_end) df['E1_dayofweek']?=?df.E1.astype('datetime64[ns]').dt.dayofweek df['B6_hour']?=?df.B6.astype('datetime64[ns]').dt.hour df.head()4 ?自動(dòng)化特征生成
傳統(tǒng)的特征工程方法通過(guò)人工構(gòu)建特征,這是一個(gè)繁瑣、耗時(shí)且容易出錯(cuò)的過(guò)程。自動(dòng)化特征工程是通過(guò)Fearturetools等工具,從一組相關(guān)數(shù)據(jù)表中自動(dòng)生成有用的特征的過(guò)程。對(duì)比人工生成特征會(huì)更為高效,可重復(fù)性更高,能夠更快地構(gòu)建模型。
4.1 FeatureTools上手
Featuretools是一個(gè)用于執(zhí)行自動(dòng)化特征工程的開(kāi)源庫(kù),它有基本的3個(gè)概念:1)Feature Primitives(特征基元):生成特征的常用方法,分為聚合(agg_primitives)、轉(zhuǎn)換(trans_primitives)的方式。可通過(guò)如下代碼列出featuretools的特征加工方法及簡(jiǎn)介。
import?featuretools?as?ftft.list_primitives()2)Entity(實(shí)體)??可以被看作類似Pandas DataFrame, ?多個(gè)實(shí)體的集合稱為Entityset。實(shí)體間可以根據(jù)關(guān)聯(lián)鍵添加關(guān)聯(lián)關(guān)系Relationship。
#?df1為原始的特征數(shù)據(jù) df1?=?df.drop('label',axis=1)#?df2為客戶清單(cust_no唯一值) df2?=?df[['cust_no']].drop_duplicates() df2.head()#?定義數(shù)據(jù)集 es?=?ft.EntitySet(id='dfs')#?增加一個(gè)df1數(shù)據(jù)框?qū)嶓w es.entity_from_dataframe(entity_id='df1',?????????dataframe=df1,index='id',make_index=True)#?增加一個(gè)df2數(shù)據(jù)實(shí)體 es.entity_from_dataframe(entity_id='df2',?????????dataframe=df2,index='cust_no')#?添加實(shí)體間關(guān)系:通過(guò) cust_no鍵關(guān)聯(lián) df_1 和 df 2實(shí)體 relation1?=?ft.Relationship(es['df2']['cust_no'],?es['df1']['cust_no']) es?=?es.add_relationship(relation1)3)dfs(深度特征合成)?:?是從多個(gè)數(shù)據(jù)集創(chuàng)建新特征的過(guò)程,可以通過(guò)設(shè)置搜索的最大深度(max_depth)來(lái)控制所特征生成的復(fù)雜性
##?運(yùn)行DFS特征衍生 features_matrix,feature_names?=?ft.dfs(entityset=es,target_entity='df2',relationships?=?[relation1],trans_primitives=['divide_numeric','multiply_numeric','subtract_numeric'],agg_primitives=['sum'],max_depth=2,n_jobs=1,verbose=-1)4.2 FeatureTools問(wèn)題點(diǎn)
4.2.1 內(nèi)存溢出問(wèn)題 Fearturetools是通過(guò)工程層面暴力生成所有特征的過(guò)程,當(dāng)數(shù)據(jù)量大的時(shí)候,容易造成內(nèi)存溢出。解決這個(gè)問(wèn)題除了升級(jí)服務(wù)器內(nèi)存,減少njobs,還有一個(gè)常用的是通過(guò)只選擇重要的特征進(jìn)行暴力衍生特征。
4.2.2 特征維度爆炸 當(dāng)原始特征數(shù)量多,或max_depth、特征基元的種類設(shè)定較大,Fearturetools生成的特征數(shù)量巨大,容易維度爆炸。這是就需要考慮到特征選擇、特征降維,常用的特征選擇方法可以參考上一篇文章: Python特征選擇??
注:本文源碼鏈接:閱讀原文可訪問(wèn)鏈接
往期精彩回顧適合初學(xué)者入門(mén)人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 本站qq群704220115,加入微信群請(qǐng)掃碼:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】一文归纳Python特征生成方法(全)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【深度学习】擦除:提升 CNN 特征可视
- 下一篇: Win11系统如何设置黑暗模式