查看全课大纲(第 3 / 35 节)
- 1.特征工程简介
- 2.特征工程的处理流程
- 3.数据与特征概述
- 4.数据统计、相似度与数据探索
- 5.数据探索工具 Pandas_profiling
- 6.工具应用:《泰坦尼克》分析报告
- 7.构造一个微型链家租房数据集用于演示
- 8.数据预处理综述
- 9.缺失值处理实操
- 10.异常值处理实操
- 11.连续值特征构建
- 12.类别型数据特征构建
- 13.特征幅度缩放
- 14.特征离散化
- 15.特征编码:让类别数据参与建模
- 16.特征变换
- 17.时间特征
- 18.特征衍生
- 19.自动化特征工具
- 20.特征选择综述
- 21.特征选择方法
- 22.过滤式特征选择方法实操
- 23.包裹式特征选择方法
- 24.嵌入式特征选择
- 25.混序法与混合法特征选择
- 26.特征降维综述
- 27.案例实操:特征降维
- 28.特征监控概述与指标
- 29.Iris 数据集特征漂移检测案例
- 30.特征监控实战:用分布对比检测数据漂移
- 31.实时特征监控
- 32.电商销量预测项目背景介绍
- 33.数据预处理和特征工程(一)
- 34.数据预处理和特征工程(二)
- 35.数据建模
数据与特征概述
约 7 分钟
小象实战讲义 · 特征工程精讲与实践
大家好,欢迎回到《特征工程精讲与实践》课程。在上一章我们了解了特征工程的整体流程与重要性,本章我们将深入数据与特征本身,学习如何系统地认识和分析我们手中的数据。本节作为第二章的开篇,将帮助大家建立对数据与特征的基本认知,理解不同类型数据的特性,为后续的数据探索、预处理和特征构建打下坚实的基础。
💡 核心导读
- 数据对象的形态:理解表格数据、网络数据、多媒体数据等不同数据形态,明确在业务场景中最常见的是结构化的表格数据。
- 数据对象与属性:掌握数据对象(样本、实例、数据点)与属性(特征、维度、变量)的基本概念及其关系。
- 属性的类型:区分名义型(类别型)、布尔型、等级型和数值型等不同属性类型。
- 连续与离散属性:理解连续型属性(通常为数值型,可任意取值)与离散型属性(取值有限,如类别型、布尔型)的本质区别及其在后续处理中的不同考量。
数据形态与数据对象
在实际的建模场景中,我们首先需要对自己手中的数据和特征有清晰的了解。在日常工作中,我们会遇到各式各样的数据。
最常见的数据是表格数据,它们被记录成结构化的形态,也就是我们常说的行和列组成的表格。例如,在互联网公司的业务数据库中,每一行可能代表一条用户操作记录、一次下单行为,而每一列则对应记录的属性,如用户的年龄、性别、所在地区等。这种关系型数据库存储的数据矩阵是向量化的,每一行可以看作一个向量。
除了表格数据,我们还会遇到其他类型的数据,例如:
- 网络结构数据:如社交网络(Social Network)中的用户关系图。
- 多媒体数据:如自然语言处理中的文本数据,计算机视觉中的图像、视频数据。
其中,业务场景下最高频出现的是整理成表格形态的数据集,这也是本课程重点讲解的对象。
一个数据集(Dataset)由数据对象(Data Objects)构成。一个数据对象表示一个实体(Entity)。在表格数据中:
- 每一行就是一个数据对象。在机器学习中,它也被称为一个样本(Sample)、实例(Instance)、数据点(Data Point) 或对象(Object)。
- 每一列则是描述该对象的属性(Attribute),也称为特征(Feature)、维度(Dimension) 或变量(Variable)。属性是刻画对象某一个维度的特性。
# 示例:理解数据对象与属性
import pandas as pd
# 构造一个简单的产品信息表格
product_info = {
'产品ID': ['P1001', 'P1002', 'P1003', 'P1004'],
'产品名称': ['无线耳机', '机械键盘', '蓝牙音箱', '智能手表'],
'类别': ['数码', '外设', '数码', '穿戴'], # 属性:类别
'价格': [299, 450, 199, 899], # 属性:价格
'库存量': [150, 80, 200, 50] # 属性:库存量
}
df_products = pd.DataFrame(product_info)
print("产品信息表(每一行是一个数据对象/样本):")
print(df_products)
print(f"\n数据形状: {df_products.shape} (行数: {df_products.shape[0]}, 列数/属性数: {df_products.shape[1]})")产品信息表(每一行是一个数据对象/样本):
产品ID 产品名称 类别 价格 库存量
0 P1001 无线耳机 数码 299 150
1 P1002 机械键盘 外设 450 80
2 P1003 蓝牙音箱 数码 199 200
3 P1004 智能手表 穿戴 899 50
数据形状: (4, 5) (行数: 4, 列数/属性数: 5)属性的类型
数据包含不同类型的属性。了解属性的类型至关重要,因为后期我们需要针对不同类型采用不同的处理方式。
# 示例:展示不同类型的属性
# 注意:此代码块与上一个独立,自包含 import
import pandas as pd
attribute_type_demo = {
'学生ID': ['S001', 'S002', 'S003', 'S004'],
'姓名': ['张三', '李四', '王五', '赵六'],
'性别': ['男', '女', '男', '女'], # 布尔型/二值离散型
'年级': ['大一', '大三', '大二', '大四'], # 等级型(有序离散)
'专业': ['计算机', '数学', '物理', '计算机'], # 名义型/类别型(无序离散)
'GPA': [3.6, 3.8, 3.2, 3.9], # 数值型(连续型)
'是否获奖': [True, False, True, False] # 布尔型
}
df_students = pd.DataFrame(attribute_type_demo)
print("学生信息表(展示多种属性类型):")
print(df_students)
print("\n各列数据类型:")
print(df_students.dtypes)学生信息表(展示多种属性类型):
学生ID 姓名 性别 年级 专业 GPA 是否获奖
0 S001 张三 男 大一 计算机 3.6 True
1 S002 李四 女 大三 数学 3.8 False
2 S003 王五 男 大二 物理 3.2 True
3 S004 赵六 女 大四 计算机 3.9 False
各列数据类型:
学生ID str
姓名 str
性别 str
年级 str
专业 str
GPA float64
是否获奖 bool
dtype: object主要属性类型包括:
名义型(Nominal)/ 类别型(Categorical)
- 定义:数据用于分类,取值是不同类别的代号,不能区分大小或顺序。
- 示例:汽车品牌(路虎、奔驰、奥迪)、学校(北大、清华)、颜色(红、黄、蓝)。
- 处理:后续常用编码方式(如独热编码)进行处理。
布尔型(Binary)
- 定义:只有两种取值的属性。
- 示例:性别(男/女)、婚否(已婚/未婚)、是否通过(是/否)。
- 处理:常映射为0和1。
等级型(Ordinal)
- 定义:取值能够区分等级或顺序,但等级间的差值不一定有意义。
- 示例:身高(高、中、低)、满意度(非常满意、满意、一般、不满意)、成绩等级(A、B、C、D)。
- 处理:有时可按有序离散值处理,有时需进行序号编码。
数值型(Numeric)
- 定义:用数字直接刻画的属性。
- 示例:考试分数、体重、收入、温度。
- 处理:可直接用于数值计算,但常需进行幅度缩放、离散化等处理。
连续型属性与离散型属性
从取值的连续性上,我们可以将属性划分为两大类别:
# 示例:区分连续型与离散型属性
import pandas as pd
product_data = {
'产品名称': ['手机A', '手机B', '笔记本C', '平板D'],
'产品类别': ['电子', '电子', '电脑', '电子'], # 离散型(类别型)
'价格(元)': [2999, 3999, 5999, 1999], # 连续型(数值型)
'用户评级': ['A', 'B', 'A', 'C'], # 离散型(等级型)
'库存状态': ['有货', '缺货', '有货', '有货'] # 离散型(布尔型)
}
df_products = pd.DataFrame(product_data)
print("产品数据表(区分连续/离散属性):")
print(df_products)产品数据表(区分连续/离散属性):
产品名称 产品类别 价格(元) 用户评级 库存状态
0 手机A 电子 2999 A 有货
1 手机B 电子 3999 B 缺货
2 笔记本C 电脑 5999 A 有货
3 平板D 电子 1999 C 有货连续型属性(Continuous Attribute)
- 特点:取值可以在实数域(在物理含义合理范围内)任意取值,通常表现为数值型。
- 本质:值域是连续的,理论上在任意两个不同取值之间都存在无限多个其他可能取值。
- 示例:身高(175.0 cm, 175.2 cm, 175.25 cm…)、温度、长度、价格。
- 后续处理:常涉及幅度缩放(标准化/归一化)、离散化(分箱)等。
离散型属性(Discrete Attribute)
- 特点:取值是有限个或可数无限个的。
- 本质:值域是离散的集合。
- 包含类型:名义型、布尔型、等级型都属于离散型。
- 示例:汽车品牌(有限集合)、颜色(有限集合)、购买件数(取值为可数的整数)。
- 后续处理:常涉及编码(如独热编码、标签编码)、统计特征构建等。
核心区别:连续型属性的取值充满某个区间(不可逐一列举),离散型属性的取值是一个可数集合(可逐一列举)。计数类离散属性(如购买件数)同样关心“多少”,等级型离散属性(如会员等级)也有顺序——所以判别标准是值域是否连续/可数,而不是“关心什么”。理解这一区别是选择正确特征处理方法的第一步。
📝 动手练一练
- 概念辨析:假设你正在分析一个电商用户数据集,包含以下字段:
用户ID、注册日期、最近一次登录城市、近30天消费金额、会员等级(普通、白银、黄金、铂金)、是否使用过优惠券。请判断每个字段属于哪种属性类型(名义型/布尔型/等级型/数值型),以及是连续型还是离散型。
👉 点击查看参考答案
用户ID:名义型(离散型)。它是用户的唯一标识符,无顺序意义。注册日期:时间型数据。既可转换为连续的数值(如时间戳),也可衍生出离散的周期特征(年、月、星期),实践中更常见后一种用法。最近一次登录城市:名义型(离散型)。城市名称是分类标签。近30天消费金额:数值型(连续型)。金额是连续的数值。会员等级:等级型(离散型)。等级之间有顺序(铂金 > 黄金 > 白银 > 普通),但差值无固定含义。是否使用过优惠券:布尔型(离散型)。只有“是”或“否”两种取值。
- 代码实践:请创建一个包含至少3种不同属性类型(名义型、数值型、布尔型)的微型DataFrame,数据内容自定(例如,描述3本书或3部电影),并用代码打印出DataFrame及各列的数据类型。
👉 点击查看参考答案
import pandas as pd
# 创建微型图书信息DataFrame
book_data = {
'书名': ['机器学习实战', 'Python数据分析', '深度学习'],
'类别': ['计算机', '计算机', '计算机'], # 名义型
'页数': [350, 280, 500], # 数值型(离散型,可数的整数取值)
'是否精装': [True, False, True], # 布尔型
'评分等级': ['A', 'B+', 'A'] # 等级型
}
df_books = pd.DataFrame(book_data)
print("图书信息表:")
print(df_books)
print("\n各列数据类型:")
print(df_books.dtypes)图书信息表:
书名 类别 页数 是否精装 评分等级
0 机器学习实战 计算机 350 True A
1 Python数据分析 计算机 280 False B+
2 深度学习 计算机 500 True A
各列数据类型:
书名 str
类别 str
页数 int64
是否精装 bool
评分等级 str
dtype: object本章小结
本节我们建立了对数据与特征的基本认知框架。我们了解到,在特征工程实践中,最常面对的是结构化的表格数据,其中每一行代表一个需要分析的数据对象(样本),每一列代表描述该对象的一个属性(特征)。属性根据其性质可分为名义型、布尔型、等级型和数值型;根据取值的连续性,又可归纳为连续型属性和离散型属性两大类。这种分类并非学术游戏,而是直接决定了我们后续将采用何种方法进行特征预处理、构建与选择——例如,连续型特征常需标准化,离散型特征常需编码。
📋 行动清单
- 审视你的数据:打开一个你正在或即将分析的数据集(如泰坦尼克数据集
titanic.csv),用df.head()和df.dtypes快速查看数据形态和属性类型。 - 完成动手练习:通过自建微型DataFrame,巩固对属性类型和连续/离散划分的理解。
- 预习思考:想一想,对于数值型(连续)特征,我们可以计算它的平均值、方差,那么对于类别型(离散)特征,我们可以用哪些统计量来描述它呢?
—— 小象教研组