在机器学习中模型通常不是直接接收“房子”“邮件”“图像”这样的现实对象而是接收一种更抽象、更统一的数据表示形式输入部分记为 X输出目标记为 y。在 Scikit-learn 中这几乎是最基本、最频繁出现的接口约定监督学习模型通常通过 fit(X, y) 进行训练其中 X 保存样本的特征表示y 保存对应的目标值或类别标签。一、什么是特征矩阵特征矩阵Feature Matrix通常记为 X它表示模型的输入数据整体。其最常见形式是一个二维数组或矩阵通常用 NumPy 数组或 Pandas 的 DataFrame 来表示。其中• 每一行表示一个样本sample• 每一列表示一个特征feature图 1 特征矩阵的基本结构X 的典型尺寸可写作 (n_samples, n_features)。比如在 Scikit-learn 内置的鸢尾花数据集中• 有 150 个样本• 每个样本有 4 个特征分别表示花萼长度sepal length、花萼宽度sepal width、花瓣长度petal length、花瓣宽度petal width那么 X 的形状就是 (150, 4)。这正表明 X 是一个 n_samples × n_features 的数组。要注意的是模型通过 X 看到的是样本的特征表示而不是现实对象本身。真正进入模型的是对象经过抽象、提取和整理之后形成的特征矩阵。因此预处理与特征提取的目标本质上就是把原始数据转换为适合下游估计器使用的样本矩阵 X。二、什么是目标变量目标变量Target通常记为 y它表示监督学习中每个样本对应的目标结果。在最典型的单输出监督学习问题中y 往往是一维数组通常用一维的 NumPy 数组或 Pandas 的 Series 表示因此也常被称为“目标向量”Target Vector。例如• 在房价预测中y 保存每套房屋的价格• 在垃圾邮件识别中y 保存每封邮件的类别标签• 在手写数字识别中y 保存每张图像对应的数字类别如果 X 的形状是 (n_samples, n_features)那么 y 的形状通常就是 (n_samples,)它的长度与样本数一致。比如在 Scikit-learn 的鸢尾花数据集中• y 是一个长度为 150 的一维数组• 每个元素取值0、1 或 2要注意的是y 存储的是类别索引而不是字符串名称。可以通过 iris.target_names[y] 将索引映射为对应类别名称。图 2 鸢尾花数据集中的 y 值与对应类别名称在分类任务中目标变量里的值通常就是类别标签因此 y 也常被理解为标签集合。在回归任务中y 则通常是连续数值目标。也就是说“目标变量”是更一般的叫法在单输出监督学习中y 常表现为一维数组此时也常称为“目标向量”。而“标签”更多用于分类场景。三、特征矩阵与目标变量的对应关系1、一一对应是最重要的约束在监督学习中X 和 y 最重要的关系就是它们必须按样本一一对应。图 3 目标变量与样本的一一对应关系也就是说X 的第 1 行对应 y 的第 1 个值X 的第 2 行对应 y 的第 2 个值依此类推。如果 X 与 y 之间的一一对应关系被打乱那么模型学到的就不再是“输入与正确输出之间的关系”而会变成混乱的配对。此时训练结果即使能运行也没有真实意义。图 4 监督学习中 X 与 y 的共同作用因此数据划分、打乱顺序、交叉验证等操作之所以必须同时作用于 X 和 y正是为了保证这种对应关系不被破坏。需要特别说明的是在无监督学习中通常只有 X没有监督意义上的 y。例如聚类任务只需要样本特征矩阵目标是从 X 自身中发现潜在结构。四、Python 示例用鸢尾花数据集查看 X 与 y下面用 Scikit-learn 自带的鸢尾花数据集来直观展示特征矩阵与目标变量。像 load_iris() 这样的数据集加载函数默认返回一个类似字典的 Bunch 对象其中 .data 保存输入矩阵.target 保存监督任务中的目标变量。import pandas as pdfrom sklearn.datasets import load_iris # 1. 加载鸢尾花数据集iris load_iris() X iris.datay iris.target # 2. 查看形状print(X 的形状, X.shape)print(y 的形状, y.shape) # 3. 转为 DataFrame 方便观察df_X pd.DataFrame(X, columnsiris.feature_names)df_y pd.Series(y, name目标标签) print(\nX 的前 5 行)print(df_X.head()) print(\ny 的前 5 个值)print(df_y.head()) print(\n类别名称, iris.target_names)运行这段代码后通常会看到• X.shape 是 (150, 4)表示 150 个样本、4 个特征• y.shape 是 (150,)表示每个样本有一个对应目标• X 的前几行是一组组样本特征• y 的前几个值是这些样本的类别编号这说明在监督学习里X 和 y 的关系可以非常明确地理解为• X 负责描述样本• y 负责提供这些样本对应的目标结果五、Python 示例用散点图直观看到 X 与 y 的关系下面进一步把 X 的前两个特征取出来画成二维散点图并根据 y 的类别对样本进行分组绘制。这样可以直观看到一个样本在特征空间中的位置由 X 决定而它属于哪一类由 y 决定。import matplotlib.pyplot as plt# Windows 常用plt.rcParams[font.sans-serif] [Microsoft YaHei]# macOS 常用# plt.rcParams[font.sans-serif] [PingFang SC]# 解决负号显示问题plt.rcParams[axes.unicode_minus] False from sklearn.datasets import load_iris # 1. 加载鸢尾花数据集iris load_iris()X iris.datay iris.target # 2. 取前两个特征x1 X[:, 0] # 第一个特征花萼长度x2 X[:, 1] # 第二个特征花萼宽度 # 3. 绘图plt.figure(figsize(8, 5))for class_id, class_name in enumerate(iris.target_names): plt.scatter( x1[y class_id], x2[y class_id], labelclass_name # 为图例设置当前类别的名称 ) plt.xlabel(iris.feature_names[0])plt.ylabel(iris.feature_names[1])plt.title(特征矩阵 X 与目标变量 y 的关系示意图)plt.legend() # 显示图例plt.show()输出示意图在这张图中三个类别的样本会以不同颜色分组显示• 每个点对应 X 中的一行样本• 横轴与纵轴分别对应 X 中的两个特征列• 点所属的类别由 y 决定这说明X 和 y 虽然在代码中是两个独立对象但它们共同描述的是同一批样本X 负责“样本具有什么特征”y 负责“样本对应什么目标”。六、监督学习流程为何始终围绕 X 与 y 展开1、训练阶段在 Scikit-learn 中几乎所有监督学习估计器都围绕 fit(X, y) 进行训练。这意味着训练阶段的本质就是给模型输入一批样本特征 X再告诉它这些样本的目标 y让它学习两者之间的关系。2、划分阶段像 train_test_split(X, y, ...) 这样的函数之所以同时拆分 X 和 y就是为了保持样本与目标之间的一一对应关系。3、评估阶段在评估时常见做法是• 用模型对 X_test 做预测• 再把预测结果与 y_test 进行比较这再次说明监督学习的整个流程始终围绕“输入矩阵 X”与“目标变量 y”展开。七、常见误解与澄清1、误以为 X 一定是 Pandas DataFrame不是。在 Scikit-learn 中X 可以是 NumPy 数组、Pandas DataFrame、稀疏矩阵等多种 array-like 结构只要满足接口要求即可。2、误以为 y 只能是分类标签不是。在分类任务中y 常常是类别标签在回归任务中y 可以是连续数值。更一般地说y 表示监督学习中的目标变量。3、误以为 X 的列数越多越好不是。特征数更多并不自动意味着信息更多。冗余特征、噪声特征甚至可能增加计算开销、降低模型效果因此才会有特征选择feature selection与降维dimensionality reduction等后续步骤。4、误以为 y 在无监督学习中也总是存在不是。许多无监督学习方法只需要 X不需要监督目标 y。这也是监督学习与无监督学习最基础的接口差异之一。 小结特征矩阵 X 是监督学习中的输入结构目标变量 y 是与样本一一对应的输出结果。理解这两个对象实质上就是理解机器学习如何以统一的数据接口组织训练、划分与评估流程。“点赞有美意赞赏是鼓励”