朴素贝叶斯模型
贝叶斯定理:
常见类型
算法流程
优缺点
集成学习算法
基本原理
常见方法
KNN(聚类模型)
算法性质:
核心原理:
算法流程
优缺点
matlab中的运用
朴素贝叶斯模型
朴素贝叶斯模型是基于贝叶斯定理与特征条件独立假设的分类方法,在众多领域有广泛应用。
贝叶斯定理:
贝叶斯定理解决的核心问题是,当出现新的信息或证据时,如何修正对某个事件发生概率的原有认知。它提供了一种基于先验知识和新证据来更新概率的方法,体现了概率推理的动态过程。
特征条件独立假设:假设给定类别下各个特征之间相互独立。
常见类型
高斯朴素贝叶斯:适用于特征变量为连续型数据,且这些数据服从高斯分布(正态分布)的情况。例如,在根据身高、体重等连续特征判断人的性别时,可假设这些特征在男性和女性群体中分别服从不同参数的高斯分布。
多项式朴素贝叶斯:常用于文本分类等场景,特征变量通常是离散的计数数据。比如在判断一篇文档是否属于某一主题时,以单词在文档中出现的次数作为特征,这些特征符合多项式分布。
伯努利朴素贝叶斯:适用于特征为二值变量的情况,即特征只有两种取值,如真 / 假、是 / 否等。例如在判断邮件是否为垃圾邮件时,可将邮件中某特定关键词的出现(是 / 否)作为二值特征。
算法流程
数据准备:收集数据并进行预处理,包括数据清洗、特征提取等。例如在文本分类中,需要对文本进行分词、去除停用词等操作。
计算先验概率:统计每个类别在训练数据集中出现的频率P(C),作为先验概率。比如在垃圾邮件分类中,统计垃圾邮件和正常邮件在训练集中所占的比例。
计算似然概率:根据特征条件独立假设,计算每个特征在不同类别下的条件概率
。例如在判断一封邮件是否为垃圾邮件时,计算某个关键词在垃圾邮件和正常邮件中出现的概率。
预测:对于新的样本,根据贝叶斯定理计算每个类别下的后验概率
,选择后验概率最大的类别作为预测结果。
即,由于
对所有类别相同,所以只需比较分子部分。
优缺点
优点
算法简单高效:基于简单的概率计算,训练和预测速度快,对大规模数据集有较好的适应性。
所需数据量少:在数据较少的情况下仍能表现出较好的性能,且对数据的缺失值不太敏感。
可解释性强:通过计算概率来进行分类决策,结果相对容易理解,可解释每个类别预测的依据。
缺点
特征独立性假设强:实际应用中,特征之间往往存在一定相关性,这可能导致模型性能下降。例如在文本中,某些词汇可能存在语义关联,并不完全独立。
对输入数据的表达形式敏感:不同的特征表示方式可能会对模型效果产生较大影响,如文本分类中不同的分词方法。
集成学习算法
一种机器学习范式,它通过组合多个基学习器(Base Learner)来创建一个更强大、更稳健的模型,以提高模型的泛化能力和预测性能。以下从其原理、常见方法、应用场景、优缺点展开介绍:
基本原理
集成学习的核心思想基于 “三个臭皮匠,赛过诸葛亮” 的理念。不同的基学习器可能在处理数据的不同方面或特征上具有优势,通过将它们结合起来,可以互相补充,减少单一模型的偏差和方差,从而提升整体性能。例如,在预测房价的任务中,一个基学习器可能擅长捕捉房屋面积与价格的关系,另一个可能对房屋所在区域的影响把握更准,集成学习能综合二者优势,做出更准确的预测。
常见方法
Bagging(自举汇聚法)
原理:从原始训练数据集中有放回地随机采样,生成多个与原始数据集大小相同的子数据集,每个子数据集用于训练一个基学习器。由于采样的随机性,不同基学习器基于不同的数据子集进行训练,从而引入了多样性。例如,对于一个包含 1000 个样本的原始数据集,每次有放回地抽取 1000 个样本组成子数据集,多次抽取得到多个不同的子数据集。
代表算法:随机森林(Random Forest)是基于 Bagging 的典型算法,它以决策树为基学习器。在构建每棵决策树时,不仅对样本进行有放回采样,还在节点分裂时随机选择特征子集,进一步增加了决策树之间的差异。最终通过投票(分类任务)或平均(回归任务)的方式综合各决策树的结果。
Boosting(提升法)
原理:基学习器按顺序依次训练,每个新的基学习器会重点关注前一个基学习器预测错误的样本,通过不断调整样本权重,使得后续学习器能够更聚焦于难以分类或预测的样本。例如,在初始阶段,所有样本权重相同,当第一个基学习器训练完成后,将预测错误的样本权重增大,这样下一个基学习器在训练时就会更关注这些样本。
代表算法:Adaboost(自适应提升算法)是最早的 Boosting 算法之一,它通过迭代训练多个弱分类器,并为每个弱分类器赋予不同的权重,最终将这些弱分类器线性组合成一个强分类器。另一个重要的算法是梯度提升树(Gradient Boosting Tree,GBT),它以决策树为基学习器,通过不断拟合残差(即真实值与当前模型预测值的差值)来提升模型性能。
KNN(聚类模型)
算法性质:
K - Means 属于无监督学习算法,旨在将数据集中的样本划分为 K 个不同的簇,使同一簇内样本相似度高,不同簇间样本相似度低。
核心原理:
随机选择 K 个点作为初始聚类中心,然后将每个样本分配到与其距离最近的聚类中心所在的簇。分配完成后,重新计算每个簇的中心(通常是簇内所有样本的均值)。不断重复样本分配和中心更新步骤,直到聚类中心不再变化或达到预设的迭代次数,此时认为聚类收敛。
算法流程
初始化:随机选择 K 个样本点作为初始聚类中心。
分配样本:计算每个样本到 K 个聚类中心的距离,将样本分配到距离最近的聚类中心所在的簇。
更新聚类中心:计算每个簇内样本的均值,以此更新聚类中心位置。
判断收敛:检查聚类中心是否变化,若变化则返回步骤 2 继续迭代;若不变或达到最大迭代次数,则结束算法。
优缺点
优点:原理简单,计算效率高,能快速处理大规模数据集;对处理数值型数据效果较好。
缺点:需事先指定聚类数 K,K 值选择往往依赖经验且可能影响结果;对初始聚类中心敏感,不同初始值可能导致不同聚类结果;对非凸形状的数据分布或存在噪声的数据聚类效果不佳。
matlab中的运用
1,导入数据*注意这里的变量名训练的和预测的名字要一致
2,matlab工具箱->分类学习器(或者classificationLearner)
(如果是回归学习器,就是reegressionLearner)
3,导入数据
有如下的训练方法
4,并行训练即可
5,导出模型就可以进行预测了
6,预测
第五步也可以采用导出代码来预测
在模型导出的时候选择
然后注释函数行,然后赋值trainingData就可以了
trainingData=x %%%%%%%x为对应的数据
inputTable = trainingData;
predictorNames = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};
predictors = inputTable(:, predictorNames);
response = inputTable.VarName5;
isCategoricalPredictor = [false, false, false, false];
classNames = categorical({'变色鸢尾'; '山鸢尾'; '维吉尼亚鸢尾'});
% 训练分类器
% 以下代码指定所有分类器选项并训练分类器。
template = templateLinear(...
'Learner', 'Logistic', ...
'Lambda', 'auto', ...
'BetaTolerance', 0.0001);
classificationLinear = fitcecoc(...
predictors, ...
response, ...
'Learners', template, ...
'ClassNames', classNames);
% 使用预测函数创建结果结构体
predictorExtractionFcn = @(t) t(:, predictorNames);
classificationLinearPredictFcn = @(x) predict(classificationLinear, x);
trainedClassifier.predictFcn = @(x) classificationLinearPredictFcn(predictorExtractionFcn(x));
% 向结果结构体中添加字段
trainedClassifier.RequiredVariables = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};
trainedClassifier.ClassificationLinear = classificationLinear;
trainedClassifier.About = '此结构体是从分类学习器 R2023a 导出的训练模型。';
trainedClassifier.HowToPredict = sprintf('要对新表 T 进行预测,请使用: \n [yfit,scores] = c.predictFcn(T) \n将 ''c'' 替换为作为此结构体的变量的名称,例如 ''trainedModel''。\n \n表 T 必须包含由以下内容返回的变量: \n c.RequiredVariables \n变量格式(例如矩阵/向量、数据类型)必须与原始训练数据匹配。\n忽略其他变量。\n \n有关详细信息,请参阅 <a href="matlab:helpview(fullfile(docroot, ''stats'', ''stats.map''), ''appclassification_exportmodeltoworkspace'')">How to predict using an exported model</a>。');
% 提取预测变量和响应
% 以下代码将数据处理为合适的形状以训练模型。
%
inputTable = trainingData;
predictorNames = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};
predictors = inputTable(:, predictorNames);
response = inputTable.VarName5;
isCategoricalPredictor = [false, false, false, false];
classNames = categorical({'变色鸢尾'; '山鸢尾'; '维吉尼亚鸢尾'});
% 执行交叉验证
KFolds = 5;
cvp = cvpartition(response, 'KFold', KFolds);
% 将预测初始化为适当的大小
validationPredictions = response;
numObservations = size(predictors, 1);
numClasses = 3;
validationScores = NaN(numObservations, numClasses);
for fold = 1:KFolds
trainingPredictors = predictors(cvp.training(fold), :);
trainingResponse = response(cvp.training(fold), :);
foldIsCategoricalPredictor = isCategoricalPredictor;
% 训练分类器
% 以下代码指定所有分类器选项并训练分类器。
template = templateLinear(...
'Learner', 'Logistic', ...
'Lambda', 'auto', ...
'BetaTolerance', 0.0001);
classificationLinear = fitcecoc(...
trainingPredictors, ...
trainingResponse, ...
'Learners', template, ...
'ClassNames', classNames);
% 使用预测函数创建结果结构体
classificationLinearPredictFcn = @(x) predict(classificationLinear, x);
validationPredictFcn = @(x) classificationLinearPredictFcn(x);
% 向结果结构体中添加字段
% 计算验证预测
validationPredictors = predictors(cvp.test(fold), :);
[foldPredictions, foldScores] = validationPredictFcn(validationPredictors);
% 按原始顺序存储预测
validationPredictions(cvp.test(fold), :) = foldPredictions;
validationScores(cvp.test(fold), :) = foldScores;
end
% 计算验证准确度
correctPredictions = (validationPredictions == response);
isMissing = ismissing(response);
correctPredictions = correctPredictions(~isMissing);
validationAccuracy = sum(correctPredictions)/length(correctPredictions);
决策树的可视化:
figure(1)
view ( trainingModel.ClassificationTree,’Mode’,’graph’)