據(jù)導入到模型部署)
簡介圍繞MATLAB統(tǒng)計與機器學習工具箱Statistics and Machine Learning Toolbox編寫的使用說明與案例文檔面向需要進行統(tǒng)計分析、回歸建模和聚類分析的工程師、科研人員及本科生。文檔先概述該工具箱在描述統(tǒng)計、假設檢驗、方差分析、回歸、分類、聚類和數(shù)據(jù)預處理等方面的功能再介紹mean、std、ttest、fitlm、kmeans等常用函數(shù)幫助已經(jīng)掌握MATLAB基礎操作的用戶快速進入數(shù)據(jù)建模環(huán)節(jié)。文檔結構從工具箱概述、功能清單、常用函數(shù)說明到案例實踐逐步展開兩個案例分別演示線性回歸和K均值聚類包含數(shù)據(jù)準備、模型建立、結果可視化等完整步驟便于讀者對照練習并理解從數(shù)據(jù)到模型的完整思路。資源包共1個文件為doc格式約33KB內(nèi)容集中適合查閱和打印。該文檔已有1400余人瀏覽學習對于希望系統(tǒng)掌握MATLAB統(tǒng)計與機器學習方法、并能直接用于實際數(shù)據(jù)任務的讀者來說具有較強參考價值。1. 為什么 Statistics and Machine Learning Toolbox 值得單獨學它把建模從“玄學”變成“流水線”剛接觸 MATLAB 的人多半是從矩陣運算、Simulink 或者圖像處理入的門等到手里攢了一批實驗數(shù)據(jù)、想跑個分類或者回歸的時候才發(fā)現(xiàn) MATLAB 的機器學習能力和 Python 的 scikit-learn 是兩種完全不同的體驗。Statistics and Machine Learning Toolbox 不是一套零散的算法集合它把“數(shù)據(jù)導入 → 預處理 → 特征工程 → 模型訓練 → 驗證評估 → 部署”這條鏈路做成了統(tǒng)一的函數(shù)接口你不需要自己拼湊十幾個第三方包也不需要在不同數(shù)據(jù)結構之間來回轉換。對于已經(jīng)裝了 matlab 2023b 或更新版本的人來說這個工具箱是自帶的一部分它解決的是“我有一份 Excel 表怎么在半小時內(nèi)得到一個能交代結論的模型”這個實際訴求。這篇筆記我從一線使用的角度把這個工具箱拆成四條主線能做什么、怎么組織數(shù)據(jù)、模型怎么選、參數(shù)怎么調、哪些地方最容易翻車。適合手里有數(shù)據(jù)但沒系統(tǒng)學過機器學習的人也適合被 Python 生態(tài)折騰過、想回到 MATLAB 里快速驗證想法的工程師。后面所有代碼都基于我慣用的 2023b 版本低版本R2021a 之前部分函數(shù)名不同我會在對應位置標注差異。2. 從原始表格到第一個模型fit 系列函數(shù)的最小可用流程2.1 數(shù)據(jù)進 MATLAB 的正確姿勢tables 是工具箱的第一公民這個工具箱里幾乎所有模型函數(shù)都接受 table 類型作為輸入而不是傳統(tǒng)的 double 矩陣。這一點和很多 MATLAB 老手的直覺相反——用慣了xlsread或者load的人習慣拿到數(shù)據(jù)先double()轉矩陣但在 Statistics and Machine Learning Toolbox 里table 能幫你自動記住變量名預測結果、特征重要性、混淆矩陣全部按變量名輸出省掉大量索引對位的痛苦。第一步永遠是導入數(shù)據(jù)。readtable是最常用的入口它可以直接讀 CSV、Excel、TXT甚至帶分隔符的日志文件% 導入一份分類任務數(shù)據(jù)特征列 標簽列 data readtable(sample_data.csv, TextType, string); disp(data.Properties.VariableNames); % 查看變量名 disp(height(data)); % 看看有多少行這里的TextType參數(shù)決定文本列被讀成 string 還是 cell。默認char會在后續(xù)建模時產(chǎn)生一些小麻煩建議統(tǒng)一設置成string。讀完后順手做一次缺失值檢查用ismissing行數(shù)太少的數(shù)據(jù)直接放棄不要硬建模。我一般會在讀入后 30 秒內(nèi)跑完這兩行先判斷數(shù)據(jù)能不能用再決定要不要繼續(xù)做特征工程。2.2 fit 之前必須做的兩件事劃分訓練集和特征標準化工具箱里的cvpartition是劃分數(shù)據(jù)最穩(wěn)的函數(shù)比手動randperm好在能保證分層抽樣——分類問題里每個類別的樣本比例在訓練集和測試集中保持一致這個細節(jié)直接決定小樣本數(shù)據(jù)集上的評估結果是否可信。% 按 7:3 劃分訓練/測試保持類別比例分層抽樣 rng(42); % 固定隨機種子確保結果可復現(xiàn) cv cvpartition(data.label, HoldOut, 0.3); trainIdx training(cv); testIdx test(cv); % 特征標準化用訓練集的均值和標準差去轉換測試集避免數(shù)據(jù)泄漏 X_train data{trainIdx, 1:end-1}; X_test data{testIdx, 1:end-1}; y_train data.label(trainIdx); y_test data.label(testIdx); % 標準化 mu mean(X_train); sigma std(X_train); X_train_std (X_train - mu) ./ sigma; X_test_std (X_test - mu) ./ sigma;這里有個新手必踩的坑標準化時必須只算訓練集的均值和標準差然后拿這套參數(shù)去變換測試集。如果先對全量數(shù)據(jù)標準化再劃分測試集的信息就“泄漏”到了訓練過程里驗證精度會虛高 38 個百分點等模型上線后立刻現(xiàn)原形。cvpartition的HoldOut參數(shù)取 0.3 表示留 30% 做測試數(shù)值越大測試集越大但訓練數(shù)據(jù)會變少具體比例根據(jù)你的樣本量酌情調整樣本量小于 500 時建議改用KFold, 5做五折交叉驗證而不是一次性留出 30%。2.3 跑一個最小分類模型fitcknn 三行出結果KNNK 近鄰在工具箱里的入口是fitcknn它不需要訓練過程本質上是把訓練數(shù)據(jù)存下來、預測時算距離。雖然它簡單到不像機器學習但它能幫你在 5 分鐘內(nèi)驗證“數(shù)據(jù)里到底有沒有信號”——如果 KNN 在測試集上準確率都不到 60%后面的復雜模型大概率也救不回來。% 訓練一個 KNN 分類器 mdl_knn fitcknn(X_train_std, y_train, ... NumNeighbors, 5, ... Distance, euclidean, ... Standardize, false); % 已手動標準化這里關閉 % 預測并評估 y_pred_knn predict(mdl_knn, X_test_std); accuracy_knn sum(y_pred_knn y_test) / numel(y_test); fprintf(KNN 準確率: %.2f%%\n, accuracy_knn * 100); % 混淆矩陣可視化分類細節(jié) confusionchart(y_test, y_pred_knn);NumNeighbors控制 K 值K 越小決策邊界越復雜越容易過擬合K 越大越平滑但會丟失局部模式。Distance選euclidean是連續(xù)特征場景下的默認做法如果特征里混有 0/1 二值變量可以試試hamming。fitcknn在 R2021b 之后支持Standardize參數(shù)但如果你已經(jīng)手動標準化了這里必須寫成false否則會二次標準化導致特征尺度被破壞。這個最小流程跑通后整套工具箱的使用邏輯就通了——fitc開頭的函數(shù)管分類fitr開頭的函數(shù)管回歸預測統(tǒng)一用predict評估統(tǒng)一用損失函數(shù)或手工計算指標。3. 分類、回歸、聚類三大任務下工具箱的算法選型與參數(shù)必調項3.1 分類任務從判別分析到集成學習工具箱里到底該選誰工具箱里的分類器大致分四代第一代是判別分析fitcdiscr適合線性可分且特征維度不高的情況第二代是 KNN 和樸素貝葉斯適合快速基準第三代是 SVMfitcecoc或fitcsvm和決策樹適合非線性邊界第四代是集成學習fitcensemble是當前默認推薦項因為它能自動組合大量弱學習器并達到比單模型更穩(wěn)的效果。我一般會先跑fitcensemble和fitcecoc做對比因為這兩個模型覆蓋了“裝袋/提升”和“核映射”兩條最主流的路線% 集成學習100 棵決策樹AdaBoostM2 提升 mdl_ens fitcensemble(X_train_std, y_train, ... Method, AdaBoostM2, ... NumLearningCycles, 100, ... Learners, tree); % 多分類 SVM一對多策略RBF 核 mdl_svm fitcecoc(X_train_std, y_train, ... Learners, templateSVM(KernelFunction, rbf, ... BoxConstraint, 1, KernelScale, auto)); % 對比測試集表現(xiàn) y_pred_ens predict(mdl_ens, X_test_std); y_pred_svm predict(mdl_svm, X_test_std); acc_ens sum(y_pred_ens y_test) / numel(y_test); acc_svm sum(y_pred_svm y_test) / numel(y_test); fprintf(Ensemble: %.2f%% | SVM: %.2f%%\n, acc_ens*100, acc_svm*100);AdaBoostM2是面對多分類時比較穩(wěn)妥的提升方法二分類可以用AdaBoostM1或LogitBoost。NumLearningCycles對應弱學習器數(shù)量100 是起點如果測試精度還在漲就往上加。templateSVM里的BoxConstraint是 SVM 的懲罰系數(shù)越大越強調分類正確、越容易過擬合1 是相對中庸的起點KernelScale, auto讓 MATLAB 自己估計核寬度省事但偶爾會選到次優(yōu)值后續(xù)調參時應該改成手動搜索。決策樹在這個工具箱里的定位比較尷尬——單棵樹的精度通常不夠但它有兩個不可替代的價值一是特征重要性排序predictorImportance二是作為集成學習的基學習器。你可以先用fitctree跑一棵淺樹看看哪些特征被優(yōu)先分裂這比盲目的 PCA 降維更能保留業(yè)務可解釋性。3.2 回歸任務fitrlinear 和 fitrensemble 的分工回歸方面工具箱提供了從線性回歸fitlm到廣義加性模型fitrgam再到集成回歸fitrensemble的完整梯度。fitlm適合做基線——它輸出的 p 值和系數(shù)置信區(qū)間能快速告訴你哪些變量顯著雖然精度一般但可解釋性最好。數(shù)據(jù)量大的時候萬級以上fitrlinear值得優(yōu)先試因為它基于隨機雙梯度下降在稀疏高維數(shù)據(jù)上速度快得離譜。但如果你手里的數(shù)據(jù)集不超過幾千行最快、最準的往往是fitrensemble搭配LSBoost% 集成回歸梯度提升 mdl_r fitrensemble(X_train_std, y_train, ... Method, LSBoost, ... NumLearningCycles, 200, ... LearnRate, 0.1); % 預測與評估 y_pred_r predict(mdl_r, X_test_std); rmse sqrt(mean((y_pred_r - y_test).^2)); r2 1 - sum((y_test - y_pred_r).^2) / sum((y_test - mean(y_test)).^2); fprintf(RMSE %.4f, R2 %.4f\n, rmse, r2);LearnRate學習率是梯度提升里最關鍵的參數(shù)。0.1 是保守起步值訓練集 RMSE 會穩(wěn)步下降降到 0.01 可以讓精度小幅提升但要付出 510 倍的訓練輪數(shù)大于 0.3 基本無需嘗試測試集精度很容易抖成噪聲。NumLearningCycles和學習率是一對組合拳學習率越小需要的迭代次數(shù)越多可以用ValidationData參數(shù)單獨傳驗證集讓 MATLAB 自動輸出每個迭代周期的驗證誤差曲線plot(loss(mdl_r, X_test_std, y_test, Mode, cumulative))看曲線什么時候開始反彈那就是過擬合的起點。3.3 聚類和降維kmeans 之外的另類選擇聚類場景下kmeans和evalclusters的組合是絕大多數(shù)人停下來的地方但工具箱里有一個被低估的函數(shù)dbscan基于密度的聚類。它不需要預設簇數(shù)能自動識別噪聲點對形狀不規(guī)則的數(shù)據(jù)比 kmeans 健壯得多。如果你手里的數(shù)據(jù)不是幾團球狀分布dbscan值得在kmeans之前先跑一次。% 基于密度的聚類自動確定簇個數(shù) idx_db dbscan(X_train_std, 0.5, 10); % epsilon0.5, minpts10 % 聚類效果可視化拉成二維用散點圖粗看 gscatter(X_train_std(:,1), X_train_std(:,2), idx_db);dbscan的兩個參數(shù)epsilon鄰域半徑和minpts最少點數(shù)決定聚類結果。epsilon太小會把一個簇拆成碎片太大又會把多個簇合并掉實戰(zhàn)中通常先用knnsearch對每個樣本求第 K 近鄰距離畫一個排序圖在曲線拐彎處選擇epsilon。minpts一般取特征維數(shù)的兩倍不要小于 5否則噪聲判定失去意義。聚類完成后用silhouette函數(shù)算輪廓系數(shù)高于 0.5 算可接受低于 0.25 基本說明聚類結構不明顯別硬解釋。降維方面pca函數(shù)可以輸出主成分系數(shù)、得分和解釋方差但要注意pca默認對列做中心化但不做標準化。如果不同特征的量綱差異巨大先手動標準化再喂給pca否則前幾個主成分會被量綱大的特征主導得到的主成分圖完全沒意義。工具箱還提供了tsnet-SNE 降維它特別適合把高維數(shù)據(jù)降到二維做可視化探索但tsne的結果每次運行會有差異隨機初始化復現(xiàn)時記得固定隨機種子。4. 黑匣子怎么打開特征選擇、超參數(shù)搜索和模型解釋4.1 用predictorImportance和fsrftest在建模前砍掉噪聲特征建模之前最值錢的一步是特征篩選。工具箱提供了兩類手段過濾式按統(tǒng)計檢驗篩選和嵌入式用模型輸出的重要性篩選。fsrftest是過濾式的代表它對每個特征單獨做 F 檢驗返回 p 值predictorImportance則是嵌入式——訓練完一棵決策樹或集成模型后直接輸出每個特征在分裂中被使用的總增益占比。% 過濾式F 檢驗選擇 top-k 特征 [idx_sorted, scores] fsrftest(X_train_std, y_train); % 畫出特征得分排序前幾個特征如果得分斷崖式下跌只保留前面的即可 bar(scores(idx_sorted)); xlabel(特征序號); ylabel(F 檢驗得分); % 嵌入式樹模型的特征重要性 mdl_tree_simple fitctree(X_train_std, y_train, MaxNumSplits, 20); imp predictorImportance(mdl_tree_simple); [~, sortedIdx] sort(imp, descend); disp(sortedIdx(1:min(10, numel(imp)))); % 輸出最重要的前 10 個特征序號過濾式的優(yōu)勢是快但它的致命缺陷是假設特征獨立——兩個單獨看都沒用的特征組合起來可能非常強反之兩個單獨很強的特征可能高度冗余。所以我一般先跑fsrftest做粗篩砍掉明顯無信息的再跑樹模型的重要性做細篩兩輪都保留下來的特征才建議進最終模型。4.2fitcauto一鍵自動建模能信多少坑在哪里從 R2021a 開始工具箱加入了fitcauto和fitrauto它們會自動嘗試多種模型、做特征選擇、調超參數(shù)最后輸出一個“自動選好的”模型。聽上去像后悔藥但實際操作中最有價值的部分不是最終模型而是自動搜索過程中的日志——它會打印出每種配置的驗證精度這比你自己盲猜參數(shù)要高效得多% 自動分類建模指定優(yōu)化變量數(shù) mdl_auto fitcauto(X_train_std, y_train, ... OptimizeHyperparameters, auto, ... HyperparameterOptimizationOptions, struct(... MaxObjectiveEvaluations, 30, ... ShowPlots, true, ... UseParallel, true));MaxObjectiveEvaluations是貝葉斯優(yōu)化的迭代輪數(shù)30 是一個折中值——太少搜不到好參數(shù)太多耗時成倍增長。UseParallel設為true能利用多核加速但并行池啟動本身有開銷數(shù)據(jù)量小于 1000 行時不建議開。這個函數(shù)不會幫你做數(shù)據(jù)清洗和特征工程它只優(yōu)化模型部分前端的臟數(shù)據(jù)問題它無能為力。自動模型的可解釋性也比較差用于交差或者快速試探?jīng)]問題用于生產(chǎn)環(huán)境前一定要手動驗證并固定參數(shù)重新訓練。4.3 超參數(shù)手動搜索的一個有效慣例先粗后細先范圍后精度自動優(yōu)化能省時間但你要理解它背后的貝葉斯優(yōu)化在做什么。工具箱的optimizableVariablebayesopt這套底層接口適合那些需要自定義目標函數(shù)的場景比如你不僅要優(yōu)化精度還要懲罰模型的復雜度或者要求誤報率低于某個閾值。bayesopt的核心邏輯是先隨機采樣幾個點然后用高斯過程擬合“參數(shù)→目標函數(shù)”的映射再通過采集函數(shù)默認expected-improvement選擇下一個最有潛力的點去評估。這意味著它能主動避開明顯差的區(qū)域把評估預算花在刀刃上。實戰(zhàn)中一個可靠的做法是先放開范圍粗搜 3050 次找到相對好的區(qū)域然后縮窄范圍再搜 20 次讓模型在小范圍里精雕細琢。直接上來就窄范圍搜索很可能錯過真正的最優(yōu)區(qū)域因為貝葉斯優(yōu)化的初始探索階段太短。5. 避坑指南我用這個工具箱三年攢下的五條翻車記錄5.1 變量名是 string 還是 cell決定你后面要不要對著索引哭現(xiàn)象代碼跑到fitcsvm報錯提示 Predictor names must be a cell array of character vectors或者預測時predict輸出的變量名帶引號怪里怪氣。原因readtable默認把文本變量讀成 cell 數(shù)組當你用data.Properties.VariableNames去匹配列名時得到的類型是cell但如果用readtable(..., TextType, string)同樣的操作返回的是string類型。工具箱內(nèi)部接口早期對這兩種類型支持不統(tǒng)一報錯信息又不夠直觀讓人卡半天找不到地方。解決建模前統(tǒng)一執(zhí)行一行data.Properties.VariableNames matlab.lang.makeValidName(data.Properties.VariableNames);把變量名清洗成合法格式同時保證所有列名都以char類型存在。如果你是從矩陣轉 table 創(chuàng)建的變量干脆在創(chuàng)建時用VariableNames, {col1,col2,...}顯式指定不要貪圖省事留默認名Var1, Var2——后面做特征篩選和結果解釋了會非常痛苦。5.2table里混入的NaN會靜默改變聚類和 KNN 的距離計算現(xiàn)象kmeans和dbscan跑完聚類結果里多了一堆孤立的“簇”或者 KNN 的分類精度低到離譜但你檢查輸入矩陣并沒有明顯問題。原因table類型的數(shù)據(jù)列可以容納NaN而 KNN 計算距離時遇到NaN會把該樣本的距離直接置為缺失工具箱的默認行為是跳過這些樣本而不是報錯。你看到的是精度下降實際是大量樣本在距離計算階段就被丟棄了。解決建模前顯式處理缺失值rmmissing刪整行或者fillmissing用中位數(shù)/均值填充。我常在劃分數(shù)據(jù)集之前跑一次data rmmissing(data);先看看刪掉多少行如果刪掉超過 15%就要考慮是不是數(shù)據(jù)采集流程有問題而不是簡單丟棄。聚類任務用rmmissing更穩(wěn)妥因為填充操作會引入人為信號扭曲密度的真實分布。5.3 高版本參數(shù)名不兼容R2023b 的腳本拿到 R2021a 跑不起來現(xiàn)象換一臺裝了老版本 MATLAB 的機器跑腳本報錯Invalid argument name TextType或者Standardize不可用。原因工具箱每年都在加參數(shù)和改默認值readtable的TextType參數(shù)在 R2021b 之后才穩(wěn)定fitcknn的Standardize參數(shù)也是 R2021a 新增。同一套代碼在不同版本間的行為差異比想象中大特別是默認值的變化——有些函數(shù)在老版本里默認不做標準化新版本默認做導致同樣代碼在不同機器上結果對不上。解決腳本開頭用ver(stats)打印工具箱版本號在關鍵函數(shù)調用前用if exist(SomeFunction, file)判斷函數(shù)是否存在分支處理。對于需要長期保存的腳本寫完第一版后立刻在目標機器上用R2021a級別的-release參數(shù)重新跑一遍冒煙測試不要默認所有人的環(huán)境和你一致。涉及fitcauto這種新函數(shù)的代碼老版本直接跑不了——提前在腳本說明文件里寫明最低版本要求。5.4 分類問題千萬別把標簽放進標準化范圍里現(xiàn)象做完標準化后fitcsvm訓練直接崩潰或者訓練成功但預測結果全是一個類別。原因有人在用normalize(data)對整個 table 做標準化時把標簽列也一起標準化了。對于數(shù)值型標簽回歸問題這意味著標簽被縮放后續(xù) RMSE 計算全錯對于分類標簽通常是 categorical 類型標準化直接報錯。這種錯誤的典型來源是把 X 和 y 拼在一個 matrix 里忘了分開處理。解決數(shù)據(jù)導入后第一時間用y data.label; X data(:, 1:end-1);把標簽拆出來獨立存放后續(xù)所有預處理都只對 X 操作。如果是多列標簽比如多任務回歸單獨存成單獨的矩陣絕不和特征混在一個矩陣里過標準化和 PCA。養(yǎng)成這個習慣能避免至少 30% 的建模階段低級報錯。5.5 并行計算池沒關干凈導致反復重開 MATLAB現(xiàn)象跑完fitcauto或bayesopt后MATLAB 內(nèi)存占用異常高再跑別的任務明顯變卡關了 MATLAB 重開才好。原因UseParallel為true的優(yōu)化過程會啟動并行池parpool計算完成后并行池不會被自動關閉它一直在后臺占著內(nèi)存和 CPU 核心。如果你連續(xù)跑多個優(yōu)化任務每個任務開一個新的并行池內(nèi)存會指數(shù)級上漲。解決優(yōu)化代碼結束后手動加一行delete(gcp(nocreate));先檢查是否存在并行池存在就關閉。如果你的工作流是“一次性跑一堆優(yōu)化任務”可以在腳本開頭統(tǒng)一開一個并行池把所有任務跑完再關比每個任務單獨開合池要省去大量重復啟動時間。另外并行池默認的Processes數(shù)量等于 CPU 邏輯核心數(shù)對 8 核以上的機器建議手動限制為parpool(4)留些資源給 MATLAB 主線程做交互繪圖和數(shù)據(jù)管理。6. 把訓練好的模型打包成可用的東西CompactModel、代碼生成和定時重訓的完整閉環(huán)模型訓練完只是第一步難點在于讓它能在別人手里、別的機器上跑起來。工具箱提供了一條完成度很高的部署鏈路訓練好的模型對象里包含全部訓練數(shù)據(jù)比如 KNN 和 SVM 都要存支持向量用compact方法可以丟棄冗余信息生成CompactClassificationModel而saveLearnerForCoder則能把模型變成 C 代碼生成器可以消費的格式% 壓縮模型體積去掉訓練數(shù)據(jù)引用只保留預測所需的核心參數(shù) mdl_compact compact(mdl_svm); saveLearnerForCoder(mdl_compact, svm_model); % 生成一段用于 C 代碼生成的預測函數(shù) % 在 MATLAB Coder 里把 svm_model.mat 和下面這個函數(shù)一起打包 function label predict_svm(X) %#codegen mdl loadLearnerForCoder(svm_model); label predict(mdl, X); endloadLearnerForCoder和saveLearnerForCoder這對接口是整個工具箱里最容易被忽略的生產(chǎn)力工具。它們支持大部分常見模型SVM、KNN、決策樹、集成模型、判別分析生成的預測函數(shù)可以被 MATLAB Coder 編譯成 C/C 代碼也可以直接部署到 Simulink 模型里做實時推理。要注意的是compact之后有些模型方法比如resubPredict查看訓練集表現(xiàn)不再可用部署前先用測試集驗證完精度再壓縮壓縮后無法恢復原始模型所以保留一份未壓縮的原件是必備的后悔藥。對于數(shù)據(jù)分布隨時間漂移的場景比如設備狀態(tài)監(jiān)測、價格預測一個實用的慣例是把“定時重訓 模型版本記錄”做成一個獨立腳本用exist檢查模型文件是否存在來決定是加載舊模型還是重新訓練。另外訓練完成后立刻用save(model_full.mat, mdl, X_train_std, y_train, mu, sigma)把訓練數(shù)據(jù)、標準化參數(shù)和模型一起存下來這樣以后任何一次模型迭代你都能用同一套測試集做公平對比不會因為換了數(shù)據(jù)劃分方式而沒法定位性能變化到底來自模型還是來自數(shù)據(jù)。我自己的習慣是每次訓練完都順手把confusionchart或回歸殘差圖plotResiduals(mdl_r)截圖存檔一個月后再翻出來對照數(shù)據(jù)漂移情況。模型的精度變化很多時候不是模型退化了而是輸入的分布變了只有留好了訓練時的基線快照才能快速區(qū)分這兩種情況。希望這些積累能幫你在 Statistics and Machine Learning Toolbox 里少走幾段彎路把時間真正花在分析和決策上。本文還有配套的精品資源點擊獲取