查看全课大纲(第 3 / 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

主要属性类型包括:

  1. 名义型(Nominal)/ 类别型(Categorical)

    • 定义:数据用于分类,取值是不同类别的代号,不能区分大小或顺序。
    • 示例:汽车品牌(路虎、奔驰、奥迪)、学校(北大、清华)、颜色(红、黄、蓝)。
    • 处理:后续常用编码方式(如独热编码)进行处理。
  2. 布尔型(Binary)

    • 定义:只有两种取值的属性。
    • 示例:性别(男/女)、婚否(已婚/未婚)、是否通过(是/否)。
    • 处理:常映射为0和1。
  3. 等级型(Ordinal)

    • 定义:取值能够区分等级或顺序,但等级间的差值不一定有意义。
    • 示例:身高(高、中、低)、满意度(非常满意、满意、一般、不满意)、成绩等级(A、B、C、D)。
    • 处理:有时可按有序离散值处理,有时需进行序号编码。
  4. 数值型(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   有货
  1. 连续型属性(Continuous Attribute)

    • 特点:取值可以在实数域(在物理含义合理范围内)任意取值,通常表现为数值型。
    • 本质:值域是连续的,理论上在任意两个不同取值之间都存在无限多个其他可能取值。
    • 示例:身高(175.0 cm, 175.2 cm, 175.25 cm…)、温度、长度、价格。
    • 后续处理:常涉及幅度缩放(标准化/归一化)、离散化(分箱)等。
  2. 离散型属性(Discrete Attribute)

    • 特点:取值是有限个或可数无限个的。
    • 本质:值域是离散的集合。
    • 包含类型:名义型、布尔型、等级型都属于离散型。
    • 示例:汽车品牌(有限集合)、颜色(有限集合)、购买件数(取值为可数的整数)。
    • 后续处理:常涉及编码(如独热编码、标签编码)、统计特征构建等。

核心区别:连续型属性的取值充满某个区间(不可逐一列举),离散型属性的取值是一个可数集合(可逐一列举)。计数类离散属性(如购买件数)同样关心“多少”,等级型离散属性(如会员等级)也有顺序——所以判别标准是值域是否连续/可数,而不是“关心什么”。理解这一区别是选择正确特征处理方法的第一步。

📝 动手练一练

  1. 概念辨析:假设你正在分析一个电商用户数据集,包含以下字段:用户ID、注册日期、最近一次登录城市、近30天消费金额、会员等级(普通、白银、黄金、铂金)、是否使用过优惠券。请判断每个字段属于哪种属性类型(名义型/布尔型/等级型/数值型),以及是连续型还是离散型。
👉 点击查看参考答案
  • 用户ID:名义型(离散型)。它是用户的唯一标识符,无顺序意义。
  • 注册日期:时间型数据。既可转换为连续的数值(如时间戳),也可衍生出离散的周期特征(年、月、星期),实践中更常见后一种用法。
  • 最近一次登录城市:名义型(离散型)。城市名称是分类标签。
  • 近30天消费金额:数值型(连续型)。金额是连续的数值。
  • 会员等级:等级型(离散型)。等级之间有顺序(铂金 > 黄金 > 白银 > 普通),但差值无固定含义。
  • 是否使用过优惠券:布尔型(离散型)。只有“是”或“否”两种取值。
  1. 代码实践:请创建一个包含至少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,巩固对属性类型和连续/离散划分的理解。
  • 预习思考:想一想,对于数值型(连续)特征,我们可以计算它的平均值、方差,那么对于类别型(离散)特征,我们可以用哪些统计量来描述它呢?

—— 小象教研组