Auto-Encoder的补充知识

本文探讨如何超越基本的Auto-Encoder,通过引入额外的分类器(Discriminator)来优化嵌入表示的适配性和可解释性。一方面,通过Discriminator评估嵌入与原始输入的匹配程度,最小化适配误差LD∗L_D^{*}

1. 对Auto-Encoder提出更多的要求

Pytorch实战_图像降维及聚类 中,我已经简单的介绍了 Auto-Encoder 的原理。对于最简单的 Auto-Encoder,我们的要求就是尽量降低 reconstruction loss,也就是还原出来的图片或文章要和原图片或文章尽可能相近。

但是除此之外,我们能不能对Auto-Encoder提出更多的要求呢?答案是肯定的,我们来看一下:

  1. 不仅仅是减低 reconstruction loss
  2. 得到更具有可接受性的 embedding

1.1 要求一

要求一要求我们不仅仅是减低 reconstruction loss,而且要求我们得到的embedding能代表我们原有的图片或文字(就像是写轮眼代表了宇智波一族一样)。我们怎么使得机器做到这一点呢?

从下面这个PPT可以看出,我们需要另外构建一个分类器 Discriminator 来衡量 embedding 和原有图片的适配程度。具体流程是,我们使用参数设置为 θ \theta θ 的 Encoder 将图片进行压缩,并将压缩得到的 embedding 和 图片一同放入Discriminator 进行分类,由 Discriminator 来判断二者是否适配。对于每个 θ \theta θ 来说,我们都会调节 Discriminator 的参数 ϕ \phi ϕ 来使得 Discriminator 的训练误差尽可能的小,我们定义这个误差为 L D ∗ L_D^{*} LD。最终我们应该调节参数 θ \theta θ 使得 L D ∗ L_D^{*} LD 尽可能小。
在这里插入图片描述

1.2 要求二

要求二要求我们得到的 embedding 更加有解释性。通常我们得到的 embedding 看起来都是一团乱麻,就像下面 PPT 右上角的图片一样。我们想要知道 embedding 每一部分都代表了什么信息。如下图所示,在语音训练中,我们得到的 embedding 可能包含了说话者的信息(如:发音习惯等等)以及话语本身中的信息,我们想要将其分开。
在这里插入图片描述
具体该怎么做呢?一个简单自然的想法是,我们训练两个 Encoder,其中一个专门用来提取话本身的信息,另一个用来提取说话人的信息。这有什么用呢?比如我们可以把另一个说话人的信息和话语本身的信息进行结合,实现变声的效果。
在这里插入图片描述
怎么训练这有的 Encoder 呢?一种方式是反向训练 。同样我们创造一个二分类的 Discriminator,这个 Discriminator 的作用是吃进去表示话语本身信息的那一部分 embedding,并判定这是哪个人说的。如果我们的 Encoder 能做到欺骗过 Discriminator,让他分不清到底是哪个人说的,那说明这部分 embedding 中已经不包含说话人的信息了。
在这里插入图片描述

任务描述 本关任务:编写一个使用 KNN分类器完成邮件分类。 相关知识 为了完成本关任务,你需要掌握:1.最近邻算法(KNN)的基本原理,2.使用sklearn构建KNN分类器。 KNN 算法原理 最近邻算法,又被称为 K最近邻算法。在该算法中,对未知类标的实例,从已知类标的实例中,找到距离最近或最相似的实例,并将其类标作为自己的类标。 KNN 算法属于监督学习,监督学习所需要做的是在给定一部分带有特征和标签两部分数据的情况下,根据这一部分的特征和数据建立一个模型,之后当我们输入新的特征时,这个模型可以返回这种特征所应该贴上的标签。那么该怎么样从原有的数据中建立一个模型呢?kNN算法的思想就是,物以类聚人以群分。即相似的人和物会相聚在一起。 下面,我们就来描述一下kNN算法: 计算待测数据与已有的数据之间的距离; 按照距离的递增关系排序; 选取距离最小的K个点; 取这K个点中的最多的类别作为待测数据的类别。 使用KNN完成分类任务 我们首先来了解一下我们的数据,从而明确任务,并作出针对性的分析。我们这里使用的是邮件数据集,该数据集是一个分类问题,目的是区分收到的邮件是否为垃圾邮件,在数据集中每个邮件都给出了标签: 1 (垃圾邮件)或 0(非垃圾邮件)。除此之外,数据集还包含有各个邮件的内容。 我们的目的是使用KNN算法通过特征进行邮件的判断。 sklearn做为一个强大机器学习工具,为我们提供了KNN分类器模型的函数接口 sklearn.neighbors.KNeighborsClassifier。我们可以直接导入模型构建一个K近邻分类器: Knn= KNeighborsClassifier() 下面我们对其参数进行说明: n_neighbors:即K的取值,默认为5; weights:即每个近邻投票时的权重,uniform 、distance; algorithm:brute 、kd tree、 ball tree、auto; leaf_size:结点中包含几个实例; metric:"minkowski" 或自定义; metric_params:若自定义的距离函数需要参数,用dictionary类型数据传给模型。 不仅如此,我们还可以使用sklearn.model_selection.train_test_split进行训练集和测试集的划分,使用sklearn.metrics.roc_auc_score进行auc指标计算。 下面我们便使用该工具完成上述数据集的训练,来探究sklearn构建朴素贝叶斯分类器,并使用垃圾邮件数据集完成分类。我们的训练过程将包含以下几个方面: 数据处理; 训练测试集的划分; 模型调用及训练; 预测和参数计算。 关键代码如下: Knn= KNeighborsClassifier() Knn.fit(x_train,y_train) Knn.fit(X_train,y_train)#训练一个KNN Knn.predict(X_test)# 用训练好的KNN做预测 Knn.score(X_test,y_test)# 计算预测的准确率 Knn.predict_proba(X_test)#返回各个类的预测概率 Knn.kneighbors(X_ _test,5,True)#返回K个近邻 编程要求 根据提示,在右侧编辑器补充代码,完成使用sklearn构建KNN分类器,包括: 数据处理; 训练测试集的划分; 模型训练; 对测试集中的前十个数据进行预测并打印出结果,格式为:print('前十个预测结果为:', x_pre_test) 。预期输出为[1. 0. 0. 1. 1. 0. 0. 0. 0. 0.]
06-13
### 使用sklearn构建KNN分类器完成邮件分类任务 以下是实现邮件分类任务的完整流程,包括数据预处理、划分训练测试集、模型训练以及对测试集前十个数据进行预测并打印结果。 #### 1. 数据加载与预处理 在邮件分类任务中,假设我们有一个包含邮件文本和标签的数据集。首先需要加载数据,并对特征进行编码和无量纲化处理。如果特征是文本型数据,则需要将其转换为数值型[^3]。此外,为了提高模型性能,可以对数据进行归一化处理[^4]。 ```python from sklearn.preprocessing import LabelEncoder, MinMaxScaler import numpy as np # 假设 data_X 是邮件特征,data_y 是邮件标签 # 对类别型标签进行编码 label_encoder = LabelEncoder() data_y_encoded = label_encoder.fit_transform(data_y) # 对特征进行归一化处理 scaler = MinMaxScaler() data_X_scaled = scaler.fit_transform(data_X) ``` #### 2. 划分训练集与测试集 为了确保训练集和测试集中各类别数据的比例与原始数据集一致,可以使用 `train_test_split` 的 `stratify` 参数[^1]。 ```python from sklearn.model_selection import train_test_split # 划分训练集和测试集,保持类别分布一致性 X_train, X_test, y_train, y_test = train_test_split( data_X_scaled, data_y_encoded, test_size=0.3, random_state=42, stratify=data_y_encoded ) ``` #### 3. 模型训练 使用 `KNeighborsClassifier` 构建 KNN 分类器,并设置相关参数[^1]。 ```python from sklearn.neighbors import KNeighborsClassifier # 定义 KNN 分类器 knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', p=2, metric='minkowski') # 训练模型 knn.fit(X_train, y_train) ``` #### 4. 预测并输出结果 对测试集的前十个数据进行预测,并打印预测结果及其对应的原始标签。 ```python # 对测试集前十个数据进行预测 y_pred = knn.predict(X_test[:10]) # 打印预测结果及真实标签 for i in range(10): print(f"样本 {i+1}: 真实标签={label_encoder.inverse_transform([y_test[i]])[0]}, 预测标签={label_encoder.inverse_transform([y_pred[i]])[0]}") ``` ### 注意事项 - 在实际应用中,可能需要对数据进行更复杂的预处理,例如去除停用词、提取 TF-IDF 特征等。 - 如果数据存在缺失值,可以使用 `Impute` 模块进行填补[^2]。 - 在选择 `n_neighbors` 参数时,可以通过交叉验证来优化模型性能。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值