0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python特征生成作用和生成的方法

數(shù)據(jù)分析與開發(fā) ? 來源:CSDN ? 作者:python阿喵 ? 2021-03-10 15:53 ? 次閱讀

創(chuàng)造新的特征是一件十分困難的事情,需要豐富的專業(yè)知識和大量的時間。機(jī)器學(xué)習(xí)應(yīng)用的本質(zhì)基本上就是特征工程?!狝ndrew Ng

業(yè)內(nèi)常說數(shù)據(jù)決定了模型效果上限,而機(jī)器學(xué)習(xí)算法是通過數(shù)據(jù)特征做出預(yù)測的,好的特征可以顯著地提升模型效果。這意味著通過特征生成(即從數(shù)據(jù)設(shè)計加工出模型可用特征),是特征工程相當(dāng)關(guān)鍵的一步。

本文從特征生成作用、特征生成的方法(人工設(shè)計、自動化特征生成)展開闡述并附上代碼。

1 特征生成的作用

特征生成是特征提取中的重要一步,作用在于:

增加特征的表達(dá)能力,提升模型效果;(如體重除以身高就是表達(dá)健康情況的重要特征,而單純看身高或體重,對健康情況表達(dá)就有限。)

可以融入業(yè)務(wù)上的理解設(shè)計特征,增加模型的可解釋性;

2 一鍵數(shù)據(jù)情況分析

本文示例的數(shù)據(jù)集是客戶的資金變動情況,如下數(shù)據(jù)字典:

cust_no:客戶編號;I1 :性別;I2:年齡;E1:開戶日期; B6 :近期轉(zhuǎn)賬日期;C1 (后綴_fir表示上個月):存款;C2:存款產(chǎn)品數(shù); X1:理財存款;X2:結(jié)構(gòu)性存款; label:資金情況上升下降情況。

75030a1c-7efa-11eb-8b86-12bb97331649.png

這里安利一個超實用Python庫,可以一鍵數(shù)據(jù)分析(數(shù)據(jù)概況、缺失、相關(guān)性、異常值等等),方便結(jié)合數(shù)據(jù)分析報告做特征生成。

#一鍵數(shù)據(jù)分析 importpandas_profiling pandas_profiling.ProfileReport(df)

3 特征生成方法(手動)

特征生成方法可以分為兩類:聚合方式、轉(zhuǎn)換方式。

3.1 聚合方式

聚合方式是指對存在一對多的字段,將其對應(yīng)多條記錄分組聚合后統(tǒng)計平均值、計數(shù)、最大值等數(shù)據(jù)特征。如以上述數(shù)據(jù)集,同一cust_no對應(yīng)多條記錄,通過對cust_no(客戶編號)做分組聚合,統(tǒng)計C1字段個數(shù)、唯一數(shù)、平均值、中位數(shù)、標(biāo)準(zhǔn)差、總和、最大、最小值,最終得到按每個cust_no統(tǒng)計的C1平均值、最大值等特征。

#以cust_no做聚合,C1字段統(tǒng)計個數(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)計函數(shù) defx2_sum(group): returnsum(group**2) df.groupby('cust_no').C1.apply(x2_sum)

3.2 轉(zhuǎn)換方式

轉(zhuǎn)換方式是指對字段間做加減乘除等運算生成數(shù)據(jù)特征的過程,對不同字段類型有不同轉(zhuǎn)換方式。

3.2.1 數(shù)值類型

加減乘除多個字段做運算生成新的特征,這通常需要結(jié)合業(yè)務(wù)層面的理解以及數(shù)據(jù)分布的情況,以生成較優(yōu)的特征集。

importnumpyasnp #前后兩個月資金和 df['C1+C1_fir']=df['C1']+df['C1_fir'] #前后兩個月資金差異 df['C1-C1_fir']=df['C1']-df['C1_fir'] #產(chǎn)品數(shù)*資金 df['C1*C2']=df['C1']*df['C2'] #前后兩個月資金變化率 df['C1/C1_fir']=df['C1']/df['C1_fir']-1 df.head()

多個列統(tǒng)計直接用聚合函數(shù)統(tǒng)計多列的方差、均值等

764b13ce-7efa-11eb-8b86-12bb97331649.png

importnumpyasnp df['C1_sum']=np.sum(df[['C1_fir','C1']],axis=1) df['C1_var']=np.var(df[['C1_fir','C1']],axis=1) df['C1_max']=np.max(df[['C1_fir','C1']],axis=1) df['C1_min']=np.min(df[['C1_fir','C1']],axis=1) df['C1-C1_fir_abs']=np.abs(df['C1-C1_fir']) df.head()

排名編碼特征按特征值對全體樣本進(jìn)行排序,以排序序號作為特征值。這種特征對異常點不敏感,也不容易導(dǎo)致特征值沖突。

#排序特征 df['C1_rank']=df['C1'].rank(ascending=0,method='dense') df.head()76778a26-7efa-11eb-8b86-12bb97331649.png

3.2.2 字符類型

截取當(dāng)字符類型的值過多,通??蓪ψ址愋妥兞孔鼋厝?,以減少模型過擬合。如具體的家庭住址,可以截取字符串到城市級的粒度。

字符長度統(tǒng)計字符串長度。如轉(zhuǎn)賬場景中,轉(zhuǎn)賬留言的字?jǐn)?shù)某些程度可以刻畫這筆轉(zhuǎn)賬的類型。

頻次通過統(tǒng)計字符出現(xiàn)頻次。如欺詐場景中地址出現(xiàn)次數(shù)越多,越有可能是團(tuán)伙欺詐。

#字符特征 #由于沒有合適的例子,這邊只是用代碼實現(xiàn)邏輯,加工的字段并無含義。 #截取第一位字符串 df['I1_0']=df['I1'].map(lambdax:str(x)[:1]) #字符長度 df['I1_len']=df['I1'].apply(lambdax:len(str(x))) display(df.head()) #字符串頻次 df['I1'].value_counts()

3.2.3 日期類型

常用的有計算日期間隔、周幾、幾點等等。

76965c9e-7efa-11eb-8b86-12bb97331649.png

#日期類型 df['E1_B6_interval']=(df.E1.astype('datetime64[ns]')-df.B6.astype('datetime64[ns]')).map(lambdax:x.days) df['E1_is_month_end']=pd.to_datetime(df.E1).map(lambdax: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 特征生成方法(自動化)

傳統(tǒng)的特征工程方法通過人工構(gòu)建特征,這是一個繁瑣、耗時且容易出錯的過程。自動化特征工程是通過Fearturetools等工具,從一組相關(guān)數(shù)據(jù)表中自動生成有用的特征的過程。對比人工生成特征會更為高效,可重復(fù)性更高,能夠更快地構(gòu)建模型。

4.1 FeatureTools上手

Featuretools是一個用于執(zhí)行自動化特征工程的開源庫,它有基本的3個概念:1)Feature Primitives(特征基元):生成特征的常用方法,分為聚合(agg_primitives)、轉(zhuǎn)換(trans_primitives)的方式??赏ㄟ^如下代碼列出featuretools的特征加工方法及簡介。

importfeaturetoolsasft ft.list_primitives()

771610b0-7efa-11eb-8b86-12bb97331649.png

2)Entity(實體)可以被看作類似Pandas DataFrame, 多個實體的集合稱為Entityset。實體間可以根據(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') #增加一個df1數(shù)據(jù)框?qū)嶓w es.entity_from_dataframe(entity_id='df1', dataframe=df1, index='id', make_index=True) #增加一個df2數(shù)據(jù)實體 es.entity_from_dataframe(entity_id='df2', dataframe=df2, index='cust_no') #添加實體間關(guān)系:通過 cust_no鍵關(guān)聯(lián) df_1 和 df 2實體 relation1=ft.Relationship(es['df2']['cust_no'],es['df1']['cust_no']) es=es.add_relationship(relation1)

3)dfs(深度特征合成):是從多個數(shù)據(jù)集創(chuàng)建新特征的過程,可以通過設(shè)置搜索的最大深度(max_depth)來控制所特征生成的復(fù)雜性

##運行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問題點

4.2.1 內(nèi)存溢出問題Fearturetools是通過工程層面暴力生成所有特征的過程,當(dāng)數(shù)據(jù)量大的時候,容易造成內(nèi)存溢出。解決這個問題除了升級服務(wù)器內(nèi)存,減少njobs,還有一個常用的是通過只選擇重要的特征進(jìn)行暴力衍生特征。

4.2.2 特征維度爆炸當(dāng)原始特征數(shù)量多,或max_depth、特征基元的種類設(shè)定較大,F(xiàn)earturetools生成的特征數(shù)量巨大,容易維度爆炸。這是就需要考慮到特征選擇、特征降維。

原文標(biāo)題:一文歸納Python特征生成方法(全)

文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8349

    瀏覽量

    132315
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375

原文標(biāo)題:一文歸納Python特征生成方法(全)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?150次閱讀
    如何自動<b class='flag-5'>生成</b>verilog代碼

    生成式AI工具作用

    生成式AI工具是指那些能夠自動生成文本、圖像、音頻、視頻等多種類型數(shù)據(jù)的人工智能技術(shù)。在此,petacloud.ai小編為您整理生成式AI工具作用。
    的頭像 發(fā)表于 10-28 11:19 ?144次閱讀

    如何使用 Llama 3 進(jìn)行文本生成

    torch 使用Hugging Face的pipeline進(jìn)行文本生成。 python復(fù)制代碼 from tr
    的頭像 發(fā)表于 10-27 14:21 ?197次閱讀

    AIGC生成內(nèi)容的優(yōu)勢與挑戰(zhàn)

    人工智能生成內(nèi)容(AIGC,Artificial Intelligence Generated Content)是指利用人工智能技術(shù)自動生成文本、圖像、音頻和視頻等內(nèi)容的過程。隨著深度學(xué)習(xí)、自然語言
    的頭像 發(fā)表于 10-25 15:36 ?273次閱讀

    三行代碼完成生成式AI部署

    OpenVINO2024.2版本跟之前版本最大的不同是OpenVINO2024.2分為兩個安裝包分別是基礎(chǔ)包與生成式AI支持包,新發(fā)布的GenAI開發(fā)包支持C++與Python語言接口調(diào)用,支持多種
    的頭像 發(fā)表于 08-30 16:49 ?366次閱讀
    三行代碼完成<b class='flag-5'>生成</b>式AI部署

    微液滴生成方法及發(fā)展趨勢

    微液滴 的生成方法 早期使用的生成液滴方法主要有高速攪拌法、逐層組裝技術(shù)、膜乳化法和界面聚合法等, 均可生成微納米尺寸的液滴。 高速攪拌法工序少、操作簡單、成本低; 逐層組裝技術(shù)通用性
    的頭像 發(fā)表于 07-26 13:27 ?291次閱讀

    如何用C++創(chuàng)建簡單的生成式AI模型

    生成式AI(Generative AI)是一種人工智能技術(shù),它通過機(jī)器學(xué)習(xí)模型和深度學(xué)習(xí)技術(shù),從大量歷史數(shù)據(jù)中學(xué)習(xí)對象的特征和規(guī)律,從而能夠生成全新的、完全原創(chuàng)的內(nèi)容,包括文本、圖像、音頻和視頻等。與傳統(tǒng)的基于規(guī)則或模板的
    的頭像 發(fā)表于 07-05 17:53 ?700次閱讀

    生成式AI的定義和特征

    行為,生成全新的、具有實際意義的數(shù)據(jù)或內(nèi)容。這種技術(shù)已經(jīng)在自然語言處理、圖像生成、音頻合成等多個領(lǐng)域展現(xiàn)出巨大的潛力和應(yīng)用價值。本文將詳細(xì)探討生成式AI的定義、特征類,并通過代碼示例展
    的頭像 發(fā)表于 07-05 17:33 ?798次閱讀

    任意波形發(fā)生器中波形生成方法

    中,任意波形發(fā)生器都發(fā)揮著不可或缺的作用。本文將詳細(xì)探討任意波形發(fā)生器中波形生成方法,以期為相關(guān)領(lǐng)域的研究和應(yīng)用提供參考。
    的頭像 發(fā)表于 05-29 17:13 ?700次閱讀

    Allegro生成光繪文件

    Allegro生成光繪文件
    發(fā)表于 05-06 10:37 ?1次下載

    如何使用Python生成四位隨機(jī)數(shù)字

    為了實現(xiàn)這些目標(biāo),Python 為我們提供了random() 模塊。random() 是一個內(nèi)置的 Python 模塊,用于生成隨機(jī)數(shù)。
    的頭像 發(fā)表于 04-15 12:47 ?582次閱讀

    Minitab 交互式表格生成

    生成
    MinitabUG
    發(fā)布于 :2024年04月03日 15:58:54

    生成SPWM波形的方法

    生成SPWM波形的方法? SPWM波形產(chǎn)生是一種常見的數(shù)字信號生成技術(shù),用于控制交流電子設(shè)備的輸出電壓或電流的形狀,使其接近正弦波。 SPWM波形是由一系列的脈沖信號組成,每個脈沖信號的寬度由一個
    的頭像 發(fā)表于 02-06 13:52 ?2444次閱讀

    計算機(jī)快速全息生成技術(shù)研究

    快速全息生成技術(shù)依賴于計算機(jī)生成的全息影像 (CGH) 的快速創(chuàng)建。目前,基于光線追蹤的計算機(jī)生成全息圖的快速生成方法仍基于非物理光線追蹤方法
    的頭像 發(fā)表于 12-12 11:15 ?479次閱讀
    計算機(jī)快速全息<b class='flag-5'>生成</b>技術(shù)研究

    php生成動態(tài)網(wǎng)頁內(nèi)容的方法

    PHP是一種廣泛用于Web開發(fā)的腳本語言,可用于生成動態(tài)網(wǎng)頁內(nèi)容。在本文中,我們將介紹使用PHP生成動態(tài)網(wǎng)頁內(nèi)容的方法。 什么是動態(tài)網(wǎng)頁? 動態(tài)網(wǎng)頁是一種可以根據(jù)用戶請求和其他變量動態(tài)生成
    的頭像 發(fā)表于 12-04 16:22 ?810次閱讀