使用Python中的Featuretools实现自动化特征工程的实用指南

扶桑
11个月前 阅读 1049 点赞 1

任何参与机器学习黑客马拉松和竞赛的人都知道特征工程的重要性。自从我意识到它具有巨大的潜力以来,我一直是特征工程的巨大倡导者。但手动完成时,这可能是一个缓慢而艰巨的过程。我必须花时间集思广益,讨论哪些功能,并从不同的角度分析它们的可用性。现在,整个FE(Feature Engineering,特征工程)流程都可以实现自动化,我将在本文中向您展示。

                                                                          资料来源:VentureBeat

我们将使用名为Featuretools的Python特征工程库来执行此操作。但在我们开始讨论之前,我们首先要看一下FE的基本构建模块,用直观的例子来理解它们,然后最后使用BigMart Sales数据集深入了解自动化特征工程的可怕世界。

目录

  1. 什么是feature?
  2. 什么是特征工程?
  3. 为什么需要特征工程?
  4. 自动化特征工程
  5. Featuretools简介
  6. Featuretools的实现
  7. Featuretools可解释性

1.什么是feature?

在机器学习的背景下,feature即特征可以被描述为解释现象发生的特性(charactristic)或一组特性。当这些特性转换为某种可测量的形式时,它们被称为特征。

例如,假设您有一个学生列表。此列表包含每个学生的姓名,他们学习的小时数,他们的智商以及之前考试中的总分数。现在,您将获得有关新学生的信息 - 他/她学习的小时数和智商,但他/她的分数不见了。你必须估计他/她可能的分数。

在这里,您将使用IQ和study_hours构建预测模型来估计这些缺失的标记。因此,IQ和study_hours被称为此模型的特征。

2.什么是特征工程?

特征工程可以简单地定义为从数据集中的现有特征创建新特征的过程。让我们考虑一个样本数据,其中包含一些项目的详细信息,例如它们的重量和价格。

现在,要创建新特征,我们可以使用Item_Weight和Item_Price。那么,让我们创建一个名为Price_per_Weight的特征。它只是物品的价格除以物品的重量。此过程称为特征工程。

这只是从现有特征创建新特征的一个简单示例,但在实践中,当我们拥有相当多的特征时,特征工程可能变得非常复杂和繁琐。

让我们再看一个例子。在流行的泰坦尼克号数据集(Titanic dataset)中,有一个乘客姓名特征,下面是数据集中的一些名称:

  • Montvila, Rev. Juozas
  • Graham, Miss. Margaret Edith
  • Johnston, Miss. Catherine Helen “Carrie”
  • Behr, Mr. Karl Howell
  • Dooley, Mr. Patrick

这些名称实际上可以分解为其他有意义的特征。例如,我们可以将类似的标题提取并分组为单个类别。让我们来看看乘客姓名中的唯一标题数量。

事实证明,'Dona','Lady','Countess','Capt','Col','Don','Dr','Major','Rev','Sir'和'Jonkheer '非常罕见,可以放在一个标签下。我们称之为rare_title。除此之外,标题'Mlle'和'Ms'可以放在'Miss'下,'Mme'可以用'Mrs'替换。

因此,新标题功能将只有5个唯一值,如下所示:

因此,这就是我们如何借助特征工程提取有用的信息,甚至是最初看起来毫无意义的乘客名称等特征。

3.为什么需要特征工程?

预测模型的性能在很大程度上取决于用于训练该模型的数据集中的特征的质量。如果您能够创建新特征以帮助向模型提供有关目标变量的更多信息,那么它的性能将会得到提升。因此,当我们的数据集中没有足够的有质量特征时,我们必须依靠特征工程。

在一场最受欢迎的Kaggle竞赛——自行车共享需求预测中,参与者被要求根据与天气,时间和其他数据相关的历史使用模式预测华盛顿特区的租赁需求。

正如本文所述,智能特征工程有助于确保排行榜前5%的位置。创建的一些特征如下:

  1. 小时分档:通过在决策树的帮助下分组 hour 特征来创建新特征
  2. 温度分档:类似地,温度变量的分档特征
  3. 年度分档:创建了8个季度分档,为期2年
  4. 日类型:日被分类为“工作日”,“周末”或“假日”

创建这样的特征并不是一件容易的事 - 它需要大量的头脑风暴和广泛的数据探索。并非所有人都擅长特征工程,因为通过阅读书籍或观看视频,您无法学到这些东西。这就是特征工程也被称为艺术的原因。如果你擅长它,那么你在竞争中占据优势。就像罗杰·费德勒(Roger Federer)一样,在网球拍摄方面的特征工程大师。

4.自动化特征工程

分析上面显示的两个图像。左图显示了20世纪初由一群人组装的汽车,右边的图片展示了机器人在当今世界中做同样的工作。自动化有可能使任何流程更加高效和节约成本。出于类似的原因,特征工程可以并且已经在机器学习中自动化。

构建机器学习模型通常是一个艰苦而乏味的过程。它涉及许多步骤,因此如果我们能够自动执行一定比例的特征工程任务,那么数据科学家或领域专家可以专注于模型的其他方面。听起来好得令人难以置信,对吧?

下一个要问的问题是 - 它是如何工作的?好吧,我们有一个很好的工具来解决这个问题,它被称为Featuretools。

5. Featuretools简介

Featuretools是一个用于执行自动化特征工程的开源库。它是一个很好的工具,旨在快速推进特征生成过程,从而有更多时间专注于机器学习模型构建的其他方面。换句话说,它使您的数据“机器学习准备就绪”。

在使用Featuretools进行转换之前,我们应该注意该库的三个主要组件:

  • 实体
  • 深度特征合成(DFS)
  • 特征基元

a)实体  可以被视为Pandas DataFrame的表示。多个实体的集合称为Entityset

b)深度特征合成  (DFS)与深度学习无关。别担心。DFS实际上是一种特征工程方法,是Featuretools的支柱。它支持从单个数据帧和多个数据帧创建新特征。

c)DFS通过将Feature原语应用于EntitySet中的实体关系来创建特征。这些原语是手动生成特征的常用方法。例如,原语“mean”将在聚合层找到变量的均值。

了解Featuretools并使其熟悉的最佳方法是将其应用于数据集。因此,我们将在下一节中使用我们的BigMart销售实践问题  中的数据集来巩固我们的概念。

6. Featuretools的实现

BigMart Sales面临的挑战是建立一个预测模型来估算特定商店中每种产品的销售额。这将有助于BigMart的决策者找出任何产品或商店的属性,这对提高整体销售起着关键作用。请注意,给定数据集中的10个商店中有1559种产品。

下表显示了我们数据中提供的特征:

您可以从这里下载数据。

6.1 安装

Featuretools适用于Python 2.7,3.5和3.6。您可以使用pip轻松安装Featuretools。

pip install featuretools

6.2 加载所需的库和数据

import featuretools as ft
import numpy as np
import pandas as pd

train = pd.read_csv("Train_UWu5bXk.csv")
test = pd.read_csv("Test_u94Q5KV.csv")

6.3 数据准备

首先,我们将目标Item_Outlet_Sales存储在test_Item_Identifier和test_Outlet_Identifier中名为sales和id变量的变量中。

# saving identifiers
test_Item_Identifier = test['Item_Identifier']
test_Outlet_Identifier = test['Outlet_Identifier']
sales = train['Item_Outlet_Sales']
train.drop(['Item_Outlet_Sales'], axis=1, inplace=True)

然后我们将组合训练和测试集,因为它为我们省去了两次执行相同步骤的麻烦。

combi = train.append(test,ignore_index = True

让我们检查数据集中的缺失值。

combi.isnull()。总和()

Item_Weight和Outlet_size变量中有相当多的缺失值。让我们快速处理它们:

# imputing missing data
combi['Item_Weight'].fillna(combi['Item_Weight'].mean(), inplace = True)
combi['Outlet_Size'].fillna("missing", inplace = True)

6.4 数据预处理

我不会进行广泛的预处理操作,因为本文的目的是让您开始使用

combi['Item_Fat_Content'].value_counts()

似乎Item_Fat_Content只包含两个类别,即“Low Fat”和“Regular” - 其余的我们将多余。所以,让我们把它转换成二进制变量。

# dictionary to replace the categories
fat_content_dict = {'Low Fat':0, 'Regular':1, 'LF':0, 'reg':1, 'low fat':0}

combi['Item_Fat_Content'] = combi['Item_Fat_Content'].replace(fat_content_dict, regex=True)

6.5 使用Featuretools进行特征工程

现在我们可以开始使用Featuretools来执行自动化特征工程了!在数据集中必须具有唯一标识符功能(我们的数据集现在没有任何权限)。因此,我们将为组合数据集创建一个唯一ID。如果您注意到,我们的数据中有两个ID - 一个用于项目,另一个用于出口。因此,简单地连接两者将为我们提供唯一的ID。

combi ['id'] = combi ['Item_Identifier'] + combi ['Outlet_Identifier']
combi.drop(['Item_Identifier'],axis = 1,inplace = True)

请注意,由于不再需要,我删除了特征Item_Identifier。但是,我保留了Outlet_Identifier特征,  因为我打算稍后再使用它。

在继续之前,我们将不得不创建一个EntitySet。EntitySet是一种包含多个数据帧及其之间关系的结构。那么,让我们创建一个EntitySet并将数据帧组合添加到它。

# creating and entity set 'es'
es = ft.EntitySet(id = 'sales')

# adding a dataframe 
es.entity_from_dataframe(entity_id = 'bigmart', dataframe = combi, index = 'id')

我们的数据包含两个级别 - 项目级别和出口级别的信息。Featuretools提供了将数据集拆分为多个表的特征。我们根据出口ID Outlet_Identifier从BigMart表创建了一个新表'outlet' 。

es.normalize_entity(base_entity_id ='bigmart',new_entity_id ='outlet'index ='Outlet_Identifier', 
additional_variables = ['Outlet_Establishment_Year''Outlet_Size''Outlet_Location_Type''Outlet_Type'])

让我们检查一下EntitySet的摘要。

print(es)

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

现在我们将使用Deep Feature Synthesis自动创建新特征。回想一下,DFS使用Feature Primitives来创建使用EntitySet中存在的多个表的特征。

feature_matrix,feature_names = ft.dfs(entityset = es, 
target_entity ='bigmart', 
max_depth = 2, 
verbose = 1, 
n_jobs = 3)

target_entity只是我们希望为其创建新特征的实体ID(在这种情况下,它是实体'bigmart')。参数max_depth  控制通过堆叠基元生成的要素的复杂性。参数n_jobs通过使用多个核来帮助并行进行特征计算。

这就是你与Featuretools所做的一切。它自己产生了许多新特征。

我们来看看这些新创建的特征。

feature_matrix.columns

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

让我们打印feature_matrix的前几行。

feature_matrix.head()

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

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

现在数据帧feature_matrix的顺序正确。

6.6 构建模型

现在是检查这些生成的特征实际有用的时候了。我们将使用它们来构建模型并预测Item_Outlet_Sales。由于我们的最终数据(feature_matrix)具有许多分类特征,因此我决定使用CatBoost算法。它可以直接使用分类特征,并且本质上是可扩展的。您可以参考这篇文章来阅读有关CatBoost的更多信息。

from catboost import CatBoostRegressor

CatBoost要求所有分类变量都采用字符串格式。因此,我们将首先将数据中的分类变量转换为字符串:

categorical_features = np.where(feature_matrix.dtypes =='object')[0]

for category in categorical_features:
    feature_matrix.iloc [:,i] = feature_matrix.iloc [:,i] .astype('str'

让我们将feature_matrix分解为训练集和测试集。

feature_matrix.drop(['id'], axis=1, inplace=True)
train = feature_matrix[:8523]
test = feature_matrix[8523:]


# removing uneccesary variables
train.drop(['Outlet_Identifier'], axis=1, inplace=True)
test.drop(['Outlet_Identifier'], axis=1, inplace=True)


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

将训练数据拆分为训练和验证集,以在本地检查模型的性能。

from sklearn.model_selection import train_test_split

# splitting train data into training and validation set
xtrain, xvalid, ytrain, yvalid = train_test_split(train, sales, test_size=0.25, random_state=11)

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

model_cat = CatBoostRegressor(iterations=100, learning_rate=0.3, depth=6, eval_metric='RMSE', random_seed=7)

# training model
model_cat.fit(xtrain, ytrain, cat_features=categorical_features, use_best_model=True)


# validation score
model_cat.score(xvalid, yvalid)

1091.244

验证集上的RMSE分数为~1092.24。

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

7.特征工具可解释性

使我们的数据科学解决方案可解释是执行机器学习的一个非常重要的方面。Featuretools生成的特征甚至可以很容易地解释为非技术人员,因为它们基于易于理解的基元。

例如,  outlet.SUM(bigmart.Item_Weight)  和outlet.STD(bigmart.Item_MRP)的特征分别  表示项目的权重和项目成本的标准偏差的出口级别总和。

这使得那些不是机器学习专家的人能够在他们的领域专业知识方面做出贡献。

小结

featuretools包真正改变了机器学习的游戏规则。虽然它的应用程序在行业用例中仍然受到限制,但它在黑客马拉松和ML竞赛中很快变得非常受欢迎。它节省的时间以及它产生的特征的实用性真正赢得了我的青睐。

下次处理任何数据集时可以尝试一下!


参考链接:https://www.analyticsvidhya.com/blog/2018/08/guide-automated-feature-engineering-featuretools-python/

| 1
登录后可评论,马上登录吧~
评论 ( 0 )

还没有人评论...

相关推荐