太阳娯乐城登录网址_太阳集团太阳娱乐登录_首页官网

技术专栏

当前位置:太阳娯乐城登录网址 > 技术专栏 > 特征工程几乎完全是人工,都能深深体会特征工

特征工程几乎完全是人工,都能深深体会特征工

来源:http://www.chenghua543.com 作者:太阳娯乐城登录网址 时间:2019-10-10 08:25

客户:即有关信贷联盟中客户的基本信息。每个客户在此数据框中只有一行。

分析上面的两张图片,左图展示了20世纪初一群人在组装汽车,右图展示了如今机器人在做着同样工作。自动化任何流程都有可能使其更加高效且节约成本。同样地,特征工程可以并且已经在机器学习中实现自动化。

深度特征合成实现了多重转换和聚合操作(在featuretools的词汇中称为特征基元),通过分布在许多表中的数据来创建特征。像机器学习中的大多数观念一样,它是建立在简单概念基础上的复合型方法。通过一次学习一个构造块的示例,我们就会容易理解这种强大的方法。

xtrain, xvalid, ytrain, yvalid = train_test_split(train, sales,

编译:张弛、倪倪、笪洁琼、夏雅薇

2. Hour Bins:类似地,温度变量的分箱特征;

featuretools的前两个概念是实体和实体集。实体只是一个表(如果用Pandas库的概念来理解,实体是一个DataFrame(数据框))。

fromsklearn.model_selection importtrain_test_split

stats.head(10)

图片 1

EntitySet(实体集)是表的集合以及它们之间的关系。可以将实体集视为另一个Python数据结构,该结构具有自己的方法和属性。)

这只是利用已有特征创建新特征的一个简单示例,而在实际应用中,当特征数量较多时,特征工程可能会变得相当复杂和繁琐。

首先,我们来看看我们的示例数据。 我们已经看到了上面的一些数据集,完整的表集合如下:

print(es)

构建特征的过程非常地耗时,因为每个特征的构建通常需要一些步骤来实现,尤其是使用多个表中的信息时。我们可以将特征创建的步骤分为两类:转换和聚合。让我们看几个例子来了解这些概念的实际应用。

Featuretools

千看不如一练,熟悉Featuretools的最佳方法是多在数据集中尝试。因此,我们会在下部分使用BigMart Sales数据集来巩固概念。

stats = loans.groupby('client_id')['loan_amount'].agg(['mean', 'max', 'min'])

这个模型在公共排行榜上的得分为1155.12。在没有任何特征工程的情况下,在验证集和公共排行榜上的得分大约分别为1103和1183。因此,Featuretools创建的特征不只是随机特征,它们非常有价值和有效果。最重要的是,它在特征工程中节省的时间是令人难以置信的。

通常,特征工程是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理。这个过程可能非常繁琐,而且最终的特征将受到人类主观性和时间的限制。自动化特征工程旨在通过从数据集中自动创建许多候选特征来帮助数据科学家,并从中可以选择最佳特征用于训练。

原标题:手把手教你用Python实现自动特征工程

完整代码:

additional_variables =

特征工程基础

max_depth = 2,

# Create new entityset

index = 'id')

stats.columns = ['mean_loan_amount', 'max_loan_amount', 'min_loan_amount']

# imputing missing data

import pandas as pd

6.Featuretools实现

# Create an entity from the client dataframe

pip install featurePython

实体和实体集

combi.isnull().sum()

图片 2

combi[ 'Item_Weight'].fillna(combi[ 'Item_Weight'].mean(),

特征工程意味着从现有数据中构建额外特征,这些数据通常分布在多个相关表中。特征工程需要从数据中提取相关信息并将其放入单个表中,然后可以使用该表来训练机器学习模型。

这个数据帧存在一个问题,即未正确排序。我们必须根据combi数据帧中的id变量对其进行排序。

# This dataframe already has an index and a time index

4.自动特征工程

如果我们有机器学习目标,例如预测客户是否将偿还未来贷款,我们希望将有关客户的所有信息组合到一个表中。这些表是相关的(通过client_id和loan_id变量),目前我们可以手动完成一系列转换和聚合过程。然而,不久之后我们就可以使用featuretools来自动化该过程。

现在我们要使用DFS来自动创建新特征。上面提到,DFS使用特征基元和实体集中给出的多个表来创建特征。

现在我们添加实体。每个实体都必须有一个索引,该索引是一个包含所有唯一元素的列。也就是说,索引中的每个值只能出现在表中一次。

原作 Prateek Joshi

图片 3

下面打印出实体集EntitySet的组成。

图片 4

看下这些新创建的特征

在本文中,我们将使用Python 的featuretools库进行自动化特征工程的示例。我们将使用示例数据集来演示基础知识。

图片 5

我们可以使用以下命令在featuretools中创建一个空实体集:

如上所示,它包含两个实体,为bigmart和outlet。这两个表之间也形成了一种关系,用Outlet_Identifier连接。这种关系将在生成新特征中发挥关键作用。

此过程包括通过客户信息对贷款表进行分组,计算聚合,然后将结果数据合并到客户数据中。以下是我们如何使用Pandas库在Python中执行此操作。

# identifying categorical features categorical_features = np.where(train.dtypes == 'object')[0]

另一方面,聚合作用于多个表,并使用一对多的关系对观测值进行分组,然后计算统计数据。例如,如果我们有另一个包含客户贷款的信息表格,其中每个客户可能有多笔贷款,我们可以计算每个客户的贷款的平均值,最大值和最小值等统计数据。

random_seed= 7)

大数据文摘出品

feature_matrix = feature_matrix.reindex(index=combi[ 'id']) feature_matrix = feature_matrix.reset_index()

图片 6

特征工程可以简单定义为从数据集的已有特征创建新特征的过程

特征工程也称为特征创建,是从现有数据构建新特征以训练机器学习模型的过程。这个步骤可能比实际应用的模型更重要,因为机器学习算法只从我们提供的数据中学习,然而创建与任务相关的特征绝对是至关重要的。

feature_matrix.head()

# Group loans by client id and calculate mean, max, min of loans

实际上,这些姓名可以分解为其他有意义的特征。比如,我们把相似称号提取并分到单个类别。下面是乘客姓名中各个称号的对应频率。

付款:即支付贷款。 每笔支付只有一行记录,但每笔贷款都有多笔支付记录。

6.6 构建模型

es = es.entity_from_dataframe(entity_id = 'clients', dataframe = clients, index = 'client_id', time_index = 'joined')

我们已经了解自动特征工程十分有用,那你可能会问,该如何把它应用到模型中?别担心,已经有一个很好的Python工具库解决了这个问题,那就是Featuretools。

stats = clients.merge(stats, left_on = 'client_id', right_index=True, how = 'left')

最后,训练模型时,我们使用的评估指标是RMSE(均方根误差)。

clients数据框中的索引是client_id,因为每个客户在此数据框中只有一行。 我们使用以下语法将一个现有索引的实体添加到实体集中:

图片 7

例如,如果我们有如下客户表。

总结

原标题:如何用Python做自动化特征工程

n_jobs = 3)

手动特征工程的更多信息:

test_Item_Identifier = test[ 'Item_Identifier'] test_Outlet_Identifier = test[ 'Outlet_Identifier']

import featuretools as ft

训练完成后,模型在验证集上的RMSE值大约为1092.24。

图片 8

Featuretools适用于Python 2.7、3.5和3.6,可使用pip命令快速安装Featuretools。

这些操作本身并不困难,但如果我们有数百个变量分布在几十个表中,那么这个过程要通过手工完成是不可行的。理想情况下,我们需要一种能够跨多个表自动执行转换和聚合的解决方案,并将结果数据合并到一个表中。尽管Pandas库是一个很好的资源,但通过我们手工完成的数据操作是有限的。

图片 9

图片 10

如果能创建新特征来帮助向模型提供有关目标变量的更多信息,那么它的性能将会提升。因此,当数据集中没有足够有用特征时,我们必须依靠特征工程。

我们可以通过查找joined列的月份或是获取income列的自然对数来创建特征。这些都是转换,因为它们仅使用来自一个表的信息。

数据集下载地址:

对于数据集,必须具有唯一标识符特征,但是我们的数据集目前还没有。因此,我们要为这个组合数据集创建唯一ID。你可能会注意到,数据集中有两个ID,一个用于item,另一个用于outlet。因此,对这两者简单相加会得到一个唯一ID。

幸运的是,featuretools正是我们正在寻找的解决方案。这个开源Python库将自动从一组相关表中创建许多特征。Featuretools基于一种称为“深度特征合成”的方法,这个名字听起来比实际的用途更令人印象深刻

特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程。Prateek Joshi,是一名数据科学家,花了不少时间研究多种特征,并从不同角度分析其可行性。

combi = train.append(test, ignore_index= True)

图片 11

责任编辑:

# Merge with the clients dataframe

接着把feature_matrix分解为训练集和测试集。

es = ft.EntitySet(id = 'clients')

接着,我们要创建一个实体集EntitySet。实体集是一种包含多个数据帧及其之间关系的结构。那么,我们创建一个EntitySet并添加数据帧组合。

机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理。而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练那样能产生直接可用的结果。本文作者将使用Python的featuretools库进行自动化特征工程的示例。

es.normalize_entity(base_entity_id= 'bigmart',

机器学习越来越多地从手动设计模型转变为使用H20,TPOT和auto-sklearn等工具来自动优化的渠道。这些库以及随机搜索等方法旨在通过查找数据集的最优模型来简化模型选择和转变机器学习的部分,几乎不需要人工干预。然而,特征工程几乎完全是人工,这无疑是机器学习管道中更有价值的方面。

我们数据中包含两个级别的信息,即 item级别和 outlet级别。Featuretools能把一个数据集拆分成多个表格。我们根据outlet ID Outlet_Identifier从BigMart表中创建一个新表“outlet”。

loans数据框还具有唯一索引loan_id,并且将其添加到实体集的语法与clients相同。但是,对于payments数据框,没有唯一索引。当我们将此实体添加到实体集时,我们需要传入参数make_index

True并指定索引的名称。此外,虽然featuretools会自动推断实体中每列的数据类型,但我们可以通过将列类型的字典传递给参数variable_types来覆盖它。

# Create an entity from the payments dataframe

# This does not yet have a unique index

es = es.entity_from_dataframe(entity_id = 'payments',

dataframe = payments,

variable_types = {'missed': ft.variable_types.Categorical},

make_index = True,

index = 'payment_id',

time_index = 'payment_date')

对于这个数据框,即使missed 的类型是一个整数,但也不是一个数字变量,因为它只能取2个离散值,所以我们告诉featuretools将缺失数据视作是一个分类变量。将数据框添加到实体集后,我们检查它们中的任何一个:

图片 12

使用我们指定的修改模型能够正确推断列类型。接下来,我们需要指定实体集中的表是如何相关的。

数据表之间的关系

考虑两张数据表之间关系的最佳方式是用父对子的类比 。父与子是一对多的关系:每个父母可以有多个孩子。在数据表的范畴中,父表的每一行代表一位不同的父母,但子表中的多行代表的多个孩子可以对应到父表中的同一位父母。

例如,在我们的数据集中,clients客户数据框是loan 贷款数据框的父级,因为每个客户在客户表中只有一行,但贷款可能有多行。

同样,贷款loan数据是支付payments数据的父级,因为每笔贷款都有多笔付款。父级数据表通过共享变量与子级数据表关联。当我们执行聚合操作时,我们通过父变量对子表进行分组,并计算每个父项的子项之间的统计数据。

我们只需要指明将两张数据表关联的那个变量,就能用featuretools来建立表格见的关系 。

客户clients数据表和贷款loans数据表通过变量client_id

相互关联,而贷款loans数据表和支付payments数据表则通过变量loan_id相互关联。以下是建立关联并将其添加到entiytset的语法:

# Relationship between clients and previous loans

r_client_previous = ft.Relationship(es['clients']['client_id'],

es['loans']['client_id'])

# Add the relationship to the entity set

es = es.add_relationship(r_client_previous)

# Relationship between previous loans and previous payments

r_payments = ft.Relationship(es['loans']['loan_id'],

es['payments']['loan_id'])

# Add the relationship to the entity set

es = es.add_relationship(r_payments)

es

图片 13

现在,在entityset中包含了三张数据表,以及三者间的关系。在添加entities并建立关联后,我们的entityset就算完成了,可以开始建立特征量了。

特征基元

在我们完全深入进行特征合成之前,我们需要了解特征基元。我们已经知道它们是什么了,但我们刚刚用不同的名字来称呼它们!这些只是我们用来形成新功能的基本操作:

聚合:基于父表与子表(一对多)关系完成的操作,按父表分组,并计算子表的统计数据。一个例子是通过client_id对贷款loan表进行分组,并找到每个客户的最大贷款额。

转换:在单个表上对一列或多列执行的操作。一个例子是在一个表中取两个列之间的差异或取一列的绝对值。

在featuretools中使用这些基元本身或堆叠多个基元,来创建新功能。下面是featuretools中一些特征基元的列表(我们也可以定义自定义基元)

图片 14

这些原语可以单独使用,也可以组合使用来创建特征量。要使用指定的基元制作特征,我们使用ft.dfs函数(代表深度特征合成)。我们传入entityset,target_entity,这是我们要添加特征的表,选择的trans_primitives(转换)和agg_primitives(聚合):

# Create new features using specified primitives

features, feature_names = ft.dfs(entityset = es, target_entity = 'clients',

agg_primitives = ['mean', 'max', 'percent_true', 'last'],

trans_primitives = ['years', 'month', 'subtract', 'divide'])

结果是每个客户端的新特征数据框(因为我们使客户端成为target_entity)。例如,我们有每个客户加入的月份,这是由转换特征基元生成的:

图片 15

我们还有许多聚合基元,例如每个客户的平均付款金额:

图片 16

尽管我们只指定了一些特征基元,但featuretools通过组合和堆叠这些基元创建了许多新特征。

图片 17

深度特征合成

我们现在已经做好准备来理解深度特征合成(dfs)。实际上,我们已经在之前的函数调用中执行了dfs!深度特征仅仅是堆叠多个基元的特征,而dfs是制作这些特征的过程名称。深度特征的深度是制作特征所需的基元的数量。

例如,MEAN(payments.payment_amount)列是深度为1的深层特征,因为它是使用单个聚合创建的。深度为2的特征是LAST(贷款(MEAN(payments.payment_amount))这是通过堆叠两个聚合来实现的:最后一个(最近的)在MEAN之上。这表示每个客户最近贷款的平均支付额。

图片 18

我们可以将功能堆叠到我们想要的任何深度,但在实践中,我从未用过超过2的深度。在此之后,生成的特征就很难解释,但我鼓励任何有兴趣的人尝试“更深入” 。

我们不必手动指定特征基元,而是可以让featuretools自动为我们选择特征。我们可以使用相同的ft.dfs函数调用,但不传入任何特征基元:

# Perform deep feature synthesis without specifying primitives

features, feature_names = ft.dfs(entityset=es, target_entity='clients',

max_depth = 2)

features.head()

图片 19

Featuretools为我们构建了许多新特征。虽然此过程会自动创建新特征,但仍需要数据科学家来弄清楚如何处理所有这些特征。例如,如果我们的目标是预测客户是否会偿还贷款,我们可以寻找与指定结果最相关的特征。此外,如果我们有领域知识,我们可以使用它来选择特定的特征基元或种子深度特征合成候选特征。

下一步

自动化特征工程虽然解决了一个问题,但又导致了另一个问题:特征太多。虽然在拟合模型之前很难说哪些特征很重要,但很可能并非所有这些特征都与我们想要训练模型的任务相关。此外,特征太多可能会导致模型性能不佳,因为一些不是很有用的特征会淹没那些更重要的特征。

特征过多的问题被称为维度诅咒 。随着特征数量的增加(数据的维度增加),模型越来越难以学习特征和目标之间的映射。实际上,模型执行所需的数据量随着特征数量呈指数级增长。

维度诅咒与特征缩减(也称为特征选择)相对应:删除不相关特征的过程。特征选择可以采用多种形式:主成分分析(PCA),SelectKBest,使用模型中的特征重要性,或使用深度神经网络进行自动编码。但是,减少功能是另一篇文章的另一个主题。目前,我们知道我们可以使用featuretools以最小的努力从许多表创建许多功能!

结论

与机器学习中的许多主题一样,使用featuretools的自动化特征工程是一个基于简单想法的复杂概念。使用实体集,实体和关系的概念,featuretools可以执行深度特征合成以新建特征。

聚合就是将深度特征合成依次将特征基元堆叠 ,利用了跨表之间的一对多关系,而转换是应用于单个表中的一个或多个列的函数,从多个表构建新特征。

在以后的文章中,我将展示如何使用这种技术解决现实中的问题,也就是目前正在Kaggle上主持的Home Credit Default Risk竞赛。请继续关注该帖子,同时阅读此介绍以开始参加比赛!我希望您现在可以使用自动化特征工程作为数据科学管道的辅助工具。模型的性能是由我们提供的数据所决定的,而自动化功能工程可以帮助提高建立新特征的效率。

有关featuretools的更多信息,包括高级用法,请查看在线文档:

要了解功能工具在实践中的使用方式,请阅读开源库背后的公司Feature Labs的工作:

相关报道:

)

责任编辑:

变量Item_Weight和Outlet_size中有相当多缺失值,用下面方法快速处理:

转换作用于单个表(从Python角度来看,表只是一个Pandas 数据框),它通过一个或多个现有的列创建新特征。

dataframe = combi,

贷款:即客户贷款。每项贷款在此数据框中只有自己单独一行的记录,但客户可能有多项贷款。

combi[ 'Outlet_Size'].fillna( "missing", inplace = True)

下面是另一个例子。在经典的Titanic数据集中,有个特征为乘客姓名,下面是这个数据集中的一些名字:

7 Featuretools可解释性

# validation score

Featuretools是一个用于执行自动特征工程的开源库,旨在快速推进特征生成过程,从而有更多时间专注于机器学习模型构建的其他方面。

# removing uneccesary variables

DFS在这么短的时间内创建了29个新特征,而手动操作需要更长时间。如果数据集包含多个相互关联的表,Featuretools仍然有效。在这种情况下,你不必对表进行标准化,因为多个表已经可用。

现在,数据帧feature_matrix已正确排序。

train.drop([ 'Item_Outlet_Sales'], axis= 1, inplace= True)

然后把训练数据拆分为训练和验证集,并本地验证模型性能。

'low fat': 0}

下面会使用Python特征工程库Featuretools来实现这个任务。在讨论之前,我们先介绍特征工程的基本组成,再用直观例子来理解它们,最后把自动特征工程应用到BigMart Sales数据集中验证实际效果。

本文目录

# saving identifiers

图片 20

# dictionary to replace the categories

sales = train[ 'Item_Outlet_Sales']

图片 21

这里不会涉及过多预处理操作,因为本文的主要目的是介绍Featuretools。

feature_matrix.iloc[:,i]=feature_matrix.iloc[:,i].astype( 'str')

4. Day Type:当天类型,分为工作日、周末和假日。

2 特征工程

欢迎大家在处理数据集时尝试下这种方法!

1 特征

分享全文见:

在机器学习中,特征可以描述为解释现象发生的一组特点。当这些特点转换为一些可测量的形式时,它们就称作特征。

fori incategorical_features:

importnumpy asnp

verbose = 1,

5.Featuretools简介

6.4 数据预处理

图片 22

model_cat = CatBoostRegressor(iterations= 100, learning_rate= 0.3,

# adding a dataframe

构建机器学习模型通常是一个艰苦且乏味的过程。它涉及多个步骤,因此如果我们能够自动执行一定比例的特征工程任务,那么数据科学家或工程师可以专注于模型的其他方面。

5 Featuretools简介

'Outlet_Location_Type', 'Outlet_Type'])

6 Featuretools实现

图片 23

本文由太阳娯乐城登录网址发布于技术专栏,转载请注明出处:特征工程几乎完全是人工,都能深深体会特征工

关键词:

上一篇:没有了

下一篇:没有了