測(cè)應(yīng)用:從原理到實(shí)戰(zhàn))
簡(jiǎn)介本資源是一套面向機(jī)器學(xué)習(xí)初學(xué)者與Matlab實(shí)踐者的邏輯回歸建模工具包聚焦多輸入單輸出的回歸預(yù)測(cè)任務(wù)適用于金融風(fēng)控評(píng)分、醫(yī)學(xué)風(fēng)險(xiǎn)評(píng)估、工況狀態(tài)預(yù)測(cè)等需概率化輸出的場(chǎng)景。壓縮包共4個(gè)文件3個(gè)核心M函數(shù)1個(gè)Excel數(shù)據(jù)表總大小僅14KB輕量易部署其中訓(xùn)練主控腳本封裝完整流程sigmoid函數(shù)實(shí)現(xiàn)非線性映射數(shù)據(jù)表提供可直接替換的樣本集代碼兼容Matlab 2018a及以上版本。已有309人學(xué)習(xí)下載代碼結(jié)構(gòu)清晰、注釋詳盡內(nèi)置MAE、RMSE等主流回歸評(píng)價(jià)指標(biāo)計(jì)算模塊支持一鍵運(yùn)行與結(jié)果可視化便于理解邏輯回歸在回歸任務(wù)中的變體應(yīng)用、參數(shù)調(diào)優(yōu)邏輯及評(píng)估體系構(gòu)建。1. 項(xiàng)目概述從分類到回歸的邏輯回歸應(yīng)用提到邏輯回歸很多人的第一反應(yīng)是二分類問(wèn)題比如預(yù)測(cè)用戶是否會(huì)點(diǎn)擊廣告、判斷郵件是否為垃圾郵件。這確實(shí)是邏輯回歸最經(jīng)典、最廣為人知的應(yīng)用場(chǎng)景。然而邏輯回歸的“回歸”二字并非虛名它本質(zhì)上是一種廣義線性模型其核心輸出是一個(gè)介于0和1之間的概率值。當(dāng)我們把這個(gè)概率值本身或者其經(jīng)過(guò)某種變換如Logit變換后的值當(dāng)作一個(gè)連續(xù)的預(yù)測(cè)目標(biāo)時(shí)邏輯回歸就成了一種強(qiáng)大的回歸工具尤其適用于預(yù)測(cè)目標(biāo)值有界比如在0到1之間或者其分布呈現(xiàn)S型增長(zhǎng)/衰減規(guī)律的數(shù)據(jù)。這次我們要探討的正是邏輯回歸在多輸入單輸出回歸預(yù)測(cè)中的應(yīng)用。想象一下這樣的場(chǎng)景你需要預(yù)測(cè)某種材料的合成成功率0%到100%、一款A(yù)PP的次日留存率、或者一個(gè)區(qū)域的客戶轉(zhuǎn)化率。這些目標(biāo)變量Y都是連續(xù)的但它們的值域被天然限制在[0,1]區(qū)間內(nèi)。直接用線性回歸去擬合預(yù)測(cè)值可能會(huì)超出這個(gè)合理范圍變得毫無(wú)意義。這時(shí)邏輯回歸通過(guò)其Sigmoid函數(shù)天然地將線性組合的輸入映射到(0,1)區(qū)間完美契合了這類問(wèn)題的需求。在Matlab環(huán)境中實(shí)現(xiàn)這一過(guò)程優(yōu)勢(shì)在于其強(qiáng)大的矩陣運(yùn)算能力、豐富的統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱以及便捷的可視化功能。我們可以從數(shù)據(jù)導(dǎo)入、預(yù)處理、模型訓(xùn)練、評(píng)估到最終預(yù)測(cè)形成一個(gè)完整、流暢的工作流。本文將手把手帶你走通這個(gè)流程不僅告訴你每一步怎么做更會(huì)深入解釋為什么要這么做并分享我在實(shí)際建模中積累的一些關(guān)鍵技巧和避坑經(jīng)驗(yàn)。無(wú)論你是處理實(shí)驗(yàn)數(shù)據(jù)、金融指標(biāo)還是用戶行為數(shù)據(jù)這套方法都能為你提供一個(gè)堅(jiān)實(shí)可靠的預(yù)測(cè)基線模型。2. 邏輯回歸用于回歸預(yù)測(cè)的核心原理拆解要正確應(yīng)用邏輯回歸做回歸預(yù)測(cè)必須徹底理解其數(shù)學(xué)本質(zhì)這能幫助我們?cè)诤罄m(xù)的模型診斷和調(diào)優(yōu)中保持清醒。2.1 Sigmoid函數(shù)從線性到有界的橋梁邏輯回歸的核心是Sigmoid函數(shù)也叫Logistic函數(shù)其表達(dá)式為σ(z) 1 / (1 e^{-z})其中z是我們的線性組合z β? β?X? β?X? ... β?X?。這個(gè)函數(shù)的神奇之處在于無(wú)論輸入z是多大或多小的實(shí)數(shù)輸出σ(z)始終被壓縮在(0, 1)之間。當(dāng)z趨近于正無(wú)窮時(shí)σ(z)趨近于1當(dāng)z趨近于負(fù)無(wú)窮時(shí)σ(z)趨近于0當(dāng)z0時(shí)σ(z)0.5。這個(gè)S形的曲線非常適合描述那種“初期增長(zhǎng)緩慢然后加速最后趨于飽和”的現(xiàn)象比如學(xué)習(xí)曲線的掌握程度、廣告投放的點(diǎn)擊率隨預(yù)算的變化等。在分類任務(wù)中我們?cè)O(shè)定一個(gè)閾值如0.5將σ(z)轉(zhuǎn)化為0或1的類別標(biāo)簽。而在回歸任務(wù)中我們直接使用σ(z)作為預(yù)測(cè)值?。也就是說(shuō)我們的模型最終輸出是? σ(β? β?X? β?X? ... β?X?)這個(gè)?就是一個(gè)位于0到1之間的概率值我們將其解釋為我們目標(biāo)變量的預(yù)測(cè)值。2.2 目標(biāo)變量Y的處理關(guān)鍵前提既然模型的輸出?在(0,1)之間那么我們的真實(shí)目標(biāo)變量Y也必須落在或能被映射到這個(gè)區(qū)間。這是使用邏輯回歸做回歸預(yù)測(cè)的首要前提。常見情況有兩種Y天然在[0,1]區(qū)間如比例、百分比、成功率、濃度歸一化后等。這是最理想的情況可以直接使用。Y是有界連續(xù)值比如預(yù)測(cè)銷量其值在200到1000之間。這時(shí)我們需要進(jìn)行最小-最大歸一化將Y線性縮放至[0,1]區(qū)間。Y_scaled (Y - Y_min) / (Y_max - Y_min)模型預(yù)測(cè)得到?_scaled后再反變換回原始尺度? ?_scaled * (Y_max - Y_min) Y_min一個(gè)重要提醒邏輯回歸默認(rèn)假設(shè)數(shù)據(jù)可以通過(guò)Sigmoid函數(shù)很好地?cái)M合。如果Y和X之間的關(guān)系是線性的或者非常復(fù)雜非S型那么邏輯回歸可能不是最佳選擇。在模型訓(xùn)練前繪制Y與主要X的散點(diǎn)圖觀察其趨勢(shì)是一個(gè)很好的習(xí)慣。2.3 參數(shù)估計(jì)從最大似然到實(shí)際優(yōu)化模型參數(shù)β是如何得到的在分類問(wèn)題中我們通過(guò)最大似然估計(jì)來(lái)尋找一組β使得觀測(cè)到的樣本類別出現(xiàn)的概率最大。在回歸問(wèn)題中雖然我們的Y是連續(xù)值但優(yōu)化目標(biāo)通常轉(zhuǎn)變?yōu)樽钚』瘬p失函數(shù)。對(duì)于回歸任務(wù)更常用的損失函數(shù)是均方誤差。在Matlab中fitglm函數(shù)擬合廣義線性模型或統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱中的fitrlinear用于線性回歸但可通過(guò)指定損失函數(shù)變體使用等函數(shù)其內(nèi)部算法如迭代加權(quán)最小二乘法會(huì)幫我們自動(dòng)完成參數(shù)優(yōu)化。我們只需要理解算法在不斷調(diào)整β試圖讓模型輸出的?盡可能接近真實(shí)的Y。3. Matlab實(shí)戰(zhàn)構(gòu)建多輸入單輸出邏輯回歸預(yù)測(cè)模型理論清晰后我們進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。我將以一個(gè)模擬數(shù)據(jù)集為例假設(shè)我們要預(yù)測(cè)一個(gè)化工反應(yīng)的“產(chǎn)物收率”Y范圍0~1它有5個(gè)影響因素X1-X5如溫度、壓力、催化劑濃度等。3.1 數(shù)據(jù)準(zhǔn)備與探索性分析任何建模工作都始于數(shù)據(jù)。首先我們生成或加載數(shù)據(jù)。% 1. 生成模擬數(shù)據(jù) rng(123); % 設(shè)定隨機(jī)種子確保結(jié)果可復(fù)現(xiàn) n_samples 500; X randn(n_samples, 5); % 5個(gè)特征假設(shè)服從標(biāo)準(zhǔn)正態(tài)分布 % 構(gòu)造真實(shí)的邏輯關(guān)系 true_beta [0.5, 1.2, -0.8, 0.3, -1.5]; % 特征權(quán)重 true_intercept -0.2; z true_intercept X * true_beta‘; % 線性部分 prob 1 ./ (1 exp(-z)); % 通過(guò)sigmoid得到真實(shí)概率 % 添加少量噪聲模擬現(xiàn)實(shí)觀測(cè) Y prob 0.05 * randn(n_samples, 1); % 確保Y在[0,1]區(qū)間內(nèi)因?yàn)樵肼暱赡苁蛊漭p微越界 Y(Y0) 0.001; Y(Y1) 0.999; % 2. 劃分訓(xùn)練集和測(cè)試集 (70%訓(xùn)練30%測(cè)試) cv cvpartition(n_samples, ‘HoldOut‘, 0.3); idx_train training(cv); idx_test test(cv); X_train X(idx_train, :); Y_train Y(idx_train); X_test X(idx_test, :); Y_test Y(idx_test); % 3. 探索性分析 - 查看Y的分布 figure; subplot(1,2,1); histogram(Y_train); title(‘訓(xùn)練集目標(biāo)變量Y分布‘); xlabel(‘Y (產(chǎn)物收率)‘); ylabel(‘頻數(shù)‘); % 查看某個(gè)主要特征與Y的關(guān)系 subplot(1,2,2); scatter(X_train(:,1), Y_train, ‘.‘); hold on; % 可以嘗試添加一個(gè)局部加權(quán)散點(diǎn)平滑線(LOWESS)觀察趨勢(shì) % 需要曲線擬合工具箱: f fit(X_train(:,1), Y_train, ‘lowess‘, ‘Span‘, 0.3); % plot(f, ‘r-‘); title(‘特征X1與Y的散點(diǎn)圖‘); xlabel(‘特征 X1‘); ylabel(‘Y‘);注意在實(shí)際項(xiàng)目中如果你的Y不在[0,1]之間務(wù)必在此步驟進(jìn)行歸一化。同時(shí)檢查特征X是否存在量綱差異過(guò)大的問(wèn)題雖然邏輯回歸對(duì)特征縮放不敏感但規(guī)范化如Z-score標(biāo)準(zhǔn)化有時(shí)能加速優(yōu)化算法的收斂。對(duì)于我們的模擬數(shù)據(jù)X已是標(biāo)準(zhǔn)正態(tài)分布故無(wú)需處理。3.2 模型訓(xùn)練使用fitglm函數(shù)Matlab的統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱提供了fitglm函數(shù)它是構(gòu)建廣義線性模型包括邏輯回歸的瑞士軍刀。% 將數(shù)據(jù)轉(zhuǎn)換為表Table這是fitglm推薦的數(shù)據(jù)格式列名更清晰 tbl_train array2table([X_train, Y_train], ... ‘VariableNames‘, {‘Temp‘, ‘Pressure‘, ‘Catalyst‘, ‘Time‘, ‘StirRate‘, ‘Yield‘}); % 使用fitglm擬合二項(xiàng)式邏輯回歸模型 % ‘Distribution‘, ‘binomial‘ 指定使用二項(xiàng)分布即邏輯回歸 % ‘Link‘, ‘logit‘ 指定使用logit鏈接函數(shù)即sigmoid這是默認(rèn)值可省略 % 公式 ‘Yield ~ Temp Pressure Catalyst Time StirRate‘ 表示用所有特征預(yù)測(cè)Yield logistic_model fitglm(tbl_train, ... ‘Yield ~ Temp Pressure Catalyst Time StirRate‘, ... ‘Distribution‘, ‘binomial‘); % 顯示模型摘要 disp(logistic_model);運(yùn)行disp(logistic_model)后你會(huì)看到一份詳細(xì)的摘要包括系數(shù)估計(jì)每個(gè)特征對(duì)應(yīng)的β值及其標(biāo)準(zhǔn)誤、t統(tǒng)計(jì)量和p值。p值可以幫助我們初步判斷該特征是否顯著通常以p0.05為界。模型擬合優(yōu)度如偏差Deviance、AIC、BIC等。這些值用于模型比較在同數(shù)據(jù)集上值越小通常表示模型擬合越好。一個(gè)關(guān)鍵技巧fitglm在用于連續(xù)值回歸時(shí)可能會(huì)因?yàn)閅不是嚴(yán)格的0/1而給出警告。這通常不影響使用因?yàn)樗惴▋?nèi)部處理的是概率。另一種更“回歸”的思路是使用fitlm線性回歸但手動(dòng)指定非線性關(guān)系或者使用曲線擬合工具箱。但對(duì)于符合S型假設(shè)的有界輸出fitglmwith ‘binomial‘ 是簡(jiǎn)潔有效的選擇。3.3 模型預(yù)測(cè)與評(píng)估模型訓(xùn)練好后我們需要在測(cè)試集上評(píng)估其泛化能力。% 1. 對(duì)測(cè)試集進(jìn)行預(yù)測(cè) tbl_test array2table(X_test, ... ‘VariableNames‘, {‘Temp‘, ‘Pressure‘, ‘Catalyst‘, ‘Time‘, ‘StirRate‘}); Y_pred_prob predict(logistic_model, tbl_test); % 預(yù)測(cè)得到的是概率值 % 2. 評(píng)估指標(biāo)計(jì)算 % 均方誤差 mse mean((Y_test - Y_pred_prob).^2); fprintf(‘測(cè)試集均方誤差 %.4f\n‘, mse); % 均方根誤差 rmse sqrt(mse); fprintf(‘測(cè)試集均方根誤差 %.4f\n‘, rmse); % 平均絕對(duì)誤差 mae mean(abs(Y_test - Y_pred_prob)); fprintf(‘測(cè)試集平均絕對(duì)誤差 %.4f\n‘, mae); % R-squared (決定系數(shù)) SS_res sum((Y_test - Y_pred_prob).^2); SS_tot sum((Y_test - mean(Y_test)).^2); r_squared 1 - (SS_res / SS_tot); fprintf(‘測(cè)試集R-squared %.4f\n‘, r_squared); % 3. 可視化預(yù)測(cè)結(jié)果 vs 真實(shí)值 figure; scatter(Y_test, Y_pred_prob, 40, ‘filled‘, ‘MarkerFaceAlpha‘, 0.6); hold on; plot([0 1], [0 1], ‘r--‘, ‘LineWidth‘, 2); % 繪制yx的參考線 xlabel(‘真實(shí)產(chǎn)物收率‘); ylabel(‘預(yù)測(cè)產(chǎn)物收率‘); title(‘邏輯回歸模型預(yù)測(cè)效果散點(diǎn)圖‘); legend(‘預(yù)測(cè)點(diǎn)‘, ‘理想線 (yx)‘, ‘Location‘, ‘best‘); grid on; axis equal; xlim([0 1]); ylim([0 1]); % 4. 繪制預(yù)測(cè)誤差分布 pred_error Y_test - Y_pred_prob; figure; histogram(pred_error, 30); xlabel(‘預(yù)測(cè)誤差 (真實(shí)值 - 預(yù)測(cè)值)‘); ylabel(‘頻數(shù)‘); title(‘預(yù)測(cè)誤差分布直方圖‘); hold on; y_limits ylim; plot([0 0], y_limits, ‘r-‘, ‘LineWidth‘, 2); % 在0誤差處畫豎線通過(guò)散點(diǎn)圖我們可以直觀看到預(yù)測(cè)值與真實(shí)值的接近程度。理想情況下所有點(diǎn)應(yīng)緊密分布在紅色虛線yx附近。誤差分布直方圖應(yīng)大致以0為中心呈正態(tài)分布如果出現(xiàn)明顯的偏態(tài)則說(shuō)明模型存在系統(tǒng)性偏差。4. 進(jìn)階診斷與模型優(yōu)化得到一個(gè)初步模型后工作遠(yuǎn)未結(jié)束。我們需要深入診斷模型是否存在問(wèn)題并嘗試優(yōu)化。4.1 模型診斷檢查邏輯回歸的假設(shè)邏輯回歸雖然假設(shè)比線性回歸寬松但仍有一些要點(diǎn)需要檢查特征的多重共線性高度相關(guān)的特征會(huì)使得系數(shù)估計(jì)不穩(wěn)定難以解釋??梢允褂梅讲钆蛎浺蜃觼?lái)檢查。% 計(jì)算VIF design_matrix table2array(varfun(double, tbl_train(:, 1:end-1))); % 獲取特征矩陣 [~, ~, ~, ~, stats] regress(tbl_train.Yield, [ones(size(design_matrix,1),1), design_matrix]); % 手動(dòng)計(jì)算VIF比較繁瑣通??梢?% a) 查看相關(guān)系數(shù)矩陣 corr_matrix corr(design_matrix); figure; heatmap(corr_matrix, ‘ColorMap‘, parula); title(‘特征間相關(guān)系數(shù)矩陣‘); % 如果存在相關(guān)系數(shù)大于0.8的特征對(duì)考慮刪除其中一個(gè)或使用主成分分析降維。異常值與高杠桿點(diǎn)邏輯回歸對(duì)異常值相對(duì)穩(wěn)健但極端值仍可能影響模型??梢岳L制殘差圖。% 計(jì)算訓(xùn)練集的預(yù)測(cè)值與殘差 Y_train_pred predict(logistic_model, tbl_train(:, 1:end-1)); residuals tbl_train.Yield - Y_train_pred; figure; subplot(1,2,1); scatter(Y_train_pred, residuals, ‘filled‘); xlabel(‘預(yù)測(cè)值‘); ylabel(‘殘差‘); title(‘殘差 vs 預(yù)測(cè)值圖‘); hold on; plot(xlim, [0 0], ‘k-‘); % 零線 % 理想情況殘差隨機(jī)均勻分布在0線上下無(wú)明顯模式。 subplot(1,2,2); scatter(1:length(residuals), residuals, ‘filled‘); xlabel(‘樣本序號(hào)‘); ylabel(‘殘差‘); title(‘殘差序列圖‘); hold on; plot(xlim, [0 0], ‘k-‘); % 檢查殘差是否獨(dú)立。如果呈現(xiàn)趨勢(shì)或周期性可能遺漏了重要特征或存在自相關(guān)。4.2 特征工程與選擇提升模型性能初始模型使用了所有特征但并非所有特征都有用。特征選擇可以簡(jiǎn)化模型、防止過(guò)擬合、提升解釋性。逐步回歸讓Matlab自動(dòng)根據(jù)AIC等準(zhǔn)則選擇特征。% 使用‘Stepwise‘參數(shù)進(jìn)行逐步回歸 stepwise_model fitglm(tbl_train, ... ‘Yield ~ Temp Pressure Catalyst Time StirRate‘, ... ‘Distribution‘, ‘binomial‘, ‘CategoricalVars‘, [], ‘Verbose‘, 0); % 注意對(duì)于連續(xù)Y的‘binomial‘模型逐步回歸可能受限。另一種方法是基于線性回歸做特征選擇再將選出的特征用于邏輯回歸。 % 更通用的方法使用正則化邏輯回歸Lasso進(jìn)行特征選擇 % 需要統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱 % 先將Y視為連續(xù)值使用lasso進(jìn)行特征選擇這里使用線性回歸的lasso作為演示 [B, FitInfo] lasso(X_train, Y_train, ‘CV‘, 10); % 10折交叉驗(yàn)證 lassoPlot(B, FitInfo, ‘PlotType‘, ‘Lambda‘, ‘XScale‘, ‘log‘); % 選擇使得交叉驗(yàn)證誤差最小的Lambda對(duì)應(yīng)的系數(shù) idx_best FitInfo.Index1SE; % 通常選擇1個(gè)標(biāo)準(zhǔn)誤內(nèi)的最簡(jiǎn)模型 coef_best B(:, idx_best); coef0_best FitInfo.Intercept(idx_best); % 找出非零系數(shù)對(duì)應(yīng)的特征 selected_features_idx find(coef_best ~ 0); fprintf(‘Lasso選出的特征索引%s\n‘, mat2str(selected_features_idx)); % 然后用選出的特征重新訓(xùn)練邏輯回歸模型 if ~isempty(selected_features_idx) X_train_selected X_train(:, selected_features_idx); tbl_train_selected array2table([X_train_selected, Y_train], ... ‘VariableNames‘, [tbl_train.Properties.VariableNames(selected_features_idx), {‘Yield‘}]); model_selected fitglm(tbl_train_selected, ‘linear‘, ‘Distribution‘, ‘binomial‘); % 評(píng)估新模型... end交互項(xiàng)與多項(xiàng)式特征如果懷疑特征間存在交互效應(yīng)或Y與X存在非線性關(guān)系但整體仍符合S型可以嘗試添加交互項(xiàng)或多項(xiàng)式項(xiàng)。% 例如添加溫度和壓力的交互項(xiàng) tbl_train_interaction tbl_train; tbl_train_interaction.Temp_Pressure tbl_train.Temp .* tbl_train.Pressure; model_interaction fitglm(tbl_train_interaction, ... ‘Yield ~ Temp Pressure Catalyst Time StirRate Temp_Pressure‘, ... ‘Distribution‘, ‘binomial‘); % 檢查交互項(xiàng)的系數(shù)是否顯著 disp(model_interaction.Coefficients(end, :)); % 查看交互項(xiàng)系數(shù)的p值4.3 應(yīng)對(duì)過(guò)擬合正則化與交叉驗(yàn)證當(dāng)特征較多或數(shù)據(jù)量較少時(shí)模型容易過(guò)擬合。除了特征選擇正則化是直接有效的辦法。Matlab的fitrlinear函數(shù)用于線性回歸支持彈性網(wǎng)絡(luò)正則化但用于邏輯回歸的連續(xù)輸出需要一些技巧。一個(gè)更直接的方法是使用lassoglm函數(shù)進(jìn)行L1正則化邏輯回歸。% 使用lassoglm進(jìn)行正則化邏輯回歸注意lassoglm默認(rèn)用于二分類但通過(guò)指定‘binomial‘分布和連續(xù)Y可以工作 % 這里我們演示思路實(shí)際操作中需謹(jǐn)慎因?yàn)檫B續(xù)Y可能被誤判為類別。 % 更穩(wěn)健的做法將連續(xù)Y離散化為多個(gè)區(qū)間如十分位數(shù)轉(zhuǎn)化為有序分類問(wèn)題但會(huì)損失信息。 % 替代方案使用貝葉斯正則化在fitglm中通過(guò)‘Regularization‘參數(shù)實(shí)現(xiàn)需要較新版本Matlab。 % 或者使用交叉驗(yàn)證來(lái)評(píng)估模型泛化能力選擇復(fù)雜度適中的模型。 cv_model fitglm(tbl_train, ... ‘Yield ~ Temp Pressure Catalyst Time StirRate‘, ... ‘Distribution‘, ‘binomial‘, ‘CV‘, ‘10fold‘); % 10折交叉驗(yàn)證 % 比較交叉驗(yàn)證誤差與訓(xùn)練誤差 cv_loss kfoldLoss(cv_model); % 交叉驗(yàn)證平均損失偏差 train_loss cv_model.TrainingLoss; % 訓(xùn)練集損失 fprintf(‘訓(xùn)練集損失%.4f\n‘, train_loss); fprintf(‘10折交叉驗(yàn)證平均損失%.4f\n‘, cv_loss); % 如果兩者相差很大說(shuō)明可能存在過(guò)擬合。5. 部署與應(yīng)用從模型到實(shí)際預(yù)測(cè)模型通過(guò)驗(yàn)證后就可以用于對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)了。關(guān)鍵在于形成一套可復(fù)用的流程。5.1 封裝預(yù)測(cè)流程將數(shù)據(jù)預(yù)處理、模型預(yù)測(cè)和后處理如反歸一化步驟封裝成一個(gè)函數(shù)或腳本。function y_pred predict_yield(model, new_data, feature_names) % model: 訓(xùn)練好的fitglm模型對(duì)象 % new_data: 新的特征數(shù)據(jù)矩陣 (m x n) % feature_names: 與訓(xùn)練時(shí)一致的特征名稱元胞數(shù)組 % y_pred: 預(yù)測(cè)的產(chǎn)物收率概率值 % 1. 將新數(shù)據(jù)轉(zhuǎn)換為表 if nargin 3 feature_names {‘Temp‘, ‘Pressure‘, ‘Catalyst‘, ‘Time‘, ‘StirRate‘}; end tbl_new array2table(new_data, ‘VariableNames‘, feature_names); % 2. 使用模型預(yù)測(cè) y_pred_prob predict(model, tbl_new); % 3. 可選如果訓(xùn)練時(shí)對(duì)Y進(jìn)行了歸一化此處需要進(jìn)行反歸一化 % 假設(shè)我們有存儲(chǔ)的Y_min和Y_max % y_pred y_pred_prob * (Y_max_train - Y_min_train) Y_min_train; % 本例中Y已在[0,1]直接返回概率值即可 y_pred y_pred_prob; end % 使用示例 % 假設(shè)有新的一批工藝條件數(shù)據(jù) new_X [0.5, -0.2, 1.1, -0.8, 0.3; -0.1, 0.7, -0.5, 0.9, -1.2]; predicted_yields predict_yield(logistic_model, new_X); disp(‘新樣本預(yù)測(cè)收率‘); disp(predicted_yields);5.2 結(jié)果解釋與不確定性量化對(duì)于回歸預(yù)測(cè)給出點(diǎn)估計(jì)一個(gè)預(yù)測(cè)值往往不夠我們還需要知道這個(gè)預(yù)測(cè)的不確定性。邏輯回歸模型本身可以提供預(yù)測(cè)值的置信區(qū)間。% 獲取預(yù)測(cè)值及置信區(qū)間 [Y_pred_test, Y_ci] predict(logistic_model, tbl_test, ‘Alpha‘, 0.05); % 95%置信區(qū)間 % 可視化預(yù)測(cè)值與置信區(qū)間 figure; [Y_test_sorted, sort_idx] sort(Y_test); Y_pred_sorted Y_pred_test(sort_idx); Y_ci_sorted Y_ci(sort_idx, :); plot(1:length(Y_test_sorted), Y_test_sorted, ‘b.‘, ‘MarkerSize‘, 10, ‘DisplayName‘, ‘真實(shí)值‘); hold on; plot(1:length(Y_pred_sorted), Y_pred_sorted, ‘r-‘, ‘LineWidth‘, 1.5, ‘DisplayName‘, ‘預(yù)測(cè)值‘); fill([1:length(Y_pred_sorted), fliplr(1:length(Y_pred_sorted))], ... [Y_ci_sorted(:,1)‘, fliplr(Y_ci_sorted(:,2)‘)], ... ‘r‘, ‘FaceAlpha‘, 0.2, ‘EdgeColor‘, ‘none‘, ‘DisplayName‘, ‘95% 置信區(qū)間‘); xlabel(‘測(cè)試集樣本排序后‘); ylabel(‘產(chǎn)物收率‘); title(‘邏輯回歸預(yù)測(cè)值與置信區(qū)間‘); legend(‘Location‘, ‘best‘); grid on;置信區(qū)間圖能直觀展示模型預(yù)測(cè)的可靠程度。區(qū)間越窄說(shuō)明模型對(duì)該樣本的預(yù)測(cè)越有把握。這對(duì)于工藝優(yōu)化、風(fēng)險(xiǎn)決策等場(chǎng)景至關(guān)重要。5.3 常見陷阱與實(shí)戰(zhàn)心得在多次將邏輯回歸用于回歸預(yù)測(cè)的項(xiàng)目中我總結(jié)了以下幾個(gè)關(guān)鍵點(diǎn)數(shù)據(jù)范圍是生命線務(wù)必確保你的目標(biāo)變量Y在訓(xùn)練、驗(yàn)證、測(cè)試以及未來(lái)預(yù)測(cè)時(shí)都處于模型所學(xué)的范圍內(nèi)。如果新數(shù)據(jù)的Y可能超出歷史范圍模型的外推預(yù)測(cè)將極不可靠。邏輯回歸的Sigmoid函數(shù)在兩端會(huì)趨于平緩對(duì)極端值的預(yù)測(cè)會(huì)“飽和”。“偽”邏輯回歸誤用如果你的Y和X之間是明顯的線性關(guān)系只是因?yàn)閅有界而強(qiáng)行使用邏輯回歸可能會(huì)得到奇怪的S型曲線擬合效果反而不如簡(jiǎn)單的線性回歸配合對(duì)Y的適當(dāng)變換如logit變換。先畫圖觀察關(guān)系永遠(yuǎn)是第一步。評(píng)估指標(biāo)的選擇對(duì)于預(yù)測(cè)概率值的回歸任務(wù)除了MSE、RMSE、MAE、R2還可以考慮對(duì)數(shù)損失。但在Matlab的fitglm中連續(xù)Y的‘binomial‘模型計(jì)算出的對(duì)數(shù)損失可能不標(biāo)準(zhǔn)。更常見的做法是使用Brier分?jǐn)?shù)它是概率預(yù)測(cè)的均方誤差mean((Y_true - Y_pred_prob).^2)我們之前計(jì)算的MSE其實(shí)就是Brier分?jǐn)?shù)。類別不平衡的變體雖然我們是回歸問(wèn)題但如果你的Y值大量堆積在0或1附近例如成功率要么很高要么很低這類似于分類中的類別不平衡。此時(shí)模型可能會(huì)傾向于預(yù)測(cè)中間值??梢钥紤]對(duì)損失函數(shù)進(jìn)行加權(quán)或者在數(shù)據(jù)層面進(jìn)行采樣調(diào)整但需謹(jǐn)慎可能改變數(shù)據(jù)分布。與Beta回歸的對(duì)比對(duì)于嚴(yán)格在(0,1)區(qū)間的比例數(shù)據(jù)統(tǒng)計(jì)學(xué)上有一個(gè)更專門的模型叫Beta回歸它假設(shè)Y服從Beta分布。在Matlab中可以通過(guò)fitglm指定‘Distribution‘, ‘beta‘來(lái)實(shí)現(xiàn)需要較新版本支持。如果你的數(shù)據(jù)比例特性很強(qiáng)且可能具有異方差性方差隨均值變化可以嘗試比較Beta回歸和邏輯回歸的效果。邏輯回歸作為一個(gè)基礎(chǔ)而強(qiáng)大的模型將其拓展到回歸預(yù)測(cè)領(lǐng)域?yàn)榻鉀Q一大類有界輸出問(wèn)題提供了簡(jiǎn)潔優(yōu)雅的方案。在Matlab的加持下從探索、建模、診斷到部署整個(gè)過(guò)程可以非常高效。關(guān)鍵在于深刻理解其假設(shè)和局限并結(jié)合具體數(shù)據(jù)靈活運(yùn)用。本文還有配套的精品資源點(diǎn)擊獲取