樸素貝葉斯模型
貝葉斯定理:
常見類型
算法流程
優缺點
集成學習算法
基本原理
常見方法
?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’)