【特征工程】特征衍生+案例

这篇博客探讨了特征工程中的特征衍生方法,包括特征扩展、合成特征和特征组合。作者强调了从原始数据中构建有意义的特征的重要性,并提供了实操案例,展示了如何将基础特征扩展成千上万个变量。此外,还提到了自动衍生工具Featuretools在特征生成中的应用,以及离散特征自动化扩展与组合的策略。
摘要由CSDN通过智能技术生成

在这里插入图片描述
问:特征衍生上千、万的变量,是怎么做的?
问:大家是如何衍生出成千上万个变量的?衍生变量是怎么生成的?

研习社-上海-桂浩:
请教一个问题,大家是如何衍生出成千上万个变量的?衍生变量是怎么生成的
云何-simple:
这是特征工程阶段所要做的事情
研习社-上海-桂浩:
基于时间的维度细分,组合一些基础变量等等
研习社-杭州-小五:
可以用sql,也可以用python,自己熟悉的就行啊
研习社-杭州-小五:
先自己写一个大概的衍生框架,然后根据框架写代码就好了
云何-simple:
需要衍生哪些特征 这个是重点

关键词

  特征衍生、特征构建、合成特征、特征组合、自动化特征衍生

特征衍生

  在实际业务中,通常我们只拥有几个到几十个不等的基础变量,而多数变量没有实际含义,不适合直接建模,如用户地址(多种属性值的分类变量)、用户日消费金额(弱数值变量)。而此类变量在做一定的变换或者组合后,往往具有较强的信息价值,对数据敏感性和机器学习实战经验能起到一定的帮助作用。所以我们需要对基础特征做一些衍生类的工作,也就是业内常说的如何生成万维数据。

  特征衍生也叫特征构建,是指从原始数据中构建新的特征,也属于特征选择的一种手段。特征构建工作并不完全依赖于技术,它要求我们具备相关领域丰富的知识或者实践经验,基于业务,花时间去观察和分析原始数据,思考问题的潜在形式和数据结构,从原始数据中找出一些具有物理意义的特征。

  找到可以拓展的基础特征后,便可用如下几种方式衍生特征:

  • 特征扩展
  • 合成特征
  • 特征组合
  • 特征交叉

  乍一听,挺难懂,这都什么东西,有什么区别?其实这些概念基本都一个意思,就一些小细节会有不同。有笔者说:合成特征 (synthetic feature)和特征组合(Feature Crosses)不太一样,特征交叉是特征组合的一个子集。

  我们今天,简单讲3个概念:

1.特征扩展

  基于一个特征,使用特征值打平(扩展)的方式衍生多个标注类型的特征,也可以理解为离散化。对于分类变量,直接one-hot编码;对于数值型特征,离散化到几个固定的区间段,然后用one-hot编码。比如信贷场景逾期天数:

  这里可以起到两个作用:①把线性函数转换成分段阶跃函数,减少过拟合。 ②标注 ,方便后续特征交叉组合

2.特征组合

  指将两个或多个输入特征通过数学运算进行组合。分为如下几种情况:

  • 数值运算
    • 如对特征进行加,减,乘,除
  • 特征交叉
    • 对多个特征进行交叉组合,或做交,并,补,笛卡尔集等运算。(可参考后面案例)
    • 暴力交叉,暴力交叉可能产生稀疏问题。

  在实践中,扩展线性模型时辅以特征组合一直都是训练大规模数据集的有效方法,机器学习模型很少会组合连续特征。不过,机器学习模型却经常组合独热特征矢量,将独热特征矢量的特征组合视为逻辑连接。

3.合成特征

  合成特征的思想很简单,通过将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征。是一种让线性模型学习到非线性特征的方式:包括以下类型:

  • 将一个特征与其本身或其他特征相乘(称为特征组合)。比如属性A有三个特征,属性B有两个特征,笛卡尔积后就有六个组合特征。
  • 两个特征相除。
  • 对连续特征进行分桶,以分为多个区间分箱。

  说明: 通过标准化或缩放单独创建的特征不属于合成特征。

  说明: 合成特征与组合特征关系在于:特征组合广义上包含合成特征,合成特征则改变了特征的线性关系,属于无中生有。

自动衍生

  包括自动衍生和深度衍生的方法,可以缩减时间成本,构建维度更广更全面的新生特征。具体可以参考:Featuretools

实操案例

  下面,我们基于用户特征扩展、特征组合等方法,对单个用户常见的运营商数据中的通话日志信息account_info,做一个特征衍生的案例。

  我们可以看到,用户通话信息宽表中的基础特征只有9个,而且在没做变换之前,多数特征不能直接使用。因此,我们用上述几种方法展开这个宽表。

#特征衍生1,更改字段含义,离散化特征,去除边缘数据的影响
tmp1['cutoff_date']      = self.cutoff_date
tmp1['call_time']        = tmp1['call_time'].map(lambda x : int(x))
tmp1['call_type_name']   = np.where(tmp1['call_type_name'] =='主叫','callout','callin')
tmp1['call_land_type']   = tmp1[['call_address','contact_area']].apply(lambda x : 'local' if x['call_address'] == x['contact_area'] else 'inland',axis = 1)
tmp1['call_time_type']   = tmp1['call_time'].map(lambda x : 'short' if int(x) <60 else 'midle' if int(x)<300 else 'long')
tmp1['contact_type']     = tmp1['contact_type'].fillna('')
tmp1['call_special']     = np.where(tmp1['contact_type'].str.contains('借贷'),'special','normal')
tmp1['call_period']      = tmp1['call_start_time'].apply(lambda x: 'night' if 0<int(pd.to_datetime(x).<
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值