目录
(二)主成分分析(principal component analysis)问题(PCA)
(三)因果关系(causality)和概率图模型(probabilistic graphical models)问题
(四)生成对抗性网络(generative adversarial networks)
PyTorch简介
- PyTorch具有先进设计理念的框架,其历史可追溯到2002年就诞生于纽约大学的Torch。Torch使用了一种不是很大众的语言Lua作为接口。Lua简洁高效,但由于其过于小众,以至于很多人听说要掌握Torch必须新学一门语言就望而却步,但Lua其实是一门比Python还简单的语言。
- 考虑到Python在计算科学领域的领先地位,以及其生态完整性和接口易用性,几乎任何框架都不可避免地要提供Python接口。终于,在2017年,Torch的幕后团队推出了PyTorch。 PyTorch不是简单地封装Lua,Torch提供Python接口,而是对Tensor之上的所有模块进行了重构,并新增了最先进的自动求导系统,成为当下最流行的动态图框架。 PyTorch特点是拥有生态完整性和接口易用性,使之成为当下最流行的动态框架之一。
PyTorch的特点
- PyTorch 既可以看作为加入了GPU 支持的numpy。TensorFlow 与Caffe 都是命令式的编程语言,而且是静态的,即首先必须构建一个神经网络,然后一次又一次使用同样的结构;如果想要改变网络的结构,就必须从头开始。 但是PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为。
- PyTorch 的设计思路是线性、直观且易于使用的,当用户执行一行代码时,它会忠实地执行,所以当用户的代码出现Bug 的时候,可以通过这些信息轻松快捷地找到出错的代码,不会让用户在Debug 的时候因为错误的指向或者异步和不透明的引擎浪费太多的时间。
- PyTorch 的代码相对于TensorFlow 而言,更加简洁直观,同时对于TensorFlow高度工业化的底层代码,PyTorch 的源代码就要友好得多,更容易看懂。深入API,理解PyTorch 底层肯定是一件令人高兴的事。
一、模型评估与模型参数选择
(一)参数选择
- 若对于给定的输入x,若某个模型的输出y ̂=f(x)偏离真实目标值y,那么就说明模型存在误差;
- y ̂偏离y的程度可以用关于y ̂和y某个函数L(y,y ̂)来表示,作为误差的度量标准:这样的函数L(y,y ̂)称为损失函数
- 在某种损失函数度量下,训练集上的平均误差被称为训练误差,测试集上的误差称为泛化误差。
- 由于我们训练得到一个模型最终的目的是为了在未知的数据上得到尽可能准确的结果,因此泛化误差是衡量一个模型泛化能力的重要标准。
误差:预测输出y ̂与真实输出y之间的差异; 经验误差、训练误差:在训练集上的误差; 泛化误差:在新样本上的误差。 泛化误差越小越好,经验误差不一定越小越好,可能导致过拟合。

3种数据集之间的关系: 训练集相当于上课学知识 验证集相当于课后的的练习题,用来纠正和强化学到的知识 测试集相当于期末考试,用来最终评估学习效果

(二)验证集
- 当我们的模型训练好之后,我们并不知道他的表现如何。这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不同的数据)上的表现如何。同时通过调整超参数,让模型处于最好的状态。

验证集有2个主要的作用:
- 评估模型效果,为了调整超参数而服务
- 调整超参数,使得模型在验证集上的效果最好
说明:
- 验证集不像训练集和测试集,它是非必需的。如果不需要调整超参数,就可以不使用验证集,直接用测试集来评估效果。
- 验证集评估出来的效果并非模型的最终效果,主要是用来调整超参数的,模型最终效果以测试集的评估结果为准。
(三)测试集
- 当我们调好超参数后,就要开始「最终考试」了。我们通过测试集(Test Dataset)来做最终的评估,来看学习效果(模型效果)好不好。

通过测试集的评估,我们会得到一些最终的评估指标,例如:准确率、精确率、召回率、F1等。
(四)划分数据集

(五)过拟合


为了选择效果最佳的模型,防止过拟合的问题,通常可以采取的方法有
- 移除特征,降低模型的复杂度:减少神经元的个数,减少隐藏层的层数
- 训练集增加更多的数据

- 重新清洗数据
- 数据增强
- 正则化
- 早停
(六)欠拟合


(七)数据集划分代码示例
import os
import random
import shutil
# 原数据集目录(相对目录)
root_dir = 'datasets'
# 划分比例:训练集:验证集:测试集=8:1:1
train_ratio = 0.8valid_ratio = 0.1
test_ratio = 0.1
# 设置随机种子
random.seed(42)
# 拆分后数据集目录
split_dir = 'datasets/traffic'
os.makedirs(os.path.join(split_dir, 'train/images'), exist_ok=True)os.makedirs(os.path.join(split_dir, 'train/labels'), exist_ok=True)os.makedirs(os.path.join(split_dir, 'valid/images'), exist_ok=True)os.makedirs(os.path.join(split_dir, 'valid/labels'), exist_ok=True)os.makedirs(os.path.join(split_dir, 'test/images'), exist_ok=True)os.makedirs(os.path.join(split_dir, 'test/labels'), exist_ok=True)
# 获取图片文件列表
image_files = os.listdir(os.path.join(root_dir, 'images'))label_files = os.listdir(os.path.join(root_dir, 'labels'))
# 随机打乱文件列表
combined_files = list(zip(image_files, label_files))#图片、标签转化为列表
random.shuffle(combined_files)#打乱
image_files_shuffled, label_files_shuffled = zip(*combined_files)#重新获取
# 根据比例计算划分的边界索引
train_bound = int(train_ratio * len(image_files_shuffled))#图片总数*训练集比例
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))
# 将图片和标签文件移动到相应的目录
for i, (image_file, label_file) in enumerate(zip(image_files_shuffled, label_files_shuffled)):
if i < train_bound:
shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file))
shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'train/labels', label_file))
elif i < valid_bound:
shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file))
shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'valid/labels', label_file))
else:
shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file))
shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'test/labels', label_file))


二、验证
- 模型不能过拟合于训练集,否则将不能在测试集上得到最优结果;但是否能直接以测试集上的表现来选择模型参数呢? 答案是否定的。因为这样的模型参数将会是针对某个特定测试集的,得出来的评价标准将会失去其公平性,失去了与其他同类或不同类模型相比较的意义。
- 因此参数的选择(即调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。
- 然而很多时候我们能得到的数据量非常有限。这个时候我们可以不显式地使用验证集,而是重复使用训练集和测试集,这种方法称为交叉验证。
- 常用的交叉验证方法有: 简单交叉验证。 K-重交叉验证。
(一)交叉验证法
- 留出法(Holdout cross validation) 按照固定比例将数据集静态的划分为训练集、验证集、测试集。
- 自组法(bootstrapping)适合于样本数目较少,有放回的取法。
- k 折交叉验证(k-fold cross validation)k 一般取 10 将数据集分为训练集和测试集,将测试集放在一边 将训练集分为 k 份 每次使用 k 份中的 1 份作为验证集,其他全部作为训练集。 通过 k 次训练后,我们得到了 k 个不同的模型。 评估 k 个模型的效果,从中挑选效果最好的超参数 使用最优的超参数,然后将 k 份数据全部作为训练集重新训练模型,得到最终模型。

三、正则化



四、无监督学习
- 在无监督学习中,数据集{x^(i)}_i=1^N中只有模型的输入,而并不提供正确的输出y^(i)作为监督信号
- 数据中不含有“目标”的机器学习问题通常被为无监督学习(unsupervised learning)
(一)聚类(clustering)问题
- 没有标签的情况下,我们是否能给数据分类呢?
- 比如,给定一组照片,我们能把它们分成风景照片、狗、婴儿、猫和山峰的照片吗?
- 同样,给定一组用户的网页浏览记录,我们能否将具有相似行为的用户聚类呢?
“物以类聚,人以群分。” 将相似的对象归入同一个“类”

(二)主成分分析(principal component analysis)问题(PCA)
我们能否找到少量的参数来准确地捕捉数据的线性相关属性?
- 比如,一个球的运动轨迹可以用球的速度、直径和质量来描述。
- 再比如,裁缝们已经开发出了一小部分参数,这些参数相当准确地描述了人体的形状,以适应衣服的需要。

主成分分析PCA是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
(三)因果关系(causality)和概率图模型(probabilistic graphical models)问题
- 我们能否描述观察到的许多数据的根本原因? 例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系?
- 如果想通过物体a去推断物体b,就是将物体a放在这里会增加物体b出现概率的多少,想要找到这样一个确定的促进关系即因果关系 往往会被confounder干扰到,而这个confounder就是物体a与b之间的共因。
- 如果想通过物体a去推断物体b,就是将物体a放在这里会增加物体b出现概率的多少,想要找到这样一个确定的促进关系即因果关系 往往会被confounder干扰到,而这个confounder就是物体a与b之间的共因。

(四)生成对抗性网络(generative adversarial networks)
为我们提供一种合成数据的方法,甚至像图像和音频这样复杂的非结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域。

(五)无监督学习衡量指标

五、监督学习

(一)监督学习—回归
回归问题在生活中非常常见,其最简单的形式是一个连续函数的拟合
- 一个购物网站想要计算出其在某个时期的预期收益,研究人员会将相关因素如广告投放量、网站流量、优惠力度等纳入自变量,根据现有数据拟合函数,得到在未来某一时刻的预测值。
- 回归问题中通常使用均方损失函数来作为度量模型效果的指标,最简单的求解例子是最小二乘法。
均方误差损失函数(Mean Squared Error,MSE)
最常用的回归问题的损失函数。其定义为预测值与真实值之间的平方差的平均值。

该损失函数的值越小,表示模型的预测结果越接近真实值。
- import torch.nn as nn
- MSE_loss_fn = nn.MSELoss()

线性回归可以用于预测什么中的场景?
1.预测房价:
- 假设我们想要预测某个城市的房价。我们可以收集到该城市过去几年的房价数据,以及一些相关的因素,比如房屋的面积、房龄、所处区域、楼层等。我们可以使用这些数据建立一条最佳拟合直线,从而对未来的房价进行预测。
- 在这个例子中,自变量可以包括面积、房龄、所处区域等,因变量是房价。
- 我们可以通过最小二乘法来估计截距和斜率的值,从而得到一条最佳拟合直线。这条直线可以用来预测未来的房价,也可以用来分析不同因素对房价的影响。
2.预测销售额
- 假设我们想要预测某家公司未来一年的销售额。
- 我们可以收集到该公司过去几年的销售额数据,以及一些相关的因素,比如广告投入、促销活动、季节性因素等。我们可以使用这些数据建立一条最佳拟合直线,从而对未来的销售额进行预测。
- 在这个例子中,自变量可以包括广告投入、促销活动、季节性因素等,因变量是销售额。我们可以通过最小二乘法来估计截距和斜率的值,从而得到一条最佳拟合直线。这条直线可以用来预测未来的销售额,也可以用来分析不同因素对销售额的影响。
(二)监督学习—分类

虽然准确率可以判断总的正确率,但是在样本不平衡 的情况下,并不能作为很好的指标来衡量结果。- 举个简单的例子,比如在一个总样本中,正样本占 90%,负样本占 10%,样本是严重不平衡的。
- 对于这种情况,我们只需要将全部样本预测为正样本即可得到 90% 的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。
- 这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。

召回率的应用场景: 比如拿网贷违约率为例,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。 召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。 召回率越高,也代表网络可以改进的空间越大。


本文详细介绍了PyTorch框架的特点,涵盖了模型评估中的参数选择、验证集与测试集划分、过拟合与欠拟合处理、交叉验证技术、正则化方法,以及无监督学习中的聚类、主成分分析、因果关系和GAN,以及监督学习中的回归和分类,强调了准确度评估在样本不平衡情况下的局限性。
1659

被折叠的 条评论
为什么被折叠?



