<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【機(jī)器學(xué)習(xí)基礎(chǔ)】一文歸納Python特征生成方法(全)

          共 4524字,需瀏覽 10分鐘

           ·

          2021-02-20 11:06

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

          pandas_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)的特征集。
          import?numpy?as?np

          #?前后兩個(gè)月資金和
          df['C1+C1_fir']?=?df['C1']+df['C1_fir']
          #?前后兩個(gè)月資金差異
          df['C1-C1_fir']?=?df['C1']-df['C1_fir']
          #?產(chǎn)品數(shù)*資金
          df['C1*C2']?=?df['C1']*df['C2']
          #?前后兩個(gè)月資金變化率
          df['C1/C1_fir']?=?df['C1']/df['C1_fir']??-?1
          df.head()
          • 多個(gè)列統(tǒng)計(jì) 直接用聚合函數(shù)統(tǒng)計(jì)多列的方差、均值等
          import?numpy?as?np

          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()
          • 排名編碼特征 按特征值對(duì)全體樣本進(jìn)行排序,以排序序號(hào)作為特征值。這種特征對(duì)異常點(diǎn)不敏感,也不容易導(dǎo)致特征值沖突。
          #?排序特征

          df['C1_rank']?=?df['C1'].rank(ascending=0,?method='dense')
          df.head()

          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)伙欺詐。

          #?字符特征
          #?由于沒(méi)有合適的例子,這邊只是用代碼實(shí)現(xiàn)邏輯,加工的字段并無(wú)含義。

          #截取第一位字符串
          df['I1_0']?=?df['I1'].map(lambda?x:str(x)[:1])
          #?字符長(zhǎng)度
          df['I1_len']?=?df['I1'].apply(lambda?x:len(str(x)))

          display(df.head())
          #?字符串頻次
          df['I1'].value_counts()

          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?ft

          ft.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è)定較大,F(xiàn)earturetools生成的特征數(shù)量巨大,容易維度爆炸。這是就需要考慮到特征選擇、特征降維,常用的特征選擇方法可以參考上一篇文章: Python特征選擇??


          注:本文源碼鏈接:閱讀原文可訪問(wèn)鏈接


          往期精彩回顧





          本站qq群704220115,加入微信群請(qǐng)掃碼:

          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜成人鲁丝片午夜精品 | 正在播放熟女 | 性导航AV导航 | 色玖玖 插person | 夜夜免费视频 |