python特征工程插件_手把手教你用Python实现自动特征工程

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

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

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

640?wx_fmt=jpeg

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

本文目录

1. 特征是什么

2. 特征工程

3. 特征工程必要性

4. 自动特征工程

5. Featuretools简介

6. Featuretools实现

7. Featuretools可解释性

1 特征

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

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

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

640?wx_fmt=png

2 特征工程

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

Montvila, Rev. Juozas

Graham, Miss. Margaret Edith

Johnston, Miss. Catherine Helen “Carrie”

Behr, Mr. Karl Howell

Dooley, Mr. Patrick

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

3 特征工程必要性

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

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

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

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

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

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

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

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

分享全文见:https://www.analyticsvidhya.com/blog/2015/06/solution-kaggle-competition-bike-sharing-demand/

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

4 自动特征工程

640?wx_fmt=png

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

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

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

5 Featuretools简介

640?wx_fmt=png

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

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

实体Entities

深度特征合成Deep Feature Synthesis

特征基元Feature primitives

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

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

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

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

6 Featuretools实现

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

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

640?wx_fmt=png

数据集下载地址:

https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/

6.1 安装

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

pip install featurePython

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存储到sales变量,把test_Item_Identifier和test_Outlet_Identifier存储到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().sum()

640?wx_fmt=png

变量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 数据预处理

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

combi['Item_Fat_Content'].value_counts()

640?wx_fmt=png

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

# 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,一个用于item,另一个用于outlet。因此,对这两者简单相加会得到一个唯一ID。

combi['id'] = combi['Item_Identifier'] + combi['Outlet_Identifier']

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

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

接着,我们要创建一个实体集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')

我们数据中包含两个级别的信息,即 item级别和 outlet级别。Featuretools能把一个数据集拆分成多个表格。我们根据outlet 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)

640?wx_fmt=png

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

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

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

target_entity = 'bigmart',

max_depth = 2,

verbose = 1,

n_jobs = 3)

640?wx_fmt=png

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

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

来看下这些新创建的特征。

feature_matrix.columns

640?wx_fmt=png

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

下面打印出feature_matrix的前几行。

feature_matrix.head()

640?wx_fmt=png

这个数据帧存在一个问题,即未正确排序。我们必须根据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的更多内容可阅读这篇文章:

https://www.analyticsvidhya.com/blog/2017/08/catboost-automated-categorical-data/。

from catboost import CatBoostRegressor

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

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

for i 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)

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

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

7 Featuretools可解释性

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

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

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

总结

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

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

原文:

https://medium.com/analytics-vidhya/a-hands-on-guide-to-automated-feature-engineering-in-python-13260eae9270

— 完 —

加入社群

量子位AI社群19群开始招募啦,欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“交流群”,获取入群方式;

此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。

进专业群请在量子位公众号(QbitAI)对话界面回复关键字“专业群”,获取入群方式。(专业群审核较严,敬请谅解)

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020笔记本性价比之王_笔记本电脑性价比排行2020前十名?

展开全部1、 联想(Lenovo)拯救者R7000产品材质:32313133353236313431303231363533e58685e5aeb931333433656631ABCD面塑料产品尺寸:15.6寸CPU型号: AMD Ryzen5 4600H显卡型号:NVIDIA GeForce GTX 1650屏幕参数: 1080P I…

ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...

3月10日消息,王者荣耀在更新正式服后,安卓版和iOS版开通了资料互看。此前安卓和iOS上的游戏一直因为使用的服务器不同,不能实现两个平台的游戏互动,当然也不能实现同账号的资料同步。这对很多玩家来说造成一定的困扰,如…

存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

FinDOM-XSSFinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞。工具安装广大研究人员可以使用下列命令将该项目源码克隆至本地:$ git clone https://github.com/dwisis…

c语言如何判断数据是否符合正态分布_统计学里的数据正态性检验

在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的。这篇文章主要讲讲如何判断数据是否符合正态分布。主要分为两种方法:描述统计方法和统计检验方法。01.描述统计方法描述统计就是用描述的数字或图表来判断数据是否符合正态分布。常用的方…

python matplotlib_Python の Matplotlib

matplotlib是python优秀的数据可视化第三方库。matplotlib.pyplot子库可以调用全部功能,便于用户使用。绘图-plt.plot(x,y,format,**kwargs)x:x轴数据y:y轴数据format_string:控制曲线的格式字符串,颜色线条点**kwargs…

mysql 数据库还原 不齐_请教mysql数据库还原问题。

你的位置:问答吧-> 数据库-> 问题详情请教mysql数据库还原问题。50多m,能不能拆分?上传到服务器上总是超时。怎么办?[ 本帖最后由 geniux 于 2007-9-24 15:23 编辑 ]作者: geniux发布时间: 2007-09-20继续请教,现在数据库传…

python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法

python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大。对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的。下面开始讲讲关于python面向对象的知识,…

mysql 查询 汇总_Mysql-Sql查询汇总

软件测试Mysql-Sql查询汇总简单查询创建students表create table students(id int not null unique primary key auto_increment,name varchar(10) not null,class varchar(10) not null,grade int)添加数据insert into students values(0,老1,1班,80);insert into students val…

pat和ccf哪个含金量高_函授和网络教育哪个好 哪个含金量高

函授和网络教育都是成人教育学习的方式,但是考生报考的时候选择哪个比较好,下面小编整理了相关信息,以供参考。一、函授好还是网络教育好其实这两种教育方式都各有各的优点,两者都是不可替代的,这两种方式对于不同阶段…

mysql各种联结的区别_mysql几种连接方式区别

mysql的几种join2017年03月19日 14:49:07 carl-zhao 阅读数:7845 标签: mysqlsqljoin 更多个人分类: MySQL版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012410733/article/details/63…

python和office_Python在office开发中的应用

Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel。例如pandas, openpyxl, xlrd, xlutils 和 pyexcel. 详情可以参考下面的介绍: https://www.datacamp.com/community/tutorials/python-e…

android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制。MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)访…

mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理

这篇文章主要是从mysql数据库的逻辑架构来认识掌握mysql的原理。只要是稍微有一点计算机的相关知识相信都能看明白。一、笼统的逻辑架构先给出一张逻辑架构图,这张图是让你从宏观的角度来分析认识一下。从这张图你可以获取到如下的信息:(1&am…

onclick 源码_仿照React源码流程打造90行代码的Hooks

作者:苏畅转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA前言你可能已经看过其它简易的Hooks实现。那么本文和其它实现有什么区别呢?本文的实现完全参照React源码的运行流程。学懂本文,去看React源码,你…

java写一个窗体并连接MySQL_大神帮忙写一个简单地java页面,连接MySQL数据库之后能够显示数据库上的数据...

展开全部用jdbc 连接mysql数据库就行了,网上搜下一大把。--记得在classpath下加入mysql 的jdbc驱动包。/*** author :来e68a84e8a2ad3231313335323631343130323136353331333337386636自互联网*/import java.sql.DriverManager;import java.sql.ResultSet…

java break 在if 中使用_java中使用国密SM4算法详解

前言上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。ps:我们既可以基…

移动web前端开发框架_移动前端开发是Web前端开发吗?

移动端开发并不是Web前端开发,但移动前端开发和web前端开发其实都属于前端开发的范围,目前前端发展的趋势就是大前端,可以说是包罗万象。但不论趋势如何发展,目前来看HTML、CSS和JavaScript依然是整个前端开发的三大基石。所以不论…

mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?

三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器。工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题,导致报错的原因显示37,1…

将虚拟主机加入到netskills.net域环境_网站建设阿里云虚拟主机、ECS服务器、企业邮箱选择购买指南...

对于刚接触阿里云的人来说可能看到阿里云的产品介绍页面会比较头晕,各种产品分类,而且同一个产品在不同的分类目录下都能看到,下面简单介绍一下制作网站过程中常用的阿里云的产品。阿里云在网站建设方面常用的服务主要有云虚拟主机、ECS云服务…

linux查看硬盘smart_Linux检测磁盘坏道工具用什么命令

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. badblock命令简介badblock命令用于查找磁盘中损坏的区块。 电脑硬盘出现坏道后,如果不及时更换或进行技术处理&#xff0…