首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >8个特征工程技巧提升机器学习预测准确性

8个特征工程技巧提升机器学习预测准确性

作者头像
数据科学工厂
发布于 2024-07-26 10:13:09
发布于 2024-07-26 10:13:09
4930
举报
引言

对于机器学习从业者来说,掌握各种特征工程技巧是非常有帮助的。毕竟,特征是影响机器学习和深度学习模型实时表现的关键因素。在机器学习领域,提升模型预测准确性的关键之一是选择合适的特征,并剔除那些对模型性能影响不大的特征。对于数据科学家或机器学习工程师来说,这通常是他们工作中的重要一环,尤其是在构建能够良好泛化到测试数据集的复杂模型时。

以预测心脏病为例,体重指数(BMI)是一个强有力的预测指标。如果我们在预测一个人的血压水平时忽略了这个特征,结果往往不够准确。因此,BMI是一个人是否患有这些疾病的重要指标,考虑这个特征对预测结果有显著影响。

再比如预测一个人是否会违约的案例。银行在决定是否放贷前,会询问借款人的薪水、净资产和信用历史等信息。如果让一个人基于这些因素决定是否放贷,他会仔细考虑借款人的总薪水和整体信用历史。

类似地,当机器学习模型接收到与人类相同的数据时,它也会学习如何获取重要的信息,以决定一个人是否会偿还贷款。如果我们从数据中移除了薪水这样的关键特征,模型将无法准确判断一个人是否会偿还贷款,这会导致预测结果出现较大偏差。

因此,确保机器学习和深度学习模型具备正确的特征,对于它们在测试集和实时数据上表现良好至关重要。

  • 机器学习中的特征化技术

我们已经认识到选择合适的特征对于提升模型预测效果至关重要。接下来,本文[1]将探索一些特征化技术,这些技术不仅可以辅助我们的模型进行预测,还能提升预测结果的质量。

1. 缺失值填充(Imputation)

数据插补是一种填补数据集中缺失值的技术。尽管我们在网上经常遇到的一些小型数据集,如玩具数据集,它们通常包含了完整的特征和标签,没有异常或缺失值,但现实世界中的数据往往并非如此,它们常常存在缺失值。因此,我们需要采取一些特定的措施来填补这些缺失的数据。

在进行数据插补时,我们有多种方法可供选择。例如,我们可以用特征的平均值来替代缺失值,或者使用中位数或众数插补方法。通过这些方法,我们可以确保数据集中不再有缺失值。

以预测个人是否会拖欠贷款为例,在我们的机器学习模型中,工资是一个重要的特征。但在我们的数据集中,可能并不是所有参与者的工资信息都齐全。在这种情况下,一个有效的策略是使用所有工资数据的平均值来填补那些缺失的工资信息。

2. 缩放(Scaling)

在机器学习中,我们通常会根据模型的需要提供不同的特征集,以便模型能够选择最合适的特征来预测结果或目标变量。但值得注意的是,当我们首次获取数据时,这些特征的量级可能各不相同。

以房价预测为例,我们可能会考虑卧室数量和利率这两个特征。卧室数量是按单位计数的,而利率则是以美元为单位的。如果我们直接将这些特征用于机器学习模型,模型可能会错误地认为以美元计价的利率特征在数值上远大于卧室数量。但实际上,这种比较是不合理的,正如我们之前所讨论的。因此,在将这些特征输入模型进行预测分析之前,对它们进行适当的缩放处理是非常关键的。这样可以确保模型能够更准确地理解和比较不同特征对预测结果的影响。

3. 归一化(Normalization)

归一化是一种缩放数据的方法,它通过首先确定每个特征的最大值和最小值,然后将数据中的其他值进行转换。通过这种方式,我们确保所有特征的值域都在0到1之间。这样做可以帮助我们的模型更有效地进行学习和预测。

以判断客户是否会终止互联网服务为例,月费和使用年限是两个关键特征。月费通常以美元为单位,而使用年限则以年或月为单位。由于这两个特征的量级不同,应用归一化处理就显得尤为重要。它可以帮助模型更准确地理解不同特征对预测结果的影响,从而提高预测的准确性。

4. 标准化(Standardization)

特征标准化是一种数据转换技术,它通过调整数据使得每个特征的输出具有单位方差和零均值。这种方法有助于解决不同特征量级差异导致的模型误判问题,即模型可能会错误地认为数据量级较大的特征更重要。通过标准化处理,可以确保模型在预测时能够更公正地评估各个特征的重要性,从而提高预测的准确性。

例如,在估算汽车价格时,我们会考虑气缸数和行驶里程这两个特征。由于这两个特征的量级不同,我们需要进行标准化处理,使得它们在模型预测前有一个统一的衡量标准。这样,模型在分析时能够更准确地比较这些特征对汽车价格的影响。

5. 独热编码(One Hot Encoding)

假设我们的数据集中包含许多类别特征,如国家、州、姓名等。这些特征在原始数据中通常以文本形式出现,而机器学习模型需要的是数值型数据。为了使模型能够处理这些类别特征,我们需要将它们转换为数值型特征。

这种转换过程称为独热编码。在独热编码中,每个类别特征都被视为一个独立的列,每个列对应一个类别。如果某个类别在数据中出现,则相应的列值为1;如果没有出现,则为0。例如,如果我们有一个“国家”特征,包含“中国”、“美国”等选项,独热编码后,每个国家都会被转换成一个独立的列,每个列的值要么是1(表示该类别存在),要么是0(表示该类别不存在)。

通过这种方式,机器学习模型就可以更容易地处理这些原本是文本形式的类别数据,从而提高模型的预测能力。

6. 响应编码(Response Coding)

响应编码是一种处理类别数据的方法,它与独热编码相似,但转换方式有所不同。在响应编码中,我们关注的是每个类别目标的平均值。以房价预测为例,为了预测不同地区的房价,我们会将地区进行分组,并计算每个地区的平均房价。然后,用这个平均房价来替代原来的地区名称,将原本的类别特征转化为数值特征。这样,模型就能更直观地理解不同社区对房价的影响。

以汽车价格预测为例,汽车类型如SUV或轿车可能会影响价格。在这种情况下,响应编码可以将汽车类型这一类别特征转换为数值特征。具体做法是,分别计算SUV和轿车的平均价格。如果汽车类型是SUV,就用SUV的平均价格来替代;如果是轿车,就用轿车的平均价格来替代。通过这种方式,模型可以更准确地预测不同类型汽车的价格。

7. 处理异常值(Handling Outliers)

异常值是指在数据集中显得与众不同的数据点。尽管如此,数据中的某些异常值对于模型正确预测结果来说可能是非常关键的。如果数据集中存在大量异常值,可能会影响模型对这些异常值的预测准确性,并降低其对实际数据的泛化能力。因此,在训练模型并将其部署到生产环境之前,我们需要采取适当措施来处理这些异常值。

处理异常值的方法多种多样,其中一种常见的方法是计算每个特征的标准差。如果某个数据点的值超出了均值3个标准差的范围,我们通常会将其识别为异常值并予以剔除,以避免它们对机器学习模型的预测结果产生负面影响。

以预测个人是否会拖欠贷款为例,我们可能会考虑使用个人工资信息作为特征。然而,工资数据可能存在不准确的情况,并且可能包含大量异常值。如果使用这些包含异常值的数据训练机器学习模型,模型在测试集或实际应用中的表现可能会大打折扣。因此,最佳做法是在将数据输入模型之前,先剔除异常值。这可以通过分析工资数据的标准差来实现,自动删除那些超出3个标准差范围的值,从而帮助模型做出更可靠的预测。

8. 对数转换(Log Transformation)

当数据分布呈现出明显的偏斜,即大部分数据值集中在某个区域而少数数据点远离平均水平时,模型可能难以准确捕捉这种复杂的数据关系。在这种情况下,我们可以采用对数变换技术来调整数据,减少其偏斜度。这样做可以使模型对异常值具有更好的鲁棒性,并能更准确地泛化到实际数据中。对数变换是一种有效的特征工程方法,能够显著提升机器学习模型的预测性能。

以预测个人是否会拖欠贷款为例,我们可以考虑对工资数据进行对数变换。因为工资数据通常表现出显著的偏斜性:大多数人(约80%)的收入处于基本工资水平,而少数人(约20%)的收入则远高于平均水平。这种偏斜性可以通过对数变换来调整,从而使模型能够更公平地处理不同收入水平的数据,提高预测的准确性。

总结

阅读完这篇文章,你应该已经掌握了对构建有效的机器学习模型至关重要的多种特征工程技巧。恰当地应用这些最佳的特征工程技术,不仅能够帮助我们更高效地处理数据,还能为公司带来深刻的洞见和价值,这正是人工智能应用的成果之一。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冷冻工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis批量插入或更新的正确姿势
另外一篇博客是对本文的补充,也可以参考一下:https://blog.csdn.net/w605283073/article/details/88652042
全栈程序员站长
2022/11/18
1.8K0
Mybatis批量插入或更新的正确姿势
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
点击关注公众号,Java干货及时送达 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。 mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into USER (id, name) values     <foreach
Java技术栈
2022/08/25
1.2K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
Mybatis Plus 批量插入性能优化,非常实用!
物联网平台背景,传感器采集频率干到了1000Hz,分了100多张表出来,还是把mysql干炸了。当前单表数据量在1000来w,从kafka上拉数据异步批量插入,每次插入数据量1500条,测试的时候还没问题,结果上线没多久,kafka服务器直接挂了,赶忙看日志,kafka服务器堆积了几十G的数据,再去看生产环境日志,发现到最后单次批量插入用时固定在10多秒,甚至20多秒,kafka直接把消费端踢出了消费组…从而kafka消息一直没有消费,总重导致kafka数据堆积挂掉了…
码猿技术专栏
2023/05/01
8K2
Mybatis Plus 批量插入性能优化,非常实用!
MyBatis批量插入之forEach与Batch的抉择
创建数据表,并设置22个字段。也许你会好奇为什么创建如此多字段呢?因为只有在多字段且数据量较大时,才能体现BATCH的优势。也就是说在数据表字段较少,且保存的数据量不多的情况呀,forEach实现的批量插入还是有优势的,但是却有一个隐含的风险,这里先按下不表。
猫老师的叶同学
2023/03/23
2K0
MyBatis批量插入之forEach与Batch的抉择
MyBatis 批量插入几千条数据,请慎用Foreach
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2021/12/16
1.3K0
MyBatis 批量插入几千条数据,请慎用Foreach
13 秒插入 30 万条数据,批量插入正确的姿势!
超出最大数据包限制了,可以通过调整max_allowed_packet限制来提高可以传输的内容,不过由于30万条数据超出太多,这个不可取,梭哈看来是不行了 😅😅😅
好好学java
2024/04/10
1.2K0
13 秒插入 30 万条数据,批量插入正确的姿势!
真正的mybatis-plus批量插入(Mysql语法)
mybatis-plus内置提供了InsertBatchSomeCulumn来实现真批量插入,但是由于只支持MySQL的语法格式,所以没有在通用的API作为默认使用。
用户1448294
2023/10/27
7.1K0
MyBatis-14MyBatis动态SQL之【foreach】
虽然可以使用{ids}方式直接获取值,但{ids}不能防止SQL注入, 想要避免SQL注入就需要用#{}的方式,这时就要配合使用foreach标签来满足需求.
小小工匠
2021/08/17
6460
mybatis-plus批量插入你用对了吗
记得有一次我们小组code review,组长看了下我们批量插入是使用mybatis原生的xml foreach实现的,于是二话不说,拍桌子,说这有性能问题。叫我们直接使用mybatis-plus,可是为啥呢?怎么用,需要注意哪些地方,也没给我们说个明白。好吧,我们对这一块也没具体调研过,就直接按他的想法去实现了。性能有没有提升了好几倍呢,其实也没实践过,反正review过了。直到有一天。。。
阿建dong一点
2022/11/26
4.1K1
mysql批量写入_mysql insert多条数据
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
全栈程序员站长
2022/11/08
7K0
mysql批量写入_mysql insert多条数据
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码)
搜云库技术团队
2023/10/30
2.3K0
求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。
Mybatis系列第四讲 Mybatis使用详解(2)
SqlSession相当于一个连接,可以使用这个对象对db执行增删改查操作,操作完毕之后需要关闭,使用步骤:
易兮科技
2020/09/26
6950
MyBatis批量插入大量数据(1w以上)
问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBatis开始报错。项目使用技术:SpringBoot、MyBatis
用户7353950
2022/06/23
2K0
数据库批量插入这么讲究的么?
最近新的项目写了不少各种 insertBatch 的代码,一直有人说,批量插入比循环插入效率高很多,那本文就来实验一下,到底是不是真的?
秦怀杂货店
2022/01/04
1.1K0
02-MybatisPlus批量插入性能够吗?
“不要用 mybatis-plus 的批量插入,它其实也是遍历插入,性能很差的”。真的吗?他们的立场如下:
JavaEdge
2025/06/01
1180
02-MybatisPlus批量插入性能够吗?
mybatis中批量插入的两种方式(高效插入)
mybatis中批量插入的两种方式(高效插入)
Java架构师必看
2021/09/30
2.4K0
MyBatis:缓存,延迟加载,注解应用
实际开发过程中很多时候并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载。
RendaZhang
2020/09/08
9730
MyBatis:缓存,延迟加载,注解应用
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
来源:blog.csdn.net/huanghanqian/article/details/83177178/ 近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。(由于项目保密,以下代码均为自己手写的demo代码) <insert id="batchInsert" parameterType="java.util.List">     insert into 
程序猿DD
2022/09/08
1K0
MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟...
MyBatis一次性批量插入几千条数据,为什么性能很差?
近日,项目中有一个耗时较长的Job存在CPU占用过高的问题,经排查发现,主要时间消耗在往MyBatis中批量插入数据。mapper configuration是用foreach循环做的,差不多是这样。
Java技术债务
2022/08/09
4.2K0
MyBatis一次性批量插入几千条数据,为什么性能很差?
java进阶|MyBatis系列文章(五)注解版批量操作的增删改查
六,由于这里都是基于自己的测试操作,写法上不满足正规的流程,比如说这里直接在controller层调用了userMapper的方法操作数据库,正常的应该还有一个userService接口的操作,这里简单了一些。
码农王同学
2020/04/27
2.1K0
推荐阅读
相关推荐
Mybatis批量插入或更新的正确姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档