机器学习中训练数据集和测试数据集的划分及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类进行测试:
五、提升模型性能的策略思考
- 模型选择和调参的重要性,根据测试数据集的性能调整
模型
和
超参数
。 - 后续将介绍使用不同模型和算法进行模型选择的过程,以及如何通过
交叉验证
等方法进一步
优化模型性能
。
热门推荐
讲武谈兵|美官宣六代机F-47,为什么选麻烦不断的波音?
消化道出血是什么?症状、治疗与预防全解析
如何查询不同城市的社保公司和个人缴费比例?
弦与弦的交汇:揭秘相交弦定理的奥秘
完全没有项目经验怎么找实习
如何高效管理和执行软件项目实施步骤?
消委会提醒!这种“减肥神药”不能随便用
自行车链条磨损检测与更换指南
00和60开头的股票含义及其背后的市场逻辑
出水痘时的饮食调理指南
城市交通运输噪音污染不容忽视
金属铸造件喷砂用多少目的金刚砂
安徽40岁姐姐养出"金银花棒棒糖",花开上千朵!详解其养护秘诀
Windows 11文件无法删除?多种实用解决方案帮你轻松应对
吸音板是什么材质,它与隔音板区别,吸音板安装施工方法
iOS下载的文件位置查询
土耳其十大美食:从陶罐牛肉到烤茄子,领略异国风味
可能影响女性怀孕!众多防水冲锋衣含有害物质PFAS,很多人都中招
阿贡核能研究推动第四代反应堆安全性和效率创新
“羊斟惭羹”,啥意思?一碗羊汤真的就能亡掉一个国家?
怀孕初期干果的选择原则是什么?
公牛近10战8胜要翻身? 战胜湖人究竟为哪般?
毛泽东主席眼中的墨子:一个比孔子高明的圣人
英烈忠魂永不朽——湘江战役兴国籍“英烈忠魂·荣归故里”仪式侧记
烤箱的功率是多少,如何选择适合家庭的烤箱
装修门窗膜怎么去除?8种实用方法详解
60岁一年养老金多少钱?教你一看就懂的养老金计算方法
电动车锂电池价格表(电动车锂电池价格表和公里数)
交流电的整流:三种常见整流电路原理详解
考研数学避坑指南:数一、数二考试范围及难度深度大解析!