深度特征合成与遗传特征生成,两种自动特征生成策略的比较

2024-04-13 18:48

本文主要是介绍深度特征合成与遗传特征生成,两种自动特征生成策略的比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2f83df9d95d4ab9be0a16d8bbbaccd3e.png

来源:Deephub Imba
本文约1800字,建议阅读8分钟
本文我们将通过一个示例介绍如何使用 ATOM 包来快速比较两种自动特征生成算法。

特征工程是从现有特征创建新特征的过程,通过特征工程可以捕获原始特征不具有的与目标列的额外关系。这个过程对于提高机器学习算法的性能非常重要。尽管当数据科学家将特定的领域知识应用特定的转换时,特征工程效果最好,但有一些方法可以以自动化的方式完成,而无需先验领域知识。

在本文中,我们将通过一个示例介绍如何使用 ATOM 包来快速比较两种自动特征生成算法:深度特征合成 (Deep feature Synthesis, DFS) 和遗传特征生成 (Genetic feature generation, GFG)。ATOM 是一个开源 Python 包,可以帮助数据科学家加快对机器学习管道的探索。

基线模型

为了进行对比,作为对比的基线只使用初始特征来训练模型。这里使用的数据是来自 Kaggle的澳大利亚天气数据集的变体。该数据集的目标是预测明天是否会下雨,在目标列 RainTomorrow 上训练一个二元分类器。

 
import pandas as pd
from atom import ATOMClassifier# Load the data and have a look
X = pd.read_csv("./datasets/weatherAUS.csv")
X.head()

51a85180cf71acb6446cd18661ec821d.png

初始化实例并准备建模数据。这里仅使用数据集的一个子集(1000 行)进行演示。下面的代码估算缺失值并对分类特征进行编码。

 
atom = ATOMClassifier(X, y="RainTomorrow", n_rows=1e3, verbose=2)
atom.impute()
atom.encode()

输出如下所示。

5a9fa58ba21a302e679a81acc8809afc.png

可以使用 dataset 属性快速检查数据转换后的样子。

 
atom.dataset.head()

5e65e9a86c6992f224476ab6acab62af.png

数据现在已准备好。本文将使用 LightGBM 模型进行预测。使用 atom 训练和评估模型非常简单:

atom.run(models="LGB", metric="accuracy")

4b7678c89a4cdd7b77b6878beec8f784.png

可以看到测试集上达到了 0.8471 的准确率。下面看看自动特征生成是否可以改善这一点。

DFS

DFS 将标准数学运算符(加法、减法、乘法等)应用于现有特征,并组合这些特征。例如,在我们的数据集上,DFS 可以创建新特征 MinTemp + MaxTemp 或 WindDir9am x WindDir3pm。

为了能够比较模型,需要为 DFS 管道创建了一个新分支。如果你不熟悉 ATOM 的分支系统,请查看官方文档。

atom.branch = "dfs"

使用 atom 的 feature_generation 方法在新分支上运行 DFS。为了起见,这里只使用加法和乘法创建新特征(使用 div、log 或 sqrt 运算符可能会返回具有 inf 或 nan 值的特征,所以还需要再次进行处理)。

 
atom.feature_generation(strategy="dfs",n_features=10,operators=["add", "mul"],
)

ATOM 是使用 featuretools 包来运行 DFS的 。这里使用了 n_features=10,因此从所有可能的组合中随机选择的十个特征被添加到数据集中。

 
atom.dataset.head()

a622a1bc78692585aa95036cfefd9fd6.png

再次训练模型:

atom.run(models="LGB_dfs")

需要注意的是

  • 在模型的首字母缩写词后添加标签 _dfs 以不覆盖基线模型。

  • 不再需要指定用于验证的指标。atom 实例将自动使用任何先前模型训练的相同指标。在我们的例子中为accuracy。

dc9bf042eaf1b48871f95824f41991c5.png

看起来 DFS 并没有改进模型。结果甚至变得更糟了。让我们看看 GFG 的表现如何。

GFG

GFG 使用遗传编程(进化编程的一个分支)来确定哪些特征是有效的并基于这些特征创建新特征。与 DFS的盲目尝试特征组合不同,GFG 尝试在每一代算法中改进其特征。GFG 使用与 DFS 相同的运算符,但不是只应用一次转换,而是进一步发展它们,创建特征组合的嵌套结构。在使用运算符 add (+) 和 mul (x),特征组合的方式可能是:

add(add(mul(MinTemp, WindDir3pm), Pressure3pm), mul(MaxTemp, MinTemp))

在使用时与 DFS 一样,首先创建一个新分支(从原始 master 分支将 DFS 排除),然后训练和评估模型。同样,这里创建了 10 个新特征。

注意:ATOM 在底层使用 gplearn 包来运行 GFG。

 
atom.branch = "gfg_from_master"
atom.feature_generation(strategy="GFG",n_features=10,operators=["add", "mul"],
)

b3476d4149683829868fe781023085c1.png

可以通过 generic_features 属性访问新生成的特征、它们的名称和适应度(在遗传算法期间获得的分数)的概述。

 
atom.genetic_features

68306779345b14a3abbb653ee8d1d415.png

这里需要注意的是,由于特征的描述可能会变得很长(看上图),因此将新特征将被编号命名为例如feature n,其中 n 代表数据集中的第 n 个特征。

 
atom.dataset.head()

21e16460c675dadac5350fd7d5ca6a11.png

再次运行模型:

 
atom.run(models="LGB_gfg")

685a4b3a9566078851b1d0c1c3f1689e.png

这次得到了 0.8824 的准确率,比基线模型的 0.8471 好得多!

结果分析

所有三个模型都已训练完毕可以分析结果了。使用 results 属性可以查看所有模型在训练集和测试集上的得分。

 
atom.results

5ed07d0f6625c044eca0375fe8ac25b8.png

使用 atom 的 plot 方法可以进一步比较模型的特征和性能。

 
atom.plot_roc()

6d87e696415c80b18e7c8a74ef68a894.png

使用 atom 可以绘制多个相邻的图,查看哪些特征对模型的预测贡献最大

 
with atom.canvas(1, 3, figsize=(20, 8)):atom.lgb.plot_feature_importance(show=10, title="LGB")atom.lgb_dfs.plot_feature_importance(show=10, title="LGB + DFS")atom.lgb_gfg.plot_feature_importance(show=10, title="LGB + GFG")

463f452d0720a0594e50fa47111e4dc6.png

对于两个非基线模型,生成的特征似乎是都最重要的特征,这表明新特征与目标列相关,并且它们对模型的预测做出了重大贡献。

使用决策图,还可以查看特征对数据集中单个行的影响。

 
atom.lgb_dfs.decision_plot(index=0, show=15)

7b1ad2b8e80fee8a6e75bcb903fa2bc3.png

总结

本文中比较了在使用两种自动特征生成技术生成的新特征对于模型预测的表现。结果显示使用这些技术可以显着提高模型的性能。本文中使用了ATOM包简化处理训练和建模流程,有关 ATOM 的更多信息,请查看包的文档。

ATOM的github地址:

https://github.com/tvdboom/ATOM

使用的kaggle数据集地址:

https://www.kaggle.com/jsphyg/weather-dataset-rattle-package

编辑:王菁

178d1079264086cfd242c9cd9f8f3f93.png

这篇关于深度特征合成与遗传特征生成,两种自动特征生成策略的比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900930

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步