如何用Python做自动化特征工程,拓端数据tecdat

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

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

原文作者:Sunil Ray

在世界零售业发展史中,超级市场被称为继百货商店之后的第二次零售革命。在这个零售业的微利时代,如何分得一份羹是超市经营者研究重要课题。超市商品结构问题自然成为重中之重。对超市商品结构如何进行优化,进行综合评价,主成分分析法是一个重要的多元统计方法.本文就是应用主成分分析法对超市所经营的商品进行综合评判,用定量的方法对超市商品结构进行优化,使之在竞争中立于不败之地。

原作 Prateek Joshi

新浦京www81707con 1

译者:TalkingData 张永超

BigMart的数据科学家在不同城市的10家商店收集了1559种产品的2013年销售数据。此外,已经定义了每个产品和存储的某些属性。目的是建立一个预测模型,并找出每个产品在特定商店的销售。

王小新 编译自 Analytics Vidhya

大数据文摘出品

原文链接

使用这种模式,BigMart将尝试了解在增加销售中发挥关键作用的产品和商店的属性。

任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置。

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

从广义上讲,机器学习算法有三种类型:

数据

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

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

监督学习

我们有训练集(8523)和测试(5681)数据集,训练集数据集具有输入和输出变量。您需要预测测试数据集的销售额。

现在,整个特征工程过程可实现自动化,他将通过这篇文章进行详细介绍。

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

该算法是由一个目标/结果变量组成,该变量可以从一组给定的预测变量中预测出来。使用这些变量的组合,我们可以生成一个由输入映射到所需输出的的函数。该算法的训练过程会尝试将模型的预测准确度提高到训练数据所需的程度。具体的算法有:回归、决策树、随机森林、kNN、Logistic回归等等。

变量说明

新浦京www81707con 2

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

无监督学习

Item_Identifier唯一产品ID

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

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

该算法中,没有任何的目标/结果变量以用来预测/估计。基本上用于不同的群体间的聚类,通常该算法用于对不同的群体进行分组。具体的算法有:Apriori算法,K-means等。

Item_Weight产品重量

本文目录

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

强化学习

Item_Fat_Content产品是否为低脂肪

1.特征是什么

完整代码:

该算法是比较新的一个机器学习算法分类,使用该算法,机器会被训练来做出一些特定的决策。此时机器会被暴露在一个特定的环境中,通过反复试验不断的训练自己,知道最终得到一个比较好的决策结果。该算法会从过去的经验中学习,并尝试捕捉最佳的结果知识以做出更加准确的决策。典型的算法有:马尔可夫决策过程等。

Item_Visibility分配给特定产品的商店中所有产品的百分比

2.特征工程

下面是一些通用的机器学习算法,这些算法基本上能够解决大部分的数据相关问题:

Item_Type产品所属的类别

3.特征工程必要性

特征工程基础

  1. 线性回归(Linear Regression)

  2. 逻辑回归(Logistic Regression)

  3. 决策树(Decision Tree)

  4. 支持向量机

  5. 朴素贝叶斯(Naive Bayes)

  6. k近邻

  7. k均值

  8. 随机森林(Random Forest)

  9. 降维算法(Dimensionality Reduction Algorithms)

  10. 梯度增强算法(Gradient Boosting algorithms)

Item_MRP产品的最大零售价(定价)

4.自动特征工程

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

GBM

Outlet_Identifier唯一存储ID

5.Featuretools简介

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

XGBoost

Outlet_Establishment_Year商店的建立年份

6.Featuretools实现

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

LightGBM

Outlet_Size根据覆盖的地面面积的商店的大小

7.Featuretools可解释性

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

CatBoos

Outlet_Location_Type商店所在的城市类型

1 特征

新浦京www81707con 3

线性回归

Outlet_Type商店是只是一个杂货店或某种超市

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

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

线性回归主要用于根据连续的变量来估计实际值(例如:房屋成本,通话次数,总销售额等)。在该算法中,我们通过拟合最佳的分界线来建立独立变量和因变量之间的关系。该最佳的拟合线称为回归线,并可以由线性方程Y
= a * X +
b表示。例如:我们要求一个五年级的孩子根据班上同学的体重来排序,而不告诉他同学们的具体体重。他会怎么做呢?他可能会根据同学们的身高和体型来判断某个同学的体重,然后进行排序。我们并没有告诉他身高和体型与体重之间的关系,而他已经可以通过眼睛的观察来得到身高和体型与体重之间的关系了,而这个关系是符合上述线性回归的方程的。

Item_Outlet_Sales特定存储中的产品的销售。这是要预测的结果变量。

例如,在一个学生列表中,包含每个学生的姓名name、学习小时数study_hours、智商IQ和先前考试的总分数marks。现在给你一个新学生,他的信息只有学习小时数和智商,他的总分数缺失,你需要来估计他可能的分数值。

import pandas as pd

在上述方程中:

需要选择多少主要主成分?我可以深入理论,但最好是实际回答这些问题。PCA只能应用于数值数据。因此,如果数据具有分类变量,则它们必须转换为数值。此外,在实施此技术之前完成基本数据清理。完成初始数据加载和清洁步骤:

在这里,你要使用智商值和学习小时数构建预测模型来估计这些缺失值。因此,智商值和学习小时数称作这个模型的特征。

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

Y — 因变量

目录路径

新浦京www81707con 4

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

a — 倾斜量

设置工作目录

2 特征工程

stats.columns = [‘mean_loan_amount’, ‘max_loan_amount’,
‘min_loan_amount’]

X — 自变量

读取训练和测试文件

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

# Merge with the clients dataframe

b — 截距

train <-read.csv(“Train_UWu5bXk.csv”)

下面是一个样本数据,包括每个项目的详细信息,如它们的重量Item_Weight和价格Item_Price。

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

系数a和b是基于最小化数据点与回归线之间的距离的平方差的总和而得出的。

test <- read.csv(“Test_u94Q5KV.csv”)

新浦京www81707con 5

stats.head(10)

假设我们有一些人员的身体和体重的数据,将其绘制在图表中。如下图所示:

填补缺失值

现在,我们可以使用重量和价格创建新特征,于是创建了一个名为Price_per_Weight的特征,它指的是物品的单位质量价格。这个过程叫做特征工程。

新浦京www81707con 6

新浦京www81707con 7

combi$Item_Weight[is.na(combi$Item_Weight)] <-
median(combi$Item_Weight, na.rm = TRUE)

新浦京www81707con 8

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

这里我们已经找到了最佳的拟合线,其方程表示为y = 0.2811*x +
13.9,为图中黑色线。那么我们就可以使用这个方程来根据某人的身高,得到其体重了。

用中位数填充

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

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

线性回归主要有两种类型:单一线性回归和多元线性回归。单一线性回归顾名思义,就是仅由一个独立的自变量表征,而多元线性回归由多于一个自变量来表征。在寻找最佳拟合线时,可以拟合多项式或曲线回归。

combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0,
median(combi$Item_Visibility), combi$Item_Visibility)

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

新浦京www81707con 9

本文中的代码大部分为演示所用,在实际应用中需要替换甚至重写部分代码,请慎重复制粘贴!

模型填充结果

Montvila, Rev. Juozas

Graham, Miss. Margaret Edith

Johnston, Miss. Catherine Helen “Carrie”

Behr, Mr. Karl Howell

Dooley, Mr. Patrick

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

Python code

直到这里,我们已经估计缺失值。现在我们留下去除依赖(响应)变量和其他标识符变量(如果有的话)。正如我们上面所说,我们正在练习一个无监督学习技术,因此必须消除响应变量。

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

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

1# Import Library

删除从属和标识符变量

新浦京www81707con 10

2# Import other necessary libraries like pandas, numpy…

my_data <-subset(combi, select = -c(Item_Outlet_Sales,
Item_Identifier, Outlet_Identifier))

事实上,有些称号,如’Dona’, ‘Lady’, ‘Countess’, ‘Capt’, ‘Col’, ‘Don’,
‘Dr’, ‘Major’, ‘Rev’, ‘Sir’和’Jonkheer
‘,出现频率很低,可以划为同一类,作为rare_title类。此外,称号’Mlle’和’Ms’可以放在’Miss’中,’Mme’可以用’Mrs’替换。

Featuretools

3from sklearn import linear_model

查看有效变量

新浦京www81707con 11

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

4# Load Train and Test datasets

查看是否所有变量是数值变量

新的称号特征只有5个唯一值,如下所示:

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

5# Identify feature and response variable and values must be numeric
and numpy arrays

查看变量类型

新浦京www81707con 12

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

6x_train=input_variables_values_training_datasets

str(my_data)

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

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

7y_train=target_variables_values_training_datasets

新浦京www81707con 13

3 特征工程必要性

新浦京www81707con 3

8x_test=input_variables_values_test_datasets

9个变量中有6个是绝对的。我们现在有一些额外的工作要做。我们将使用一个编码将这些分类变量转换为数字。

一个预测模型的性能很大程度上取决于训练该模型的数据集的特征质量。

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

9# Create linear regression object

创建一个伪变量

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

新浦京www81707con 15

10linear = linear_model.LinearRegression()

new_my_data <-dummy.data.frame(my_data, names
=c(“Item_Fat_Content”,”Item_Type”,

在Kaggle竞赛“自行车共享需求预测(Bike Sharing Demand
Prediction)”中,参与者被要求根据历史模式(包括使用情况,及对应的天气、时间和其他数据)来预测华盛顿地区的租赁需求。

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

11# Train the model using the training sets and check score

“Outlet_Establishment_Year”,”Outlet_Size”,

在一篇获胜者分享中也提到,智能特征工程有助于提高模型性能。他创建的一些特征如下:

新浦京www81707con 16

12linear.fit(x_train, y_train)

“Outlet_Location_Type”,”Outlet_Type”))

1. Hour Bins:利用决策树分箱小时级别特征来创建新特征;

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

13linear.score(x_train, y_train)

要检查,如果我们现在有一个整数值的数据集

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

实体和实体集

14# Equation coefficient and Intercept

新浦京www81707con 17

3. Year Bins:为持续2年的数据创建了8个季度分箱;

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

15print(‘Coefficient: \n’, linear.coef_)

而且,我们现在有了所有的数值变量。让我们将数据分成测试和训练集。

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

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

16print(‘Intercept: \n’, linear.intercept_)

分割新数据

分享全文见:

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

17# Predict Output

pca.train <- new_my_data[1:nrow(train),]

创建这样特征并非一件容易的事,它需要大量的头脑风暴和广泛的数据探索。但是,并非所有人都擅长特征工程,因为无法通过阅读书籍或观看教程学到这些东西。这就是特征工程也被称为艺术的原因。如果你擅长它,那么你在竞赛中占据较大优势。

import featuretools as ft

18predicted= linear.predict

pca.test <- new_my_data[-(1:nrow(train)),]

4 自动特征工程

# Create new如何用Python做自动化特征工程,拓端数据tecdat。 entityset

2逻辑回归

我们现在可以继续使用PCA。

新浦京www81707con 18

es = ft.EntitySet(id = ‘clients’)

不要被这个名字所糊弄了!
其实逻辑回归并不是回归算法。它基于给定的一组自变量来估计离散值(二进制值,如0/1,是/否,真/假)。简单的说,它通过将数据拟合到logit函数来预测事件发生的可能性。因此,它通常也被称为logit回归。因为它预测了可能性,即概率,因此其输出值在0和1之间。例如:你的朋友给你出了一道难题,并且他并不知道你的知识范围,而你能给出的结果只有能解决或者不能解决。假如这道题是高级物理学科的题目,你可能只有大学本科的经历,你给出能解决的概率可能只有20%,而如何你恰好是一个物理学博士,你给出解决的概率可能就有80%了,这就是逻辑回归。

基本R函数prcomp()用于执行PCA。默认情况下,它使变量标准化,使平均值等于零。我们将变量归一化为标准偏差等于1。

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

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

从数学的含义上讲,逻辑回归就是结果的对数几率被建模为预测变量的线性组合。如下:

主成分分析

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

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

1odds = p / = probabilityofevent occurrence / probabilityofnotevent
occurrence

prcomp()函数产生5个有用的度量:

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

# Create an entity from the client dataframe

2ln = ln(p /

1.中心和尺度是指在实施PCA之前用于归一化的变量,输出相应平均值和标准偏差

5 Featuretools简介

# This dataframe already has an index and a time index

3logit = ln(p / = b0+b1X1+b2X2+b3X3….+bkXk

输出变量的平均值

新浦京www81707con 19

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

上述公式中,p是存在感兴趣特征的概率。它选择最大化观察样本值的可能性的参数,而不是最小化平方误差的总和(如在普通回归中那样)。

新浦京www81707con 20

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

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将缺失数据视作是一个分类变量。将数据框添加到实体集后,我们检查它们中的任何一个:

新浦京www81707con 21

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

数据表之间的关系

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

例如,在我们的数据集中,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

新浦京www81707con 22

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

特征基元

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

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

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

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

新浦京www81707con 23

这些原语可以单独使用,也可以组合使用来创建特征量。要使用指定的基元制作特征,我们使用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)。例如,我们有每个客户加入的月份,这是由转换特征基元生成的:

新浦京www81707con 24

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

新浦京www81707con 25

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

新浦京www81707con 26

深度特征合成

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

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

新浦京www81707con 27

我们可以将功能堆叠到我们想要的任何深度,但在实践中,我从未用过超过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()

新浦京www81707con 28

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

下一步

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

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

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

结论

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

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

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

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

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

相关报道:

)

责任编辑:

新浦京www81707con 29

输出变量的标准偏差

在使用Featuretools之前,我们要了解这个库的三个主要组件:

Python code

新浦京www81707con 30

  • 实体Entities
  • 深度特征合成Deep Feature Synthesis
  • 特征基元Feature primitives

1# Import Library

旋转度量提供主成分加载。旋转矩阵的每一列包含主成分加载向量。

实体可看作是Pandas中数据帧的表征,多个实体的集合称为实体集Entityset。

2fromsklearn.linear_modelimportLogisticRegression

PC1 PC2 PC3

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

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

Item_Weight 0.0010441240 0.0004384151 -0.021454235

DFS通过把特征基元应用于实体集中的实体关系来创建特征。这些基元经常被用来手动生成特征,比如,基元“mean”可在聚合级别找到变量均值。

4# Create logistic regression object

Item_Fat_ContentLF -0.0091725762 -0.0019042858 0.008383420

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

5model = LogisticRegression()

Item_Fat_Contentlow fat -0.0034287693 0.0055492764 -0.003302283

6 Featuretools实现

6# Train the model using the training sets and check score

Item_Fat_ContentLow Fat 0.0078360026 0.0065124968 -0.021090747

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

7model.fit

Item_Fat_Contentreg -0.0012517669 0.0033104683 -0.006895653

下表给出了数据中提供的特征:

8model.score

Item_Fat_ContentRegular -0.0033255317 -0.0081367517 0.020996872

新浦京www81707con 31

9# Equation coefficient and Intercept

Item_Visibility -0.0220000614 -0.0187067072 0.163246663

数据集下载地址:

10print(‘Coefficient: \n’, model.coef_)

Item_TypeBaking Goods 0.0020985501 -0.0021432744 0.004446981

11print(‘Intercept: \n’, model.intercept_)

Item_TypeBreads -0.0014593729 0.0014755583 0.008779674

6.1 安装

12# Predict Output

Item_TypeBreakfast -0.0041558943 -0.0013373054 0.009056857

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

13predicted= model.predict

Item_TypeCanned 0.0007185925 -0.0018660124 0.002503213

pip install featurePython

3决策树

Item_TypeDairy 0.0007705650 -0.0083753476 -0.002652466

6.2 加载外部库和数据 importfeaturetools asft

决策树是一种主要用于分类问题的监督学习算法。该算法不仅仅支持分类问题,还支持连续因变量问题。在这个算法中,我们将人口分成两个或更多的齐次集合。这是基于最重要的属性/独立变量来完成的,以尽可能地形成不同的组。

Item_TypeFrozen Foods 0.0047693050 -0.0075665792 -0.002407384

importnumpy asnp

新浦京www81707con 32

Item_TypeFruits and Vegetables -0.0042284678 0.0056042888 -0.001823856

importpandas aspd

如上图所示,可以看到该算法根据多个属性将一个群体分为了四个不同的群体,以识别“他们是否会参加比赛”。为了分组,它使用各种技术,如基尼,信息增益,卡方,熵等。

Item_TypeHard Drinks 0.0017679688 0.0071341635 -0.004325508

train = pd.read_csv( “Train_UWu5bXk.csv”)

另一种理解决策树的绝佳方式是玩一个微软上经典的游戏 —
Jezzball。基本上,你有一个有活动墙壁的房间,你需要创造墙壁,这样最大的区域就会被清理掉。

Item_TypeHealth and Hygiene -0.0029676602 0.0106048406 -0.010642563

test = pd.read_csv( “Test_u94Q5KV.csv”)

新浦京www81707con 33

Item_TypeHousehold 0.0022643056 0.0042437346 -0.010402040

6.3 准备数据

因此,每一次你使用墙壁来划分房间,你都将试图将一个房间划分为两部分。决策树也非常类似这种方式。

Item_TypeMeat -0.0111496574 -0.0061744455 0.017570630

首先,我们把目标Item_Outlet_Sales存储到sales变量,把test_Item_Identifier和test_Outlet_Identifier存储到id变量。

Python code

Item_TypeOthers 0.0007948501 -0.0093427539 0.003622752

# saving identifiers

1# Import Library

Item_TypeSeafood 0.0001973747 -0.0034001317 0.011209485

test_Item_Identifier = test[ ‘Item_Identifier’]
test_Outlet_Identifier = test[ ‘Outlet_Identifier’]

2# Import other necessary libraries like pandas, numpy…

Item_TypeSnack Foods -0.0009039454 -0.0022045145 0.002898289

sales = train[ ‘Item_Outlet_Sales’]

3from sklearn import tree

Item_TypeSoft Drinks 0.0075602653 0.0058181850 -0.002596304

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

4# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

Item_TypeStarchy Foods 0.0036699523 0.0075632647 -0.011911009

然后,组合训练集和测试集,这样省去两次执行相同步骤的麻烦

5# Create tree object

Item_MRP 0.0020549197 -0.0029926096 -0.006868498

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

6model = tree.DecisionTreeClassifier(criterion=’gini’)# for
classification, here you can change the algorithm as gini or entropy
(information gain) by default it is gini

Outlet_Establishment_Year1985 -0.2245166654 -0.1294106363 0.236919922

接着,检查数据集中的缺失值。

7# model = tree.DecisionTreeRegressor() for regression

Outlet_Establishment_Year1987 -0.0366530891 0.1399494332 -0.481852069

combi.isnull().sum()

8# Train the model using the training sets and check score

Outlet_Establishment_Year1997 0.1056693202 -0.3344969170 -0.047826794

新浦京www81707con 34

9model.fit

这返回44主要主成分。在数据集中,主分量负载的最大数目是(n-1,p)的最小值。让我们来看看前4个主成分和前5行。

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

10model.score

新浦京www81707con 35

# imputing missing data

11# Predict Output

为了计算主成分得分向量,我们不需要将负载乘以数据。因此,矩阵x具有8523×44维度的主分量分数向量。

combi[ ‘Item_Weight’].fillna(combi[ ‘Item_Weight’].mean(),

12predicted= model.predict

dim(prin_comp$x)

inplace = True)

4SVM

[1] 8523 44

combi[ ‘Outlet_Size’].fillna( “missing”, inplace = True)

SVM是一个分类方法。在该算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是您拥有的要素数),每个要素的值都是特定坐标的值。

让我们绘制生成的主成分。

6.4 数据预处理

例如,如果我们只有个人的身高和头发长度两个特征,我们首先在二维空间中绘制这两个变量,其中每个点有两个坐标(这些坐标被称为支持向量)。

新浦京www81707con 36

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

新浦京www81707con 37

参数scale =
0确保箭头被缩放以表示负载。要从上面的图像做推理,集中在这个图的顶部,底部,左,右位置。

combi[ ‘Item_Fat_Content’].value_counts()

现在,我们将找到一些分割两个不同分类数据组之间线。而这条线将使得两组数据中最近点的距离最远。

我们推断比第一主成分对应于Outlet_TypeSupermarket的度量Outlet_Establishment_Year
2007.类似地,可以说第二成分对应于Outlet_Location_TypeTier1,Outlet_Sizeother的度量。要精确测量主成分中的变量,您应该再次查看旋转矩阵。

新浦京www81707con 38

新浦京www81707con 39

因此第一主成分对应,超市的类型和建立年份,第二个主成分对应超市的地点和规模。

Item_Fat_Content似乎只包含两个类别,即“低脂”和“常规”,未涉及到“冗余”类别,所以我们把它转换成二进制变量。

在上面所示的例子中,将数据分成两个不同分类组的线是黑线,因为两个最近点离线最远。这条线就是我们的分类器。然后,根据测试数据在线两侧的位置,就可以区分测试数据属于哪个类了。

prcomp()函数还提供计算每个主成分的标准偏差的功能。
sdev是指主成分的标准偏差。

# dictionary to replace the categories

Python code

计算每个主成分的标准偏差

fat_content_dict = { ‘Low Fat’: 0, ‘Regular’: 1, ‘LF’: 0, ‘reg’: 1,

1# Import Library

std_dev <-prin_comp$sdev

‘low fat’: 0}

2from sklearn import svm

计算方差

combi[ ‘Item_Fat_Content’] = combi[ ‘Item_Fat_Content’].replace(

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

pr_var <-std_dev^2

fat_content_dict, regex= True)

4# Create SVM classification object

检查前10个分量的方差

6.5 使用Featuretools执行特征工程

5model = svm.svc()# there is various option associated with it, this is
simple for classification. You can refer link, for mo# re detail.

pr_var[1:10]

在这节,我们要使用Featuretools来执行自动特征工程。

6# Train the model using the training sets and check score

[1] 4.564631 3.219279 2.744497 2.535883 2.190449 2.021640 1.935010

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

7model.fit

[8] 1.266311 1.205757 1.169495

combi[ ‘id’] = combi[ ‘Item_Identifier’] + combi[
‘Outlet_Identifier’]

8model.score

我们的目的是找到解释最大方差的成分。这是因为,我们希望使用这些主成分保留尽可能多的信息。因此,解释的方差越高,那些主成分中包含的信息就越高。

combi.drop([ ‘Item_Identifier’], axis= 1, inplace= True)

9# Predict Output

为了计算由每个分量解释的方差的比例,我们简单地将方差除以总方差的总和。

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

10predicted= model.predict

方差比例解释

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

5朴素贝叶斯

prop_varex <-pr_var/sum(pr_var)

# creating and entity set ‘es’

朴素贝叶斯是一种基于贝叶斯定理的分类技术,假设预测变量之间具有独立性。简而言之,朴素贝叶斯分类器假定类中特定特征的存在与任何其他特征的存在无关。例如,如果果实呈红色,圆形,直径约3英寸,则可认为其为苹果。即使这些特征依赖于彼此或者依赖于其他特征的存在,朴素贝叶斯分类器也会考虑所有这些特性来独立地贡献该水果是苹果的可能性。

prop_varex[1:20]

es = ft.EntitySet(id = ‘sales’)

朴素贝叶斯模型很容易构建,对于非常大的数据集特别有用。贝叶斯定理提供了一种从P和P计算后验概率P的方法。看下面的公式:

[1] 0.10374160 0.07316543 0.06237493 0.05763369 0.04978294 0.04594636

# adding a dataframe

新浦京www81707con 40

[7] 0.04397749 0.02877979 0.02740357 0.02657943 0.02631063 0.02577906

es.entity_from_dataframe(entity_id = ‘bigmart’,

这里:

[13] 0.02549683 0.02511309 0.02477200 0.02469167 0.02460995 0.02446028

dataframe = combi,

P是给定预测器的后验概率。

[19] 0.02398721 0.02373467

index = ‘id’)

P是类的先验概率。

这表明第一主成分解释了10.3%的方差。第二部分解释7.3%的差异。第三部分解释6.2%的差异,那么,我们决定应该为建模阶段选择多少个主成分

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

P是预测器给定类的概率的可能性。

查看scree图。
scree图用于访问主成分或因子,这解释了数据中的大部分方差。它按降序表示值。

es.normalize_entity(base_entity_id= ‘bigmart’,

P是预测变量的先验概率。

碎石图

new_entity_id= ‘outlet’,

例子:让我们用一个例子来理解它。下面我有一个天气和相应的目标变量“是否参加比赛”的训练数据集。现在,我们需要根据天气情况来分类球员是否参加比赛。让我们按照以下步骤来执行它。

新浦京www81707con 41

index = ‘Outlet_Identifier’,

将数据集转换为频率表

scree图主成分分析

additional_variables =

通过查找像Overcast probability =
0.29和播放概率为0.64的概率来创建Likelihood表。

上图显示,约30个主成分解释了数据集中约98.4%的方差。换句话说,使用PCA,我们将44个预测变量减少到30个,而不解释所解释的方差。这是PCA让我们通过绘制累积方差图做一个确认检查。这将给我们一个清楚的主成分数量的图片。

[ ‘Outlet_Establishment_Year’, ‘Outlet_Size’,

现在,使用朴素贝叶斯方程来计算每个类别的后验概率。具有最高后验概率的类别是预测的结果。

累积灰度图

‘Outlet_Location_Type’, ‘Outlet_Type’])

Python code

新浦京www81707con 42

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

1# Import Library

该图显示30个分量导致方差接近?98%。因此,在这种情况下,我们将选择主成分数量为30
[PC1到PC30],然后进入建模阶段。这完成了对训练集数据实现PCA的步骤。对于建模,我们将使用这30个分量作为预测变量,并按照正常程序。

print(es)

2fromsklearn.naive_bayesimportGaussianNB

PCA主成分的预测建模

新浦京www81707con 43

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

在计算训练集上的主成分后,现在让我们了解使用这些主成分预测测试数据的过程。就像我们在训练集上获得PCA主成分一样,我们将在测试集上获得另一组主成分。最后,我们训练模型。

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

4# Create SVM classification object model = GaussianNB() # there is
other distribution for multinomial classes like Bernoulli Naive Bayes,
Refer link

但是,几个重要点:

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

5# Train the model using the training sets and check score

我们不应该将训练集和测试集合在一起来获得整个数据的PCA主成分。因为,这将违反概括的整个假设,因为测试数据将被“泄漏”到训练集中。换句话说,测试数据集将不再保持“未知”。最终,这将减弱模型的泛化能力。

feature_matrix, feature_names = ft.dfs(entityset=es,

6model.fit

我们不应该分别对测试和训练数据集执行PCA。因为,来自训练集和测试PCA的合成向量将具有不同的方向(由于不等方差)。因此,我们将最终比较在不同轴上的数据。因此,来自训练集和测试数据的结果矢量应该具有相同的轴。

target_entity = ‘bigmart’,

7# Predict Output

因此我们应该对训练集进行与测试集完全相同的转换,包括中心和缩放特征。让我们在R:

max_depth = 2,

8predicted= model.predict

添加包含主成分的训练集

verbose = 1,

6kNN

rpart.model <-rpart(Item_Outlet_Sales ~.,data = train.data, method
=”anova”)

n_jobs = 3)

kNN可以用于分类和回归问题。然而,它在业内的分类问题中被更广泛地使用。
K最近邻算法是一个简单的算法,它存储所有可用的案例,并通过其k个邻居的多数投票来分类新案例。被分配给类的情况在距离函数测量的k近邻中最为常见。

rpart.model

新浦京www81707con 44

这些距离函数可以是欧几里得,曼哈顿,闵可夫斯基和海明距离。前三个函数用于连续函数,第四个函数用于分类变量。如果K

1,那么该情况被简单地分配给其最近邻居的类别。有时,在执行kNN建模时选择K是一项挑战。

新浦京www81707con 45

kNN可以很容易地映射到我们的真实生活中。如果你想了解一个你没有信息的人,你可能想知道他的亲密朋友和他进入的圈子并获得他/她的信息!

选择kNN之前需要考虑的事项: * KNN在计算上很耗时 *
在使用kNN时,变量应该被标准化,否则更高的范围变量会偏向它 *
在进入kNN之前要更多地进行数据预处理,如异常值,噪音消除等。

Python code

1# Import Library

2fromsklearn.neighborsimportKNeighborsClassifier

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

4# Create KNeighbors classifier object model

5KNeighborsClassifier(n_neighbors=6)# default value for n_neighbors
is 5

6# Train the model using the training sets and check score

7model.fit

8# Predict Output

9predicted= model.predict

7K-均值

K-均值是一种解决聚类问题的无监督算法。其过程遵循一个简单的方法,通过一定数量的聚类对给定的数据集进行分类。群集内的数据点与同级群组是同质且异质的。

例如在白纸上随机撒上的墨水,
K-均值有点类似这个活动,每一块墨水水渍可以理解为一个群组。

新浦京www81707con 46

K-means如何形成群集:

K-means为每个簇选取k个点,称为质心。

每个数据点形成具有最接近质心的群集,即k个群集。

根据现有集群成员查找每个集群的质心。这里我们有新的质心。

由于我们有新的质心,请重复步骤2和3.从新质心找到每个数据点的最近距离,并与新的k-簇进行关联。重复这个过程直到收敛发生,即质心不变。

如何确定K的值:

在K-means中,我们有簇,每个簇都有自己的质心。质心与聚类内的数据点之间的差的平方和构成该聚类的平方值的和。另外,当所有群集的平方值总和相加时,群集解决方案的平方和总和为总和。

我们知道,随着群集数量的增加,这个值会持续下降,但是如果您绘制结果,您可能会看到平方距离的总和急剧下降到某个k值,然后再慢得多。在这里,我们可以找到聚类的最佳数量。

新浦京www81707con 47

Python code

1# Import Library

2from sklearn.cluster import KMeans

3# Assumed you have, X (attributes) for training data set and
x_test(attributes) of test_dataset

4# Create KNeighbors classifier object model

5k_means = KMeans(n_clusters=3, random_state=0)

6# Train the model using the training sets and check score

7model.fit

8# Predict Output

9predicted= model.predict

8

随机森林

随机森林是一个决策树集合的术语。在随机森林中,集成了多个决策树。要根据属性对新对象进行分类,每棵树都会给出一个分类,并且该树会为该分类“投票”。森林选择票数最多的分类,即为最终的分类。

每株树种植和生长如下:

如果训练集中的病例数为N,则随机抽取N个病例的样本,但需要更换。这个样本将成为培育树的培训集。

如果有M个输入变量,则指定一个数m <<
M,以便在每个节点处从M中随机选择m个变量,并且使用这些m上的最佳分割来分割节点。在森林生长期间,m的值保持不变。

每棵树都尽可能地生长。没有修剪。

Python code

1# Import Library

2from sklearn.ensemble import RandomForestClassifier

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

4# Create Random Forest object

5model= RandomForestClassifier()

6# Train the model using the training sets and check score

7model.fit

8# Predict Output

9predicted= model.predict

9

维度降低算法

在过去的4-5年里,在每个可能的阶段数据采集呈指数级增长。企业/政府机构/研究机构不仅拥有新的资源,而且还在详细捕获数据。

例如:电子商务公司正在抓住更多有关客户的细节,例如他们的人口统计数据,网络爬行历史,他们喜欢或不喜欢的内容,购买历史记录,反馈信息等等,以便为他们提供比最近的杂货店老板更多的个性化关注。

作为一名数据科学家,我们提供的数据还包含许多功能,这对构建良好的健壮模型听起来不错,但是存在挑战。你如何确定1000或2000年以外的重要变量?在这种情况下,降维算法可以帮助我们连同各种其他算法,如决策树,随机森林,PCA,因子分析,基于相关矩阵的识别,缺失值比等。

Python code

1# Import Library

2from sklearn import decomposition

3# Assumed you have training and test data set as train and test

4# Create PCA obeject pca= decomposition.PCA(n_components=k) #default
value of k =min(n_sample, n_features)

5# For Factor analysis

6# fa= decomposition.FactorAnalysis()

7# Reduced the dimension of training dataset using PCA

8train_reduced = pca.fit_transform

9# Reduced the dimension of test dataset

10test_reduced = pca.transform

10梯度下降算法

10.1. GBM

当我们处理大量数据以进行具有高预测能力的预测时,GBM是一种增强算法。
Boosting实际上是一种学习算法集合,它将几个基本估计量的预测结合起来,以提高单个估计量的鲁棒性。它将多个弱预测器或平均预测器组合成强大的预测器。这些提升算法在Kaggle,AV
Hackathon,CrowdAnalytix等数据科学竞赛中始终运作良好。

Python code

1# Import Library

2from sklearn.ensemble import GradientBoostingClassifier

3# Assumed you have, X (predictor) and Y for training data set and
x_test(predictor) of test_dataset

4# Create Gradient Boosting Classifier object

5model= GradientBoostingClassifier(n_estimators=100,
learning_rate=1.0, max_depth=1, random_state=0)

6# Train the model using the training sets and check score

7model.fit

8# Predict Output

9predicted= model.predict

10.2. XGBoost

XGBoost是另一个经典的渐变增强算法,被称为在一些Kaggle比赛中获胜的关键性算法。

XGBoost具有非常高的预测能力,使其成为事件精确度的最佳选择,因为它具有线性模型和树学习算法,使得该算法比现有梯度增强技术快近10倍。

支持包括各种目标函数,包括回归,分类和排名。

XGBoost最有趣的事情之一就是它也被称为正规化提升技术。这有助于减少过度装配建模,并且对Scala,Java,R,Python,Julia和C
++等一系列语言提供大量支持。

在许多包含GCE,AWS,Azure和Yarn群集的机器上支持分布式和广泛的培训。
XGBoost还可以与Spark,Flink和其他云数据流系统集成在一起,每次迭代过程中都有内置的交叉验证。

Python code

1from xgboost import XGBClassifier

2from sklearn.model_selection import train_test_split

3from sklearn.metrics import accuracy_score

4X = dataset[:,0:10]

5Y = dataset[:,10:]

6seed = 1

7X_train, X_test, y_train, y_test = train_test_split(X, Y,
test_size=0.33, random_state=seed)

8model = XGBClassifier()

9model.fit(X_train, y_train)

10#Make predictions for test data

11y_pred = model.predict

10.3. LightGBM

LightGBM是一种梯度提升框架,使用基于树的学习算法。它的设计是分布式和高效的,具有以下优点:

更快的训练速度和更高的效率

降低内存使用量

更好的准确性

支持并行和GPU学习

能够处理大型数据

该框架是一种基于决策树算法的快速高性能梯度提升算法,用于排序、分类和许多其他机器学习任务。它是在Microsoft的分布式机器学习工具包项目下开发的。

由于LightGBM基于决策树算法,因此它将树叶以最佳拟合进行分割。因此,当在Light
GBM中的同一片叶上生长时,叶式算法可以比平面式算法减少更多的损失,因此可以获得更好的精度,而现有的任何增强算法都很难达到这些精度。

Python code

1data = np.random.rand# 500 entities, each contains 10 features

2label = np.random.randint(2, size=500)# binary target

3train_data = lgb.Dataset(data, label=label)

4test_data = train_data.create_valid(‘test.svm’)

5param = {‘num_leaves’:31, ‘num_trees’:100, ‘objective’:’binary’}

6param[‘metric’] = ‘auc’

7num_round = 10

8bst = lgb.train(param, train_data, num_round,
valid_sets=[test_data])

9bst.save_model(‘model.txt’)

10# 7 entities, each contains 10 features

11data = np.random.rand

12ypred = bst.predict

10.4. Catboost

CatBoost是Yandex最近开源的机器学习算法。它可以轻松地与Google的TensorFlow和Apple的Core
ML等深度学习框架相整合。

CatBoost最棒的部分是它不需要像其他ML模型那样的大量数据训练,并且可以处理各种数据格式;不会破坏它的可靠性。

在使用和执行Catboost算法之前,请确保数据中的缺失值已经被处理。

Catboost可以自动处理分类变量而不显示类型转换错误,这有助于您更专注于更好地调整模型。

Python code

1importpandasaspd

2importnumpyasnp

3fromcatboostimportCatBoostRegressor

4#Read training and testing files

5train = pd.read_csv(“train.csv”)

6test = pd.read_csv(“test.csv”)

7#Imputing missing values for both train and test

8train.fillna(-999, inplace=True)

9test.fillna(-999,inplace=True)

10#Creating a training set for modeling and validation set to check
model performance

11X = train.drop([‘Item_Outlet_Sales’], axis=1)

12y = train.Item_Outlet_Sales

13fromsklearn.model_selectionimporttrain_test_split

14X_train, X_validation, y_train, y_validation =
train_test_split(X, y, train_size=0.7, random_state=1234)

15categorical_features_indices = np.where(X.dtypes != np.float)[0]

16#importing library and building model

17fromcatboostimportCatBoostRegressormodel=CatBoostRegressor(iterations=50,
depth=3, learning_rate=0.1, loss_function=’RMSE’)

18model.fit(X_train,
y_train,cat_features=categorical_features_indices,eval_set=(X_validation,
y_validation),plot=True)

19submission = pd.DataFrame()

20submission[‘Item_Identifier’] = test[‘Item_Identifier’]

21submission[‘Outlet_Identifier’] = test[‘Outlet_Identifier’]

22submission[‘Item_Outlet_Sales’] = model.predict

至此,相信你对机器学习的各个主要算法有了一个大概的了解,文中给出了各个算法的逻辑代码,你可以从这里开始,尝试解决一些问题,并在过程中加深理解。关于数据,你可以在网络上找到很多,而且在一些所使用到的Python库中也常内置了各种数据集,你可以查看相应的官方文档查找并直接使用。

n= 8523

target_entity只是创建新特征的实体ID,这种情况下为实体“bigmart”。参数max_depth控制着通过堆叠基元生成的要素复杂性。参数n_jobs通过使用多个内核来辅助并行特征计算。

node), split, n, deviance, yval

这就是使用Featuretools的过程,它已经产生了许多新特征。

* denotes terminal node

看下这些新创建的特征

1) root 8523 24817270000 2181.2890

feature_matrix.columns

2) PC3>=1.671844 1083 73623120 339.8285 *

新浦京www81707con 48

3) PC3< 1.671844 7440 20536640000 2449.3400

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

6) PC27>=-0.02464682 3838 5499852000 1780.8280

下面打印出feature_matrix的前几行。

12) PC27>=1.079021 1017 586793000 1132.8500 *

feature_matrix.head()

13) PC27< 1.079021 2821 4332103000 2014.4310

新浦京www81707con 49

26) PC9>=-0.3193864 1627 1972546000 1675.5750

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

52) PC19>=-1.337507 1439 1294309000 1534.0690 *

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

53) PC19< -1.337507 188 428870300 2758.6960 *

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

27) PC9< -0.3193864 1194 1918174000 2476.1710 *

6.6 构建模型

7) PC27< -0.02464682 3602 11493930000 3161.6530

现在该验证这些生成特征的效果了。我们将使用它们来构建模型并预测Item_Outlet_Sales值。由于最终数据feature_matrix具有多个分类特征,因此我决定使用CatBoost算法。它可以直接使用分类特征,并且本质上是可扩展的。有关CatBoost的更多内容可阅读这篇文章:

14) PC6>=-2.648969 3155 8039466000 2925.5700

28) PC9>=0.1215489 1412 2827138000 2417.5500

fromcatboost importCatBoostRegressor

56) PC27>=-1.461566 1182 1950290000 2217.1510 *

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

57) PC27< -1.461566 230 585430300 3447.4280 *

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

29) PC9< 0.1215489 1743 4552703000 3337.1150 *

fori incategorical_features:

15) PC6< -2.648969 447 2037483000 4827.9660

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

30) PC8< -0.7209545 118 302595100 3358.4530 *

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

31) PC8>=-0.7209545 329 1388678000 5355.0250 *

feature_matrix.drop([ ‘id’], axis= 1, inplace= True)

测试数据进行主成分分析

train = feature_matrix[: 8523]

test.data <- predict(prin_comp, newdata = pca.test)

test = feature_matrix[ 8523:]

test.data <- as.data.frame(test.data)

# removing uneccesary variables

选择三十个主成分

train.drop([ ‘Outlet_Identifier’], axis= 1, inplace= True)
test.drop([ ‘Outlet_Identifier’], axis= 1, inplace= True)

test.data <- test.data[,1:30]

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

预测数据

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

rpart.prediction <- predict(rpart.model, test.data)

fromsklearn.model_selection importtrain_test_split

得到预测结果(部分)

# splitting train data into training and validation set

以上PCA提取后的完整建模过程。

xtrain, xvalid, ytrain, yvalid = train_新浦京www81707con ,test_split(train, sales,

结论和总结

test_size= 0.25,

PCA用于克服数据集中的特征冗余。这些特征本质上是低维的。这些特征a.k.a分量是原始预测变量的归一化线性组合的结果。这些主成分旨在捕获尽可能多的具有高解释方差的信息。第一个分量具有最高的方差,其次是第二个,第三个等等。主成分必须是不相关的。往上看。当以不同单位测量预测变量时,标准化数据变得极为重要。PCA在具有3或更高维度的数据集上最佳。因为,随着更高的维度,从最终的数据做出解释变得越来越困难。
PCA应用于具有数字变量的数据集。PCA是一种有助于产生高维数据的更好可视化的工具。需要特别注意,同时决定主成分的数量。实际上,我们应该努力保留只有前k个分量。
pca背后的想法是构造一些主成分(Z <<
Xp),它们令人满意地解释数据中的大部分可变性,以及与响应变量的关系。

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)

新浦京www81707con 50

# validation score


model_cat.score(xvalid, yvalid)

【拓端数据tecdat.cn】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。

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

新浦京www81707con 51

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

中国专业的统计分析和数据挖掘咨询服务商:拓端数据(商务合作请联系官网客服)

7 Featuretools可解释性

帅的小伙伴都关注了拓端数据团队^..^~

让数据科学模型具有可解释性是执行机器学习中一个很重要的方面。Featuretools生成的特征甚至能很容易地解释给非技术人员,因为它们是基于容易理解的基元构建的。

QQ交流群:186388004

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

微信公众号:拓端数据

这使得那些不是机器学习专家的使用者能够在他们的专业领域中理解和应用这个方法。

微信客服号:lico_9e

总结

Featuretools库真正地改变了机器学习的游戏规则。虽然它在工业领域的应用还十分有限,但是它在机器学习竞赛中很快地受到大家的欢迎。它能在构建机器学习模型中节省很多时间,且产生的特征很有效果,这也是我想把Featuretools介绍给大家的原因。

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

原文:

—返回搜狐,查看更多

责任编辑:

相关文章