机器学习中训练数据集和测试数据集的划分及KNN准确率测试
创作时间:
作者:
@小白创作中心
机器学习中训练数据集和测试数据集的划分及KNN准确率测试
引用
CSDN
1.
https://blog.csdn.net/sujiangming/article/details/145504133
训练数据集和测试数据集的划分
一、摘要
本博文围绕机器学习算法性能评估方法展开,重点介绍了训练数据集与测试数据集的分离(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 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
- 在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类进行测试:
五、提升模型性能的策略思考
- 模型选择和调参的重要性,根据测试数据集的性能调整
模型
和
超参数
。 - 后续将介绍使用不同模型和算法进行模型选择的过程,以及如何通过
交叉验证
等方法进一步
优化模型性能
。
热门推荐
猫角膜炎怎么办(猫咪眼角膜溃疡)
报废汽车拆解和再生利用行业深度分析
中国男性平均寿命仅69.9岁?专家:谣言!
脂肪,真的比想象中重要!
国外炼铁生产及技术新进展
川藏线旅游途中有哪些机场,成都出发坐飞机去318川藏线旅游能去哪些地方
老年骨质疏松预防科普小知识
Tomcat中Servlet的工作机制详解
图解肩周炎:急性期、粘连期、缓解期三个时期,该如何做康复锻炼?
猫粮原料的正确兑配比例是什么?如何确保猫粮的营养均衡?
咖啡伤胃吗?一文读懂咖啡与胃部健康的关系
常吃十全大补丸是否会上火?
打方向盘时双手是否需要握紧?握方向盘的正确姿势是什么?
儿童游戏:理论与实践结合的身心发展促进之道
湿蚀刻和干蚀刻有何区别?
五种无损检测方法详解:确保材料质量的关键
黑糖功效与白糖有何不同?三种糖类营养、禁忌及建议食用方法全解析
MySQL脏页flush原理与控制策略详解
故宫文学史:明清宫廷文学的传承与创新
掌握时间波动:借助时间序列交叉验证技术提升预测精准度
散热风扇选型方法:如何综合考量电机功率、转速以及风压
手机电池充放电寿命延长指南
肚子吃撑了怎么办?这些缓解方法请收好
无人机+AI,国产行业无人机开启智能化作业新时代
立遗嘱去公证处需要准备什么
GP数据库如何改表名
牙龈疼怎么办?专业医生教你快速止痛和治疗方案
脑机接口定义及相关概念
银行网上银行的注册和登录指南
插混车油箱里的汽油会过期吗?专业解答来了