【机器学习】训练数据集和测试数据集的划分及KNN准确率测试

一、摘要

本博文围绕机器学习算法性能评估方法展开,重点介绍了训练数据集与测试数据集的分离(train test split)的重要性。内容详细说明了为何不能直接将全部原始数据作为训练集投入生产环境,而是需要通过分割部分数据作为测试集来评估模型性能。讲解了如何进行数据乱序和比例分配,并介绍了使用sklearn库进行train test split的示例。此外,还提到了在进行模型选择时,通过测试数据集的反馈来改进算法的重要性。最后,通过一个简单的knn分类器实例展示了如何应用train test split方法评估机器学习算法的性能。

二、机器学习算法性能评估

  1. 机器学习算法性能评估的重要性,通过train test split方法进行评估。
  2. train test split将原始数据分为训练数据集测试数据集,通常训练数据集占80%或70%。
  3. 使用测试数据集评估模型性能,通过比较模型预测与真实标签的匹配程度。
  4. 如果模型在测试数据集中表现不佳,则需要改进算法以获得更好的模型。

三、train test split的具体实现

  1. 对原始数据进行shuffle操作(本质上就是打乱),以确保训练数据集和测试数据集的代表性。
  2. 根据设定的比例(如70%训练,30%测试)从shuffle后的数据划分训练测试数据集
  3. 确保训练数据集和测试数据集中的样本对应关系不丢失关键于监督学习任务。
  4. train test split可能存在的问题,如数据分布的改变,需在后续章节中详细介绍。
  5. 代码实现:
    1. 在PyCharm中编写新建model_selection.py文件,整个PyCharm中的工程如下:
      在这里插入图片描述

      在model_selection.py文件中添加如下内容:

      import numpy as np
      
      def train_test_split(X, y, test_ratio=0.2, seed=None):
          """
          将输入的特征矩阵 X 和标签向量 y 按照指定的测试集比例 test_ratio 划分为训练集和测试集。
      
          Args:
              X (numpy.ndarray): 特征矩阵,形状为 (n_samples, n_features),表示输入的数据特征。
              y (numpy.ndarray): 标签向量,形状为 (n_samples,),表示每个样本对应的标签。
              test_ratio (float, optional): 测试集占总数据集的比例,取值范围为 [0.0, 1.0]。默认值为 0.2。
              seed (int, optional): 随机数种子,用于确保多次运行该函数时生成的随机结果一致。默认值为 None。
      
          Returns:
              tuple: 包含四个元素的元组,分别为:
                  - X_train (numpy.ndarray): 训练集的特征矩阵。
                  - y_train (numpy.ndarray): 训练集的标签向量。
                  - X_test (numpy.ndarray): 测试集的特征矩阵。
                  - y_test (numpy.ndarray): 测试集的标签向量。
      
          Raises:
              AssertionError: 如果 X 和 y 的样本数量不一致,或者 test_ratio 不在 [0.0, 1.0] 范围内,会抛出此异常。
          """
          # 确保输入的特征矩阵 X 和标签向量 y 的样本数量一致
          assert X.shape[0] == y.shape[0], \
              "特征矩阵 X 的样本数量必须与标签向量 y 的样本数量相等。"
          # 确保测试集比例 test_ratio 在有效范围内
          assert 0.0 <= test_ratio <= 1.0, \
              "测试集比例 test_ratio 必须在 [0.0, 1.0] 范围内。"
      
          # 如果指定了随机数种子 seed,则设置 NumPy 的随机数生成器的种子,以保证结果的可重复性
          if seed:
              np.random.seed(seed)
      
          # 生成一个长度为样本数量的随机排列的索引数组,用于打乱样本顺序
          shuffle_indexes = np.random.permutation(len(X))
      
          # 计算测试集的样本数量
          test_size = int(len(X) * test_ratio)
      
          # 从打乱的索引数组中选取前 test_size 个索引作为测试集的索引
          test_indexes = shuffle_indexes[:test_size]
          # 从打乱的索引数组中选取剩余的索引作为训练集的索引
          train_indexes = shuffle_indexes[test_size:]
      
          # 根据训练集的索引从特征矩阵 X 和标签向量 y 中提取训练集数据
          X_train = X[train_indexes]
          y_train = y[train_indexes]
      
          # 根据测试集的索引从特征矩阵 X 和标签向量 y 中提取测试集数据
          X_test = X[test_indexes]
          y_test = y[test_indexes]
      
          # 返回划分好的训练集和测试集的特征矩阵与标签向量
          return X_train, y_train, X_test, y_test
      
    2. 在jupyter中引入sklearn中的datasets,并初始化特征矩阵和标签向量:

      import numpy as np
      import matplotlib.pyplot as plt
      from sklearn import datasets
      iris = datasets.load_iris() # 鸢尾花数据集
      
      X = iris.data   # 特征矩阵
      y = iris.target # 标签向量
      
      # X是一个150行 x 4 列的矩阵,即150个样本,每个样本有4个特征
      print(X.shape)  # 结果为:(150, 4)
      # y是对于X的特征向量,即标签
      print(y.shape) # 结果为:(150,)
      

      执行结果:
      在这里插入图片描述

    3. 导入PyCharm写好的工程到jupyter中,执行:

      import sys
      # 替换为你的 PyCharm 工程实际路径
      project_path = 'D:/PycharmProjects/pythonProject/'
      if project_path not in sys.path:
          sys.path.append(project_path)
      
      from model_selection import train_test_split
      X_train,y_train,X_test,y_test = train_test_split(X,y,test_ratio=0.2,seed=666)
      
      print(X_train.shape)
      print(y_train.shape)
      print(X_test.shape)
      print(y_test.shape)
      

      执行结果如下:
      在这里插入图片描述

四、调用KNN算法进行准确率测试

  1. 调用工程中的KNN.py中的KNNClassifier类进行测试:
    在这里插入图片描述

五、提升模型性能的策略思考

  1. 模型选择和调参的重要性,根据测试数据集的性能调整模型超参数
  2. 后续将介绍使用不同模型和算法进行模型选择的过程,以及如何通过交叉验证等方法进一步优化模型性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若兰幽竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值