训练数据集和测试数据集的划分
- 一、摘要
- 二、机器学习算法性能评估
- 三、train test split的具体实现
- 四、调用KNN算法进行准确率测试
- 五、提升模型性能的策略思考
一、摘要
本博文围绕机器学习算法性能评估方法展开,重点介绍了训练数据集与测试数据集的分离(train test split)的重要性。内容详细说明了为何不能直接将全部原始数据作为训练集投入生产环境,而是需要通过分割部分数据作为测试集来评估模型性能。讲解了如何进行数据乱序和比例分配,并介绍了使用sklearn库进行train test split的示例。此外,还提到了在进行模型选择时,通过测试数据集的反馈来改进算法的重要性。最后,通过一个简单的knn分类器实例展示了如何应用train test split方法评估机器学习算法的性能。
二、机器学习算法性能评估
- 机器学习算法性能评估的重要性,通过train test split方法进行评估。
- train test split将原始数据分为训练数据集和测试数据集,通常训练数据集占80%或70%。
- 使用测试数据集评估模型性能,通过比较模型预测与真实标签的匹配程度。
- 如果模型在测试数据集中表现不佳,则需要改进算法以获得更好的模型。
三、train test split的具体实现
- 对原始数据进行shuffle操作(
本质上就是打乱
),以确保训练数据集和测试数据集的代表性。 - 根据设定的比例(如70%训练,30%测试)从
shuffle后的数据
中划分训练
和测试数据集
。 - 确保训练数据集和测试数据集中的样本
对应关系不丢失
,关键于监督学习任务。 train test split可能存在的问题
,如数据分布的改变,需在后续章节中详细介绍。- 代码实现:
-
在PyCharm中编写新建model_selection.py文件,整个PyCharm中的工程如下:
在model_selection.py文件中添加如下内容:
import numpy as npdef 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
-
在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,)
执行结果:
-
导入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算法进行准确率测试
- 调用工程中的KNN.py中的KNNClassifier类进行测试:
五、提升模型性能的策略思考
- 模型选择和调参的重要性,根据测试数据集的性能调整
模型
和超参数
。 - 后续将介绍使用不同模型和算法进行模型选择的过程,以及如何通过
交叉验证
等方法进一步优化模型性能
。