应用理论知识处理实际数据集是机器学习的基础。准备用于算法的数据集涉及理解其如何加载和组织。这个动手练习涵盖了机器学习工作流中一个常见的初始步骤:将原始数据转换为NumPy矩阵。一个简单数据集假设我们有一个用于预测房价的小数据集。数据包含房屋面积、卧室数量和最终售价。在典型的Python应用中,这些数据可能最初是列表的列表形式。import numpy as np # 每个内部列表代表一栋房屋:[房屋面积, 卧室数量, 价格] raw_data = [ [1500, 3, 320000], [2100, 4, 450000], [1200, 2, 250000], [1800, 3, 380000] ]尽管这种格式易于阅读,但它并未针对机器学习模型所需的数学运算进行优化。为此,我们需要将其转换为NumPy数组,这是Python中数值数据的标准格式。转换为NumPy矩阵使用np.array()函数,从列表的列表创建NumPy矩阵(或更准确地说,是一个二维ndarray)非常直接。# 将列表的列表转换为二维NumPy数组 house_data_matrix = np.array(raw_data) print(house_data_matrix)这将产生以下输出:[[ 1500 3 320000] [ 2100 4 450000] [ 1200 2 250000] [ 1800 3 380000]]现在我们的数据已整理成结构化网格。每一行是一个观测值(一栋房屋),每一列代表一个特定属性。这就是几乎所有机器学习算法都预期的那种数据矩阵格式。分离特征与目标在监督学习中,我们区分特征(用于做出预测的输入)和目标(我们希望预测的值)。特征矩阵 ($$X$$): 一个矩阵,其中行是观测值,列是特征。在我们的例子中,特征是“房屋面积”和“卧室数量”。目标向量 ($$y$$): 一个向量,包含我们希望为每个观测值预测的值。这里,它是“价格”。我们可以使用NumPy强大的切片功能将house_data_matrix分离为X和y。digraph G { rankdir=TB; node [shape=plaintext, fontname="Helvetica"]; subgraph cluster_0 { label = "原始数据矩阵"; style=filled; color="#e9ecef"; raw_data [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#ced4da">房屋面积</TD><TD BGCOLOR="#ced4da">卧室数量</TD><TD BGCOLOR="#ced4da">价格</TD></TR> <TR><TD>1500</TD><TD>3</TD><TD>320000</TD></TR> <TR><TD>2100</TD><TD>4</TD><TD>450000</TD></TR> <TR><TD>1200</TD><TD>2</TD><TD>250000</TD></TR> <TR><TD>1800</TD><TD>3</TD><TD>380000</TD></TR> </TABLE> >]; } subgraph cluster_1 { label = "特征矩阵 (X)"; style=filled; color="#a5d8ff"; X_matrix [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD>1500</TD><TD>3</TD></TR> <TR><TD>2100</TD><TD>4</TD></TR> <TR><TD>1200</TD><TD>2</TD></TR> <TR><TD>1800</TD><TD>3</TD></TR> </TABLE> >]; } subgraph cluster_2 { label = "目标向量 (y)"; style=filled; color="#b2f2bb"; y_vector [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD>320000</TD></TR> <TR><TD>450000</TD></TR> <TR><TD>250000</TD></TR> <TR><TD>380000</TD></TR> </TABLE> >]; } raw_data -> X_matrix [label="切片列 0-1"]; raw_data -> y_vector [label="切片列 2"];}原始数据矩阵被分为特征矩阵X和目标向量y。以下是如何在代码中执行此划分:# 为特征选择所有行 (:) 和直到索引 2(不包含)的列 X = house_data_matrix[:, :2] # 为目标选择所有行 (:) 和仅最后一个列(索引 2) y = house_data_matrix[:, 2] print("特征矩阵 X:") print(X) print("\n目标向量 y:") print(y)输出确认了划分:Feature Matrix X: [[1500 3] [2100 4] [1200 2] [1800 3]] Target Vector y: [320000 450000 250000 380000]查看维度一种常规做法是检查矩阵和向量的shape。这有助于确认你的数据结构正确,并有助于预防后续步骤中的错误。# 获取特征矩阵和目标向量的维度 print("X 的形状:", X.shape) print("y 的形状:", y.shape)输出将是:Shape of X: (4, 2) Shape of y: (4,)这告诉我们:X 有 4 行(观测值)和 2 列(特征)。y 是一个长度为 4 的向量,对应于 4 个观测值。你现在已成功将原始数据转换为机器学习所需的精确结构。特征矩阵X和目标向量y,分别对应于我们在线性回归中讨论的方程 $$Ax = b$$ 中的矩阵A和向量b。你在前面章节中学到的所有矩阵和向量运算,现在可以直接应用于X和y来训练模型、识别模式或降低维度。