机器学习中训练数据集和测试数据集的划分及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类进行测试:
五、提升模型性能的策略思考
- 模型选择和调参的重要性,根据测试数据集的性能调整
模型
和
超参数
。 - 后续将介绍使用不同模型和算法进行模型选择的过程,以及如何通过
交叉验证
等方法进一步
优化模型性能
。
热门推荐
买房步步为营:注意事项全攻略
楼层差价分析与选购建议
买房选楼层要考虑哪些因素?楼层网为您解答
次顶层不好卖了
八段锦动作详解 上(超详细,适合初学者)
上海地铁11号线沿线景点+游玩攻略
危险化学品经营和烟花爆竹生产经营领域专项督导检查进行时
《我们恋爱吧6》CP情感发展揭秘:从不会恋爱到双向奔赴
怀孕期间能吃大闸蟹吗?专家为你详细解答
郭达翻盘史:从养猪工人到春晚钉子户,20年不下台的背后谁在支撑
郭达人物简介:从话剧演员到春晚常客
郭达:税务青年可视答疑暖人心 平凡岗位展现蓬勃力量
郭达:从话剧舞台到春晚小品,一位喜剧大师的传奇人生
面部瑜伽:告别皱纹的自然疗法
睡个美容觉,告别皱纹困扰
老舍谈亲子关系:家庭是礼教的堡垒
家庭和睦是人生最快乐的事
在家轻松做出米其林级别的肉末豆腐
读书 | 作为果实的灵魂:莎士比亚的思想版图
精盐 vs 海盐:谁才是厨房神器?
精盐 vs 海盐:谁更健康?一文读懂它们的区别与选择
乌江重庆风情十里画廊:自然奇观与人文瑰宝交织的旅游胜地
重庆乌江画廊旅游开发:景区介绍、门票价格及位置信息
怎么缓解抑郁症药物副作用
502胶水致儿童严重烧伤,专家提醒:这些危险物品要远离孩子
酒精能去除502胶水吗?答案令人意外
揭秘502胶水的超强粘性:α-氰基丙烯酸乙酯的化学魔法
装修后胶水残留怎么处理?6个家庭小妙招+专业工具推荐
阿坝州黄龙景区的钙化池为何如此神奇,徒步路线和摄影技巧有哪些
北京周边春季徒步线路推荐:山水风光与自然美景之旅