0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

数据分析与开发 来源:CSDN 作者:python阿喵 2021-03-10 15:53 次阅读

创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间。机器学习应用的本质基本上就是特征工程。——Andrew Ng

业内常说数据决定了模型效果上限,而机器学习算法是通过数据特征做出预测的,好的特征可以显著地提升模型效果。这意味着通过特征生成(即从数据设计加工出模型可用特征),是特征工程相当关键的一步。

本文从特征生成作用、特征生成的方法(人工设计、自动化特征生成)展开阐述并附上代码。

1 特征生成的作用

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

增加特征的表达能力,提升模型效果;(如体重除以身高就是表达健康情况的重要特征,而单纯看身高或体重,对健康情况表达就有限。)

可以融入业务上的理解设计特征,增加模型的可解释性;

2 一键数据情况分析

本文示例的数据集是客户的资金变动情况,如下数据字典:

cust_no:客户编号;I1 :性别;I2:年龄;E1:开户日期; B6 :近期转账日期;C1 (后缀_fir表示上个月):存款;C2:存款产品数; X1:理财存款;X2:结构性存款; label:资金情况上升下降情况。

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

这里安利一个超实用Python库,可以一键数据分析(数据概况、缺失、相关性、异常值等等),方便结合数据分析报告做特征生成。

#一键数据分析 importpandas_profiling pandas_profiling.ProfileReport(df)

3 特征生成方法(手动)

特征生成方法可以分为两类:聚合方式、转换方式。

3.1 聚合方式

聚合方式是指对存在一对多的字段,将其对应多条记录分组聚合后统计平均值、计数、最大值等数据特征。如以上述数据集,同一cust_no对应多条记录,通过对cust_no(客户编号)做分组聚合,统计C1字段个数、唯一数、平均值、中位数、标准差、总和、最大、最小值,最终得到按每个cust_no统计的C1平均值、最大值等特征。

#以cust_no做聚合,C1字段统计个数、唯一数、平均值、中位数、标准差、总和、最大、最小值 df.groupby('cust_no').C1.agg(['count','nunique','mean','median','std','sum','max','min'])

此外还可以pandas自定义聚合函数生成特征,比如加工聚合元素的平方和:

#自定义分组聚合统计函数 defx2_sum(group): returnsum(group**2) df.groupby('cust_no').C1.apply(x2_sum)

3.2 转换方式

转换方式是指对字段间做加减乘除等运算生成数据特征的过程,对不同字段类型有不同转换方式。

3.2.1 数值类型

加减乘除多个字段做运算生成新的特征,这通常需要结合业务层面的理解以及数据分布的情况,以生成较优的特征集。

importnumpyasnp #前后两个月资金和 df['C1+C1_fir']=df['C1']+df['C1_fir'] #前后两个月资金差异 df['C1-C1_fir']=df['C1']-df['C1_fir'] #产品数*资金 df['C1*C2']=df['C1']*df['C2'] #前后两个月资金变化率 df['C1/C1_fir']=df['C1']/df['C1_fir']-1 df.head()

多个列统计直接用聚合函数统计多列的方差、均值等

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()

排名编码特征按特征值对全体样本进行排序,以排序序号作为特征值。这种特征对异常点不敏感,也不容易导致特征值冲突。

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

3.2.2 字符类型

截取当字符类型的值过多,通常可对字符类型变量做截取,以减少模型过拟合。如具体的家庭住址,可以截取字符串到城市级的粒度。

字符长度统计字符串长度。如转账场景中,转账留言的字数某些程度可以刻画这笔转账的类型。

频次通过统计字符出现频次。如欺诈场景中地址出现次数越多,越有可能是团伙欺诈。

#字符特征 #由于没有合适的例子,这边只是用代码实现逻辑,加工的字段并无含义。 #截取第一位字符串 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 特征生成方法(自动化)

传统的特征工程方法通过人工构建特征,这是一个繁琐、耗时且容易出错的过程。自动化特征工程是通过Fearturetools等工具,从一组相关数据表中自动生成有用的特征的过程。对比人工生成特征会更为高效,可重复性更高,能够更快地构建模型。

4.1 FeatureTools上手

Featuretools是一个用于执行自动化特征工程的开源库,它有基本的3个概念:1)Feature Primitives(特征基元):生成特征的常用方法,分为聚合(agg_primitives)、转换(trans_primitives)的方式。可通过如下代码列出featuretools的特征加工方法及简介。

importfeaturetoolsasft ft.list_primitives()

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

2)Entity(实体)可以被看作类似Pandas DataFrame, 多个实体的集合称为Entityset。实体间可以根据关联键添加关联关系Relationship。

#df1为原始的特征数据 df1=df.drop('label',axis=1) #df2为客户清单(cust_no唯一值) df2=df[['cust_no']].drop_duplicates() df2.head() #定义数据集 es=ft.EntitySet(id='dfs') #增加一个df1数据框实体 es.entity_from_dataframe(entity_id='df1', dataframe=df1, index='id', make_index=True) #增加一个df2数据实体 es.entity_from_dataframe(entity_id='df2', dataframe=df2, index='cust_no') #添加实体间关系:通过 cust_no键关联 df_1 和 df 2实体 relation1=ft.Relationship(es['df2']['cust_no'],es['df1']['cust_no']) es=es.add_relationship(relation1)

3)dfs(深度特征合成):是从多个数据集创建新特征的过程,可以通过设置搜索的最大深度(max_depth)来控制所特征生成的复杂性

##运行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 内存溢出问题Fearturetools是通过工程层面暴力生成所有特征的过程,当数据量大的时候,容易造成内存溢出。解决这个问题除了升级服务器内存,减少njobs,还有一个常用的是通过只选择重要的特征进行暴力衍生特征。

4.2.2 特征维度爆炸当原始特征数量多,或max_depth、特征基元的种类设定较大,Fearturetools生成的特征数量巨大,容易维度爆炸。这是就需要考虑到特征选择、特征降维。

原文标题:一文归纳Python特征生成方法(全)

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6725

    浏览量

    88431
  • 机器学习
    +关注

    关注

    66

    文章

    8308

    浏览量

    131989
  • python
    +关注

    关注

    53

    文章

    4754

    浏览量

    84160

原文标题:一文归纳Python特征生成方法(全)

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    OpenVINO2024.2版本跟之前版本最大的不同是OpenVINO2024.2分为两个安装包分别是基础包与生成式AI支持包,新发布的GenAI开发包支持C++与Python语言接口调用,支持多种
    的头像 发表于 08-30 16:49 277次阅读
    三行代码完成<b class='flag-5'>生成</b>式AI部署

    微液滴生成方法及发展趋势

    微液滴 的生成方法 早期使用的生成液滴方法主要有高速搅拌法、逐层组装技术、膜乳化法和界面聚合法等, 均可生成微纳米尺寸的液滴。 高速搅拌法工序少、操作简单、成本低; 逐层组装技术通用性
    的头像 发表于 07-26 13:27 209次阅读

    如何用C++创建简单的生成式AI模型

    生成式AI(Generative AI)是一种人工智能技术,它通过机器学习模型和深度学习技术,从大量历史数据中学习对象的特征和规律,从而能够生成全新的、完全原创的内容,包括文本、图像、音频和视频等。与传统的基于规则或模板的
    的头像 发表于 07-05 17:53 547次阅读

    生成式AI的定义和特征

    行为,生成全新的、具有实际意义的数据或内容。这种技术已经在自然语言处理、图像生成、音频合成等多个领域展现出巨大的潜力和应用价值。本文将详细探讨生成式AI的定义、特征类,并通过代码示例展
    的头像 发表于 07-05 17:33 602次阅读

    任意波形发生器中波形生成方法

    中,任意波形发生器都发挥着不可或缺的作用。本文将详细探讨任意波形发生器中波形生成方法,以期为相关领域的研究和应用提供参考。
    的头像 发表于 05-29 17:13 516次阅读

    如何使用Python生成四位随机数字

    为了实现这些目标,Python 为我们提供了random() 模块。random() 是一个内置的 Python 模块,用于生成随机数。
    的头像 发表于 04-15 12:47 478次阅读

    Minitab 交互式表格生成

    生成
    MinitabUG
    发布于 :2024年04月03日 15:58:54

    生成SPWM波形的方法

    生成SPWM波形的方法  SPWM波形产生是一种常见的数字信号生成技术,用于控制交流电子设备的输出电压或电流的形状,使其接近正弦波。 SPWM波形是由一系列的脉冲信号组成,每个脉冲信号的宽度由一个
    的头像 发表于 02-06 13:52 2137次阅读

    计算机快速全息生成技术研究

    快速全息生成技术依赖于计算机生成的全息影像 (CGH) 的快速创建。目前,基于光线追踪的计算机生成全息图的快速生成方法仍基于非物理光线追踪方法
    的头像 发表于 12-12 11:15 439次阅读
    计算机快速全息<b class='flag-5'>生成</b>技术研究

    php生成动态网页内容的方法

    PHP是一种广泛用于Web开发的脚本语言,可用于生成动态网页内容。在本文中,我们将介绍使用PHP生成动态网页内容的方法。 什么是动态网页? 动态网页是一种可以根据用户请求和其他变量动态生成
    的头像 发表于 12-04 16:22 714次阅读

    Python生成器的使用方法

    举一个例子,编写一个函数计算一串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的: In [ 66 ]: def f1 ( x ): ....: return sum ( c
    的头像 发表于 11-03 15:41 407次阅读

    Python中元类的作用

    1.什么是类 在理解元类之前,我们必须先掌握Python中的类(class)。 和大多数语言一样,Python中的类知识用来描述如何“生成一个对象”: 但是,在Python中,类不仅能
    的头像 发表于 11-02 11:18 414次阅读
    <b class='flag-5'>Python</b>中元类的<b class='flag-5'>作用</b>

    如何用Python自动套用模板批量生成PDF文档

    办最高效的事。 今天就给大家讲讲如何用Python自动套用模板批量生成下方这样的PDF文档。 1.准备 开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章: 超详细
    的头像 发表于 10-31 10:56 1322次阅读
    如何用<b class='flag-5'>Python</b>自动套用模板批量<b class='flag-5'>生成</b>PDF文档

    基于 TouchGFX 生成的代码中添加触摸功能的方法

    基于 TouchGFX 生成的代码中添加触摸功能的方法
    的头像 发表于 10-27 09:21 733次阅读
    基于 TouchGFX <b class='flag-5'>生成</b>的代码中添加触摸功能的<b class='flag-5'>方法</b>

    如何用Python自动套用模板批量生成PDF文档

    今天就给大家讲讲如何用Python自动套用模板批量生成的PDF文档。 1.准备 开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章: 超详细Python
    的头像 发表于 10-17 10:54 828次阅读
    如何用<b class='flag-5'>Python</b>自动套用模板批量<b class='flag-5'>生成</b>PDF文档