【机器学习笔记Ⅰ】10 特征工程

特征工程(Feature Engineering)详解

特征工程是机器学习和数据科学中的核心环节,旨在通过对原始数据的转换、组合和提取,构建更适合模型的高质量特征。其质量直接决定模型性能上限(“数据和特征决定了模型的上限,而算法只是逼近这个上限”)。


1. 特征工程的核心目标

  1. 提升模型性能:增强特征与目标变量的相关性。
  2. 降低计算成本:减少冗余特征,加速训练。
  3. 改善泛化能力:避免过拟合,提高鲁棒性。

2. 特征工程的主要步骤

(1) 数据理解与探索

  • 查看数据分布:统计描述(均值、方差、分位数)、可视化(直方图、箱线图)。
  • 检测异常值:Z-score、IQR方法。
  • 分析特征相关性:热力图、皮尔逊相关系数。

代码示例

import pandas as pd
import seaborn as sns# 加载数据
data = pd.read_csv("data.csv")
# 统计描述
print(data.describe())
# 相关性热力图
sns.heatmap(data.corr(), annot=True)

(2) 数据清洗

  • 处理缺失值
    • 删除:data.dropna()
    • 填充:均值/中位数(data.fillna())、预测模型(如KNN)。
  • 处理异常值
    • 截断:np.clip(values, lower, upper)
    • 分箱平滑。

示例

# 填充缺失值
data["age"].fillna(data["age"].median(), inplace=True)
# 处理异常值(基于IQR)
Q1, Q3 = data["income"].quantile([0.25, 0.75])
IQR = Q3 - Q1
data = data[(data["income"] >= Q1 - 1.5*IQR) & (data["income"] <= Q3 + 1.5*IQR)]

(3) 特征构造

  • 领域知识驱动
    • 电商:从“购买时间”提取“是否周末”、“时段(早/中/晚)”。
    • 文本:从“评论”提取“情感分数”、“关键词频率”。
  • 数学变换
    • 对数变换:np.log(x)(处理长尾分布)。
    • 多项式特征:sklearn.preprocessing.PolynomialFeatures(如 (x^2, xy))。

代码示例

from sklearn.preprocessing import PolynomialFeatures# 多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X[["feature1", "feature2"]])

(4) 特征编码

  • 分类变量编码
    • 独热编码(One-Hot):pd.get_dummies()
    • 目标编码(Target Encoding):用目标变量均值代替类别。
  • 数值变量分箱
    • 等宽分箱:pd.cut(data, bins=5)
    • 等频分箱:pd.qcut(data, q=5)

示例

# 独热编码
data_encoded = pd.get_dummies(data, columns=["city"])
# 分箱
data["age_bin"] = pd.cut(data["age"], bins=[0, 18, 35, 60, 100], labels=["child", "young", "adult", "elder"])

(5) 特征缩放

  • 标准化(Standardization)StandardScaler(均值0,方差1)。
  • 归一化(Normalization)MinMaxScaler(缩放到[0,1])。
  • 鲁棒缩放(Robust Scaling)RobustScaler(抗异常值)。

代码

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

(6) 特征选择

  • 过滤法(Filter)
    • 方差阈值:VarianceThreshold(threshold=0.1)
    • 相关性:选择与目标变量相关性高的特征(如相关系数 > 0.3)。
  • 包裹法(Wrapper)
    • 递归特征消除(RFE):RFECV(estimator=LogisticRegression())
  • 嵌入法(Embedded)
    • L1正则化(Lasso):Lasso(alpha=0.1).fit(X, y)

示例

from sklearn.feature_selection import SelectKBest, f_classif# 选择K个最佳特征
selector = SelectKBest(score_func=f_classif, k=5)
X_selected = selector.fit_transform(X, y)

3. 高级特征工程技术

(1) 时间序列特征

  • 滑动窗口统计:均值、标准差(pandas.rolling())。
  • 周期性特征:提取小时、星期、季节。

(2) 文本特征

  • 词袋模型CountVectorizer
  • TF-IDFTfidfVectorizer
  • 词嵌入:Word2Vec、BERT。

(3) 图像特征

  • 手工特征:HOG(方向梯度直方图)、SIFT。
  • 深度学习:CNN提取的特征(如ResNet最后一层输出)。

4. 特征工程的评估

  • 模型性能对比:在验证集上测试特征工程前后的AUC、RMSE等指标。
  • 特征重要性分析
    • 树模型:model.feature_importances_
    • SHAP值:解释特征贡献。

代码

import shap# 计算SHAP值
explainer = shap.Explainer(model)
shap_values = explainer(X)
shap.summary_plot(shap_values, X)

5. 工具与库推荐

任务工具
数据清洗Pandas, OpenRefine
特征构造FeatureTools, Tsfresh(时间序列)
特征选择Scikit-learn, XGBoost内置特征重要性
自动化特征工程AutoFeat, Feature-engine

6. 总结

  • 核心原则:理解业务、迭代实验、持续验证。
  • 关键步骤:清洗 → 构造 → 编码 → 缩放 → 选择。
  • 避坑指南
    • 避免数据泄漏(先拆分再处理)。
    • 平衡特征数量与信息量(防止维度灾难)。

特征工程是艺术与科学的结合,需结合领域知识和数据直觉,不断优化!


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

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

相关文章

20250708-03-string结构及命令详解_笔记

一、字符串操作1. set命令&#xfeff;1&#xff09;set命令详解&#xfeff;&#xfeff;基本语法与参数命令格式&#xff1a;set key value [ex 秒数]/[px 毫秒数][nx]/[xx]有效期设置&#xff1a;ex参数&#xff1a;以秒为单位设置过期时间&#xff0c;如set a 1 ex 10表示1…

SpringBoot3-集成MybatisPlus

此次操作是在多模块下进行的&#xff0c;SpringBoot3-规划多模块目录 添加管理依赖 根模块 zibocoder-parent 的 pom.xml 中添加 MybatisPlus bom 管理依赖 <properties>...<mybatis-plus.version>3.5.12</mybatis-plus.version>... </properties> <…

部署MongoDB

环境:CentOS7 添加 MongoDB 官方 YUM 仓库 sudo vi /etc/yum.repos.d/mongodb-org-6.0.repo 将以下内容粘贴到文件中(以 MongoDB 6.0 为例): [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86…

重学前端002 --响应式网页设计 CSS 基础

文章目录css 样式特殊说明根据在这里 Freecodecamp 实践&#xff0c;调整顺序后做的总结。 css 样式 body {background-color: red; # 跟background-image 不同时使用background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);font-family: sans-…

Zig高并发爬取数据简洁模版

上文中我们介绍了Zig语言得爬虫的有些优劣势&#xff0c;想必大家对于自身项目选择那种语言做爬虫应该有些思路了&#xff0c;今天我将使用Zig的标准库来构建一个简单的高并发爬虫模板。由于Zig的异步机制和标准库中的http模块&#xff0c;我们可以实现一个基于事件循环的爬虫。…

IS-IS 协议 | LSP 传输与链路状态数据库同步机制

略作整理&#xff0c;待校。IS-IS 中 SRM 与 SSN 标志的作用及协同机制 SRM 和 SSN 标志的作用 在 IS-IS 协议中&#xff0c;SRM 和 SSN 是两个关键标志&#xff0c;用于控制和优化 LSP&#xff08;Link State PDU,链路状态信息&#xff09;在网络中的泛洪与同步过程。 一、SRM…

xxl-job 改造适配pg数据后的Jenkins自动部署

接上文适配pg数据库之后需要进行部署&#xff0c;便有了此文 1.下载并安装Jenkins如下&#xff1a; https://mirrors.jenkins.io/war-stable/2.504.3/jenkins.war nohup java -jar jenkins.war --httpPort8080 & 启动Jenkins并解锁安装需要的环境&#xff0c;git&#xff0…

数据库Oracle从入门到精通!第四天(并发、锁、视图)

八、并发控制数据库是一个共享资源&#xff0c;可以为多个应用程序所共享&#xff0c;这些程序可以串行执行&#xff08;排队执行&#xff09;&#xff0c;但是很多情况下&#xff0c;可能出现多个程序或一个程序中的多个进程并行的执行&#xff0c;这就是数据库的并行操作&…

EXCEL(带图)转html

文章目录叙述1、效果2、excel 转换主逻辑3、其他补充3.0 主前端bootstrap3.1 my.css&#xff1a;3.2 my.js3.3 入口home.html3.4 Data.ashx叙述 要实现H5 展示excel 查询 了一下没有好的办法,自己写了一个,简单记录一下 1、效果 用bootstrap 根据sheet做了一个菜单。 2、exc…

小程序富文本Editor插入图片、超链接、公式等的一次尝试

小程序插入图片 通过EditorContext.insertImage接口可以实现图片的插入&#xff1a; EditorContext.insertImage({src,width,height,data, })如何插入超链接、公式、视频、表格等等? 通过EditorContext.insertCustomBlock应该是可以实现的&#xff0c;具体实现方式我没有了…

传输层协议TCP、UDP

传输层协议TCP、UDP 1、TCP和UDP报文格式 传输层协议TCPvsUDP 传输层主要两个传输协议&#xff0c;分别是TCP和UDP&#xff0c;负责提供流量控制、排序服务和错误校验。 &#xff08;1&#xff09;TCP是面向连接的&#xff0c;一般用于传输数据量比较少&#xff0c;且对可靠性要…

设计模式—专栏简介

大学总是忙着参加ACM实验室的各种事情&#xff0c;到了毕业的时候&#xff0c;对于设计模式也是仅了解单例模式。毕业后&#xff0c;刚开始代码也是乱写一通&#xff0c;完全没有章法。整个开发环境也是为了解决问题&#xff0c;从来没有考虑结构化什么的&#xff08;没办法&am…

面试150 链表的复制

思路 python可以使用调库法&#xff0c;使用深度拷贝 """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:de…

MySQL分布式ID冲突详解:场景、原因与解决方案

引言 在分布式系统开发中&#xff0c;你是否遇到过这样的崩溃时刻&#xff1f;——明明每个数据库实例的自增ID都从1开始&#xff0c;插入数据时却提示“Duplicate entry ‘100’ for key ‘PRIMARY’”&#xff1b;或者分库分表后&#xff0c;不同库里的订单ID竟然重复&#x…

c++文字游戏_闯关打怪2.0(开源)

本次更新内容: 1.增强对手性能 2.可暂停(按N) 3.修复些许bug 4.增加boos关(第10、20、30...关) 1. 游戏概述 本游戏是一个基于Windows控制台的回合制战斗游戏,采用俯视视角的2D平面设计。玩家控制角色"p"在1325大小的封闭场景中与敌人"@"战斗,通过…

Java学习第十二部分——idea各种项目简介

目录 一.前言 二.语言介绍 三.生成器介绍 四.拓展 一.前言 打开idea项目创建时发现如上情况&#xff0c;“新建项目”下面的是语言&#xff0c;生成器下面的是这些语言对应的生成器工具&#xff0c;本文将简单介绍。 二.语言介绍 Java 用途&#xff1a;Java是一种广泛使…

Codeforces Round 868 (Div. 2) D. Unique Palindromes(1900,构造)

Problem - D - Codeforces 不错的字符串构造体&#xff0c;记录一下 首先注意到k≤20这一条件。对于一个长度为n的字符串&#xff0c;最多有n个不同的回文子串&#xff0c;这种情况出现在所有字符都相同时。因此&#xff0c;限制条件中的xi必须满足xi≤ci&#xff0c;且相邻两…

ClickHouse 全生命周期性能优化

引言 ClickHouse作为列式存储的OLAP数据库&#xff0c;以其极致的查询性能著称&#xff0c;但"高性能"并非开箱即用。不合理的表设计、SQL写法或集群配置&#xff0c;可能导致性能衰减甚至服务不可用。本文基于ClickHouse 24.3版本&#xff0c;从设计规范、开发规范、…

Linux sed 命令 详解

在 Linux 系统中&#xff0c;sed&#xff08;Stream Editor&#xff09;是一个非常强大且灵活的文本处理工具。它不仅可以用于简单的文本替换、删除和插入操作&#xff0c;还能实现复杂的文本转换任务。 &#x1f4cc; 一、什么是 sed&#xff1f; sed 是一个基于模式匹配对文…

项目进度同步不及时,如何提升信息透明度

项目进度同步不及时的核心问题包括沟通渠道不畅通、缺乏统一的信息平台、未建立明确的进度更新机制、团队意识不足、责任划分不明确等。其中&#xff0c;缺乏统一的信息平台最为关键。统一的信息平台能够确保所有相关人员实时掌握最新的进度状态&#xff0c;避免信息孤岛&#…