特别感谢
非常非常感谢软院神仙学长的笔记!本文在此的基础上根据2023-2024学年秋季课程复习重点,并参考教材《数据挖掘 概念与技术(原书第3版)》进行了增改。(如有侵权,联系删除)
希望能为学弟学妹们的期末复习提供帮助!
(制作不易,如果有帮助到你的话请赞赞本文| ᐕ)
指路学长的笔记:
目录
简答题
名词解释
大题
简答题
1. 什么是过度拟合?如何判断是否发生了过度拟合?
过度拟合是指在机器学习模型训练过程中,模型过于关注训练数据的细节和噪声,从而导致对新的、未见过的数据的泛化性能下降。
过度拟合的模型在训练数据上表现得很好,但在测试数据或实际应用中表现较差,因为它过度适应了训练数据中的噪声和特定特征,而忽略了真实数据的整体规律。
防止过拟合
提供正则化约束的参数正则化方法,如 L1/L2 正则化
通过工程上的技巧来实现更低泛化误差的方法,如提前终止(Early stopping)和Dropout
不直接提供约束的隐式正则化方法,如数据增强、控制模型复杂性、降低特征数量等
预剪枝(Pre-Pruning):
预剪枝是在构建决策树的过程中,在树的生长过程中进行的剪枝。在每个节点上,在决策树扩展到下一层之前,算法会评估是否继续分裂该节点。如果某个分裂操作不会显著提高模型的性能,或者超过了预定的停止准则(如最大深度、叶子节点最小样本数等),则停止分裂,将该节点设为叶子节点,不再继续生长。预剪枝是一种贪心策略,通过提前停止树的生长,可以减少模型的复杂性,从而降低过拟合的风险。
后剪枝(Post-Pruning):
后剪枝是在决策树构建完成后,通过剪掉一些分支或子树来降低模型复杂性的方法。通常,在构建完整的决策树后,算法会自底向上地遍历树的节点,评估是否剪掉某个子树。剪枝的决策通常基于验证集(validation set)的性能,如果剪掉某个子树后模型在验证集上的性能不下降或提升,就执行剪枝操作。后剪枝相对于预剪枝更灵活,可以在建立完整树后根据实际需求进行优化,但它需要更多的计算代价。
选择预剪枝还是后剪枝通常取决于具体情况。预剪枝计算开销小,可以减少树的规模,但可能会错过一些有用的分裂。后剪枝通常更耗时,但可以更灵活地调整树的结构。
欠拟合
模型不能在训练集上获得足够低的误差
模型复杂度低,在训练集上就表现很差,没法学习到数据背后的规律
2. 什么是核函数?对于软间隔支持向量机来说,满足哪些条件的数据点是支持向量?
在支持向量机(SVM)中,核函数是一种将输入数据映射到高维特征空间的函数。通过使用核函数,可以在原始输入空间中非线性可分的问题转化为高维特征空间中线性可分的问题。核函数的作用是计算输入数据在高维空间中的内积,而无需显式计算高维空间中的特征。
支持向量是在间隔边界上的样本点,或者是在间隔边界以及对分类结果的误差允许范围内的样本点。软间隔允许一些样本点落在错误的一侧,以提高模型的泛化性。
3. 决策树剪枝的目的是什么?有哪些剪枝方法?
决策树剪枝的目的是通过去除一些树节点或子树,降低模型的复杂度,提高对未见数据的泛化能力。当决策树过度拟合训练数据时,即模型在训练数据上表现良好但在测试数据上表现较差,剪枝可以有效地防止过度拟合,使模型更具有泛化性。
剪枝方法主要分为两大类:预剪枝(Pre-pruning)和后剪枝(Post-pruning)。
4. 集成学习在什么情况下有效?有哪些集成学习方法?
数据不确定性: 当数据存在噪声或不确定性时,单个模型可能会因为过度拟合噪声而表现不佳。通过结合多个模型的预测,可以减少噪声的影响,提高鲁棒性。
模型的稳定性差: 如果单个模型在不同数据集上表现差异较大,集成学习可以通过多个模型的平均化来减少模型的方差,提高整体性能。
复杂任务: 对于复杂的任务,单个模型可能无法捕捉到所有的模式和关系。通过使用不同的模型或算法,集成学习可以更全面地学习任务的特征。
大规模数据集: 在大规模数据集上,通过并行训练多个模型并结合它们的输出,可以有效提高模型的学习效率。
常见的集成学习方法包括:
Bagging: 通过随机采样训练数据的子集,训练多个独立的模型,最后通过投票或平均来做出最终的预测。随机森林就是一种基于Bagging的集成学习方法。
Boosting: 通过迭代训练一系列弱学习器,每一轮关注前一轮模型分类错误的样本,通过调整样本权重来提高这些样本的重要性。
Bagging可以把不稳定的学习算法的性能显著提高,即训练样本的一点点改变都会导致分类器的剧烈变化。决策树和规则推导都是不稳定的学习算法。k近邻和朴素贝叶斯是稳定学习算法的代表。对于稳定的分类器,Bagging有时会降低准确率。
Boosting在大多数情况下都比Bagging的效果更好。而且当基本分类器都是不稳定的时候,Boosting对性能的提高更大。
5. 数据存在缺失值的原因有哪些?有哪些处理缺失值的方法?
数据收集过程中的错误: 在数据采集和录入的过程中,可能发生了错误,导致某些数据缺失。
实验条件或设备故障: 在实验条件下,某些数据可能由于设备故障或其他意外原因而未被成功记录。
用户选择不提供某些信息: 在调查、问卷调查或用户填写的过程中,有些人可能选择不提供某些信息。
数据传输问题: 在数据传输过程中,可能发生了错误或丢失,导致某些数据丢失。
自然灾害或其他不可抗因素: 自然灾害、意外事件或其他不可抗因素可能导致数据丢失。
插补: 用某个统计量(如平均值、中位数、众数)替代缺失值
使用模型预测缺失值: 可以使用机器学习模型来预测缺失值。例如,可以训练一个回归模型来预测缺失值,或使用 K 近邻算法等。
删除缺失值: 最简单的方法是直接删除包含缺失值的样本或特征。这种方法适用于缺失值数量较少的情况,但可能会导致信息损失。
保留缺失值作为一个类别: 如果缺失值的原因可能是有意义的,可以将缺失值保留为一个独立的类别。
数据空洞
(1)数据在某些区域的不足
(2)某种属性-值的组合在实际情况中是不可能或者极少出现的
方法:CLTree
6. 层次聚类往往需要计算两个簇之间的距离。有哪些计算簇间距离的方法
单连结方法:两个聚类中距离最近的两个数据点之间的距离
全连结方法:两个聚类中所有数据点之间两两距离的最大值
平均连结方法:两个簇中所有样本点对之间的平均距离
聚类中心方法:两个聚类中心之间的距离
Ward方法:合并之后聚类的误差平方和相对于两个聚类的误差平方和之和的增量
7. 为什么会有对最小值支持度的关联规则挖掘
(1)如果将最小支持度设置得太大,那我们显然得不到含有稀有项目的关联规则
(2)如果我们想要得到包含稀有项目的关联规则,我们就不得不把最小支持度设置得很小。这样会引发组合爆炸,符合要求的频繁项目集和关联规则数目将以指数级的速度增长,以至于整个挖掘过程无法进行
8. 有监督、无监督学习
9. 聚类的一般表示方法
(1)用聚类中心来表示每个聚类
(2)利用分类模型来表示聚类
(3)利用聚类中最为常见的值来表示聚类
10. K均值聚类的优缺点
11. 距离函数有哪些
12. 对称与非对称布尔属性的距离函数
简单匹配距离和Jaccard距离 P111
13. 区间度量标准化
范围标准化和z-score标准化 P113
名词解释
1. 关联规则的支持度
关联规则中的支持度是一个度量规则在整个数据集中出现的频率的指标。支持度的作用是帮助识别频繁项集,即在数据集中经常同时出现的项集。通过设置一个支持度阈值,可以过滤掉支持度低于阈值的规则,从而筛选出具有一定频繁性的规则。
给定关联规则 "X → Y",其中 X 和 Y 是项集,支持度(support)定义为包含项集 X 和 Y 的事务的百分比。具体而言,支持度的计算公式为:
Support(X∪Y)=总事务数包含项集 X∪Y 的事务数 / 总事务数
2. 关联规则的置信度
置信度衡量了当事务包含 X 时,也包含 Y 的概率。高置信度意味着当事务包含 X 时,也很可能包含 Y,因此规则更可靠。
具体而言,给定关联规则 "X → Y",其置信度(confidence)定义为:
Confidence(X→Y) = 支持度(X∪Y) / 支持度(X)
3. 序列模式、关联规则
序列模式是指在时间或空间上存在一定顺序关系的数据集合中发现重复出现的模式或规律。这种模式通常是通过分析数据序列中的趋势、顺序和关联来识别的。
关联规则是数据挖掘中一种用于发现数据集中项之间关联关系的方法。这种方法主要用于发现数据集中的频繁项集,并基于这些频繁项集构建关联规则。关联规则通常用于描述项集之间的关联性,这有助于理解数据中的潜在模式和规律。
关联规则(Association Rule):数据中所蕴含的一类重要规则
序列模式:给定一个由不同序列组成的集合,其中每个序列由不同的元素按顺序有序排列,每个元素由不同项目组成
项集(itemset)是指数据集中的一个或多个项(items)的集合。一个项集被认为是频繁的,如果其支持度不低于事先定义的阈值
4. 离群点
离群点是指与数据集中的大多数观测值相比具有显著不同特征的数据点。这些数据点可能是异常的、异常值、或者与数据集中的模式和规律不符的观测结果。离群点分析在数据挖掘中是一个重要的任务,因为它可以揭示潜在的异常模式或有趣的数据点,也有助于提高数据挖掘模型的性能。
5. 查准率(Precision)
查准率 = 被正确分类的正例数量 / 被分类为正例的数据数量
6. 召回率
即查全率(Recall)
查全率 = 被正确分类的正例数量 / 实际的正例数量
F-score(F值或F-measure)是一个结合了精确度(Precision)和召回率(Recall)的综合性能度量。它是一个常用的二分类问题的评估指标,用于平衡模型的精确性和完整性。
7. 回归
回归分析(Regression Analysis) 是研究自变量与因变量之间数量变化关系的一种分析方法,它主要是通过因变量Y与影响它的自变量Xi ( i = 1 , 2 , 3 … )之间的回归模型,衡量自变量Xi 对因变量Y的影响能力的,进而可以用来预测因变量Y的发展趋势。
损失函数(Cost Function/Lost Function) 用于估计模型的预测值和真实值之间的不一致程度,损失函数越小代表模型预测结果与真实值越相近。
8. 梯度下降
梯度下降是一种优化算法,用于最小化(或最大化)一个损失函数。在机器学习和深度学习中,梯度下降被广泛用于调整模型的参数,使其能够更好地拟合训练数据并提高性能。
具体来说,梯度下降的目标是通过迭代调整模型参数,使损失函数的值逐渐减小。损失函数是衡量模型预测与实际值之间差距的函数。梯度下降的过程可以简要描述如下:
1.初始化参数: 随机或根据某种规则初始化模型的参数,这可以是权重和偏差等。
2.计算梯度: 计算损失函数对于模型参数的梯度。梯度是一个向量,指示了损失函数在当前参数值处增长最快的方向。
3.更新参数: 根据梯度的反方向,调整模型的参数。这个调整的大小由学习率(learning rate)决定,学习率越大,参数更新的步长越大。
4.重复: 重复步骤2和步骤3,直到满足停止条件,如达到最大迭代次数或损失函数的变化足够小。
梯度下降有不同的变种,主要分为批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-Batch Gradient Descent)。
- 批量梯度下降(Batch GD): 在每一次迭代中,使用整个训练数据来计算梯度和更新参数。这种方法的计算效率较低,特别是在大规模数据集上。
- 随机梯度下降(Stochastic GD): 在每一次迭代中,随机选择一个样本来计算梯度和更新参数。这样做可以加速学习过程,但由于随机性,收敛过程可能会更不稳定。
- 小批量梯度下降(Mini-Batch GD): 是批量梯度下降和随机梯度下降的折中方法,每次迭代使用一小部分(一个批次)的数据来计算梯度和更新参数。这在实践中通常是最常用的方法,能够兼顾计算效率和收敛稳定性。
梯度下降是许多机器学习算法中的核心优化方法,包括线性回归、逻辑回归、神经网络等。
9. 先验概率
先验概率(prior probability):指根据以往经验和分析。在实验或采样前就可以得到的概率。
10. 后验概率
后验概率(posterior probability):指某件事已经发生,想要计算这件事发生的原因是由某个因素引起的概率。
11. 平滑
为了解决不经常出现的单词的零概率估计,需要对概率进行光滑处理来避免出现0或1的概率。
12. 神经元
在神经网络中,神经元是神经网络的基本构建单元,也被称为节点、单元或感知器。神经元模拟了生物神经系统中的神经元的功能,它是神经网络中信息处理和传递的基本单元。
一个典型的神经元包含以下几个组成部分:
1.权重(Weights): 每个输入与神经元都有一个关联的权重,用来表示该输入对神经元的影响程度。权重决定了输入信号的重要性,可以增强或减弱输入信号的影响。
2.激活函数(Activation Function): 激活函数定义了神经元的输出如何根据输入加权和进行变换。常用的激活函数包括 sigmoid、ReLU(Rectified Linear Unit)、tanh 等。激活函数引入了非线性性质,使得神经网络能够学习复杂的非线性关系。
3.输入(Inputs): 输入是连接到神经元的信息源,每个输入都与一个权重相关联。输入可以是来自其他神经元的输出,也可以是来自外部环境的输入。
4.偏置(Bias): 偏置是神经元的一个可学习参数,用于调整输入的总和。它允许神经元在没有输入时仍然能够发出信号。
神经元的工作过程可以概括为以下步骤:
1.接收输入信号: 每个输入都乘以相应的权重,然后这些加权的输入被相加。
2.添加偏置: 对输入信号的总和添加一个偏置。
3.通过激活函数进行非线性变换: 对加权和加偏置的结果应用激活函数,产生神经元的输出。
4.输出信号: 输出信号传递到下一层神经元或作为最终网络输出。
神经元以这种方式组合和处理信息,构成了神经网络的基础。多个神经元通过连接形成网络,层与层之间的连接形成了神经网络的结构。神经网络通过学习调整权重和偏置,以适应输入与输出之间的复杂映射关系。
13.Bagging与Boosting
Bagging可以把不稳定的学习算法的性能显著提高,即训练样本的一点点改变都会导致分类器的剧烈变化。决策树和规则推导都是不稳定的学习算法。k近邻和朴素贝叶斯是稳定学习算法的代表。对于稳定的分类器,Bagging有时会降低准确率。
Boosting在大多数情况下都比Bagging的效果更好。而且当基本分类器都是不稳定的时候,Boosting对性能的提高更大。
14.半监督学习
在少量样本标签的引导下,能够充分利用大量无标签样本提高学习性能,避免了数据资源的浪费,同时解决了有标签样本较少时监督学习方法泛化能力不强和缺少样本标签引导时无监督学习方法不准确的问题。
15. 对偶问题
大题
假设需要对搜索引擎排序结果的Top n 进行聚类,并且自动为每个簇产生标签,这样使得搜索引擎的排序结果由线性列表变成带标签的两层或多层树的形式,用户从中可以更方便地找到自己感兴趣的搜索结果。请详细介绍你的技术路线,包括: (1)举例说明如何表示被聚类的数据对象; (2)给出数据对象之间距离(或相似度)的计算公式,介绍其中每个数学符号的含义; (3)所设计的聚类算法的伪代码; (4)提取簇标签的算法的伪代码,包括度量候选标签(词或者短语)重要性大小的计算 公式。
1. 数据表示:
假设搜索结果为文档集合,可以使用文档的特征向量表示每个数据对象。一种简单的方法是使用词袋模型,将文档表示为一个向量,其中每个维度对应一个词,并表示该词在文档中的出现频率。
2. 距离计算:
使用余弦相似度作为数据对象之间的距离度量。余弦相似度计算公式如下:
Similarity(A,B)=
其中,A 和 B 分别是两个文档的特征向量,⋅表示向量的点积,∥∥表示向量的范数。
3. 聚类算法:
使用层次聚类算法(Hierarchical Clustering)进行搜索结果的聚类。以下是层次聚类的伪代码:
def hierarchical_clustering(data, distance_metric):
clusters = initialize_clusters(data)
while len(clusters) > 1:
closest_clusters = find_closest_clusters(clusters, distance_metric)
merge_clusters(clusters, closest_clusters)
return clusters
在上述代码中,initialize_clusters 初始化每个数据对象为一个簇,find_closest_clusters 找到最接近的两个簇,merge_clusters 合并这两个簇。
层次聚类:P108
4. 簇标签提取算法:
为每个簇提取标签,可以计算簇中文档的关键词,然后根据关键词确定簇的标签。以下是简化的伪代码:
def extract_cluster_labels(cluster, documents):
# Combine all documents in the cluster
combined_text = combine_documents_text(cluster, documents)
# Extract keywords from the combined text
keywords = extract_keywords(combined_text)
# Rank keywords based on importance
ranked_keywords = rank_keywords(keywords, documents)
# Select top keywords as cluster labels
cluster_labels = select_top_keywords(ranked_keywords, k)
return cluster_labels
在上述代码中,combine_documents_text 将簇中文档的文本合并,extract_keywords 提取关键词,rank_keywords 根据关键词在所有文档中的重要性进行排序,select_top_keywords 选择排名前 k 的关键词作为簇的标签。
文本分类的多项式朴素贝叶斯方法假定每个类别的文本按照多项式分布生成。请给出该方法训练和测试过程的伪代码。
训练过程
# 计算每个类别的文档数量
class_doc_count = defaultdict(int)
# 计算每个特征在每个类别中的出现次数
feature_count_per_class = defaultdict(lambda: defaultdict(int))
# 计算每个类别中所有特征的总数
total_feature_count_per_class = defaultdict(int)
# 遍历训练文本集
for document, class_label in training_set:
# 对文本进行分词或其他预处理操作,得到特征集 feature_set
feature_set = preprocess(document)
# 增加类别文档计数
class_doc_count[class_label] += 1
# 增加每个特征在该类别中的出现次数
for feature in feature_set:
feature_count_per_class[class_label][feature] += 1
total_feature_count_per_class[class_label] += 1
测试过程
# 初始化类别概率
class_probabilities = defaultdict(float)
# 遍历每个类别
for class_label in all_classes:
# 初始化类别的概率为先验概率
class_probability = prior_probability(class_label, class_doc_count, total_doc_count)
# 计算类别的似然概率
likelihood = 1.0
# 对文本进行分词或其他预处理操作,得到特征集 feature_set
feature_set = preprocess(d)
# 计算多项式分布的似然概率
for feature in feature_set:
likelihood *= (feature_count_per_class[class_label][feature] + 1) / (total_feature_count_per_class[class_label] + len(all_features))
# 更新最终的概率
class_probabilities[class_label] = class_probability * likelihood
# 选择具有最大概率的类别作为最终预测结果
predicted_class = argmax(class_probabilities)
祝学弟学妹们考试顺利!
(制作不易,如果有帮助到你的话请赞赞本文| ᐕ)