.net網站開發(fā)框架注冊城鄉(xiāng)規(guī)劃師報考時間2023
鶴壁市浩天電氣有限公司
2026/01/24 10:45:56
.net網站開發(fā)框架,注冊城鄉(xiāng)規(guī)劃師報考時間2023,企業(yè)網站翻譯,網站子目錄安裝dedecms導致網頁布局混亂的解決方法引言在機器學習建模過程中#xff0c;我們常常會遇到這樣的困境#xff1a;單分類器在測試集上的準確率始終徘徊不前#xff0c;調參到極致也難以突破瓶頸#xff1b;或者模型在部分樣本上表現(xiàn)穩(wěn)定#xff0c;但對異常數(shù)據的魯棒性極差。如果你也有過類似的困擾#xff0…引言在機器學習建模過程中我們常常會遇到這樣的困境單分類器在測試集上的準確率始終徘徊不前調參到極致也難以突破瓶頸或者模型在部分樣本上表現(xiàn)穩(wěn)定但對異常數(shù)據的魯棒性極差。如果你也有過類似的困擾那今天要聊的技術或許能成為你的破局關鍵。分類器集成并非什么高深莫測的黑科技其核心思想簡單又精妙——“三個臭皮匠頂個諸葛亮”。通過將多個性能一般的基分類器組合起來形成一個強分類器從而實現(xiàn)比單個基分類器更優(yōu)的分類效果。今天這篇文章我們就從原理、經典算法、實戰(zhàn)代碼到調優(yōu)技巧全方位拆解分類器集成讓你既能懂原理又能上手用。一、為什么需要分類器集成先搞懂單分類器的“短板”在聊集成之前我們得先明白單分類器的局限性是天生的。具體來說主要有三個核心問題偏差與方差的矛盾簡單模型如邏輯回歸、決策樹深度較淺時往往偏差高、方差低容易出現(xiàn)“欠擬合”復雜模型如深度神經網絡、復雜決策樹則相反方差高、偏差低容易“過擬合”。單分類器很難同時兼顧低偏差和低方差。泛化能力不足單個模型對數(shù)據分布的敏感度較高一旦測試集與訓練集的分布有細微差異性能就可能大幅下降。比如用單一決策樹處理不平衡數(shù)據時很容易偏向多數(shù)類樣本。局部最優(yōu)陷阱模型訓練過程本質是尋找損失函數(shù)最小值的過程但單分類器很容易陷入局部最優(yōu)解無法觸及全局最優(yōu)。而分類器集成的核心價值就是通過組合來彌補這些短板通過選擇多樣化的基分類器降低整體模型的方差通過迭代優(yōu)化或加權組合降低偏差最終實現(xiàn)“112”的泛化能力提升。二、分類器集成的核心原理兩個關鍵要素并非隨便把幾個分類器堆在一起就能叫“集成”有效的集成必須滿足兩個核心條件缺一不可1. 基分類器的“多樣性”這是集成的靈魂。如果所有基分類器的判斷結果完全一致即高度相關那么集成后的結果和單個分類器沒有區(qū)別。只有當基分類器之間存在“互補性”——有的擅長識別正樣本有的擅長排除負樣本有的對噪聲不敏感集成才能發(fā)揮作用。實現(xiàn)多樣性的常見方式有三種數(shù)據層面對訓練集進行抽樣如Bagging的自助抽樣讓不同基分類器在不同的數(shù)據子集上訓練。模型層面選擇不同類型的基分類器如邏輯回歸SVM決策樹或同一類型但超參數(shù)不同的模型如不同深度的決策樹。特征層面對特征進行抽樣如隨機森林的特征隨機選擇讓不同基分類器關注不同的特征維度。2. 合理的“組合策略”有了多樣化的基分類器還需要一套規(guī)則將它們的預測結果組合起來。常見的組合策略分為「并行式」和「串行式」兩類分別對應不同的集成框架并行式組合所有基分類器獨立訓練組合時僅融合預測結果如投票、平均代表算法是Bagging。串行式組合基分類器按順序訓練后一個分類器會根據前一個分類器的錯誤進行優(yōu)化如加權代表算法是Boosting。三、三大經典集成算法從原理到適用場景了解了核心原理后我們來看工業(yè)界最常用的三大集成算法。這部分是重點建議結合實際場景理解適用范圍。1. Bagging并行集成的“穩(wěn)定派”核心思想“自助抽樣并行訓練簡單投票”。通過自助抽樣Bootstrap從原始訓練集中隨機抽取多個子集每個子集訓練一個基分類器最終通過投票分類任務或平均回歸任務得到結果。代表算法隨機森林Random Forest隨機森林在Bagging的基礎上增加了“特征隨機選擇”每個決策樹節(jié)點分裂時僅從隨機選擇的部分特征中挑選最優(yōu)分裂點。這進一步增強了基分類器的多樣性也避免了單棵決策樹過擬合的問題。優(yōu)勢并行訓練效率高可充分利用多核CPU對噪聲數(shù)據不敏感魯棒性強自帶特征重要性評估可用于特征選擇。適用場景數(shù)據量較大、存在噪聲、需要快速建模的場景如用戶行為分類、垃圾郵件識別。注意點對小樣本數(shù)據效果一般因為自助抽樣可能導致樣本代表性不足。2. Boosting串行集成的“優(yōu)化派”核心思想“迭代優(yōu)化加權投票”。先訓練一個簡單的基分類器然后根據其預測錯誤調整樣本權重錯分樣本權重提高正確樣本權重降低再訓練下一個基分類器重復此過程最終將所有基分類器加權組合性能好的分類器權重高。代表算法AdaBoost最基礎的Boosting算法通過樣本權重調整實現(xiàn)優(yōu)化結構簡單但對噪聲敏感。XGBoost/LightGBM/CatBoost工業(yè)界主流的梯度提升樹GBDT變種通過梯度下降優(yōu)化損失函數(shù)支持正則化、缺失值處理精度極高。優(yōu)勢精度高在 Kaggle 競賽中常年霸榜對特征工程要求較低可自動處理非線性關系。適用場景對精度要求高的場景如信用風險評估、房價預測回歸、疾病診斷。注意點串行訓練效率較低對噪聲數(shù)據和異常值敏感需要調參如學習率、樹深度控制過擬合。3. Stacking集成中的“終極玩家”核心思想“分層集成元分類器”。將多個基分類器的預測結果作為新的特征輸入到一個“元分類器”Meta-Classifier中由元分類器給出最終預測。相當于用一個更高級的模型來學習“如何組合基分類器”。結構分為兩層第一層基學習器訓練多個不同類型的基分類器如隨機森林XGBoostSVM得到各自的預測概率。第二層元學習器用基分類器的預測概率作為特征訓練一個簡單模型如邏輯回歸、輕量GBDT學習最優(yōu)組合方式。優(yōu)勢靈活性極高可融合不同類型模型的優(yōu)勢理論上能達到更高精度。適用場景Kaggle 等競賽的“沖榜”階段或對精度有極致要求的核心業(yè)務。注意點模型復雜度高容易過擬合需用交叉驗證避免訓練成本高不適合實時推理場景。四、實戰(zhàn)演練用Python實現(xiàn)三大集成算法光說不練假把式接下來我們用 sklearn 實現(xiàn)隨機森林Bagging、XGBoostBoosting和 Stacking基于葡萄酒數(shù)據集分類任務對比性能。環(huán)境準備先安裝必要的庫pip install sklearn xgboost pandas numpy1. 數(shù)據加載與預處理import pandas as pd import numpy as np from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report # 加載數(shù)據集葡萄酒分類3類13個特征 wine load_wine() X pd.DataFrame(wine.data, columnswine.feature_names) y pd.Series(wine.target, nametarget) # 劃分訓練集/測試集7:3 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) print(f訓練集規(guī)模{X_train.shape}測試集規(guī)模{X_test.shape})2. 實現(xiàn)三大集成算法并對比from sklearn.ensemble import RandomForestClassifier, StackingClassifier from xgboost import XGBClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC # 1. 隨機森林Bagging rf RandomForestClassifier( n_estimators100, # 基分類器數(shù)量 max_depth5, # 每棵樹最大深度 random_state42 ) rf.fit(X_train, y_train) rf_pred rf.predict(X_test) rf_acc accuracy_score(y_test, rf_pred) # 2. XGBoostBoosting xgb XGBClassifier( n_estimators100, learning_rate0.1, # 學習率控制每步權重更新幅度 max_depth3, random_state42, use_label_encoderFalse, eval_metricmlogloss # 多分類損失函數(shù) ) xgb.fit(X_train, y_train) xgb_pred xgb.predict(X_test) xgb_acc accuracy_score(y_test, rf_pred) # 3. Stacking基分類器隨機森林XGBoostSVM元分類器邏輯回歸 base_models [ (rf, RandomForestClassifier(n_estimators50, random_state42)), (xgb, XGBClassifier(n_estimators50, random_state42, use_label_encoderFalse, eval_metricmlogloss)), (svm, SVC(probabilityTrue, random_state42)) # SVM需開啟概率預測 ] stack StackingClassifier( estimatorsbase_models, final_estimatorLogisticRegression(random_state42) ) stack.fit(X_train, y_train) stack_pred stack.predict(X_test) stack_acc accuracy_score(y_test, stack_pred) # 輸出結果對比 print( 模型準確率對比 ) print(f隨機森林{rf_acc:.4f}) print(fXGBoost{xgb_acc:.4f}) print(fStacking{stack_acc:.4f}) print(
Stacking 分類報告 ) print(classification_report(y_test, stack_pred))3. 結果分析運行代碼后你會發(fā)現(xiàn)隨機森林和 XGBoost 準確率都在 95% 以上遠超單分類器如邏輯回歸約 90%Stacking 準確率可能略高于前兩者或持平但優(yōu)勢在復雜數(shù)據集上更明顯XGBoost 的訓練速度比隨機森林慢但精度更穩(wěn)定Stacking 訓練最慢但靈活性最高。五、集成調優(yōu)技巧避開這些“坑”性能再提升20%集成不是“堆模型”調優(yōu)技巧直接決定最終效果。分享幾個實戰(zhàn)中總結的關鍵技巧基分類器選擇“弱而多樣”優(yōu)于“強而相似”不要用多個復雜且高度相關的模型如多個XGBoost建議搭配“簡單模型復雜模型”如邏輯回歸XGBoostSVM多樣性更高??刂苹诸惼鲾?shù)量并非越多越好。n_estimators 增加到一定程度后精度會飽和反而增加訓練成本。一般建議 100-500 之間通過交叉驗證確定。防止過擬合的核心手段 Bagging減小單棵樹深度、增加特征抽樣比例Boosting降低學習率如 0.01-0.1、增加正則化項如 XGBoost 的 reg_alphaStacking用交叉驗證生成基分類器的預測結果避免數(shù)據泄露。權重調整技巧對 Boosting 類模型可根據基分類器在驗證集的性能動態(tài)調整權重而非默認的迭代權重。六、總結集成算法的選型指南最后用一張表總結三大算法的選型邏輯幫你快速決策算法類型核心優(yōu)勢訓練效率適用場景代表工具Bagging隨機森林魯棒性強、抗噪聲高并行快速建模、數(shù)據有噪聲sklearn、Spark MLlibBoostingXGBoost精度高、支持正則化中串行精度優(yōu)先、結構化數(shù)據XGBoost、LightGBMStacking融合多模型優(yōu)勢低多層訓練競賽沖榜、極致精度sklearn、自定義實現(xiàn)分類器集成的核心邏輯是通過“多樣性”和“組合策略”突破單模型的局限。在實際工作中建議從簡單的隨機森林或XGBoost入手再根據精度需求嘗試Stacking。記住沒有最好的算法只有最適合場景的算法。七、項目源代碼import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_curve, auc from sklearn.preprocessing import label_binarize from sklearn.ensemble import RandomForestClassifier, StackingClassifier from xgboost import XGBClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC import warnings warnings.filterwarnings(ignore) # 設置圖形樣式 plt.rcParams[figure.figsize] [12, 8] plt.rcParams[font.size] 12 sns.set_style(whitegrid) # 加載數(shù)據集葡萄酒分類3類13個特征 wine load_wine() X pd.DataFrame(wine.data, columnswine.feature_names) y pd.Series(wine.target, nametarget) target_names wine.target_names # 劃分訓練集/測試集7:3 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) print(f訓練集規(guī)模{X_train.shape}測試集規(guī)模{X_test.shape}) print(f類別分布 - 訓練集: {np.bincount(y_train)}測試集: {np.bincount(y_test)}) # 1. 隨機森林Bagging rf RandomForestClassifier( n_estimators100, max_depth5, random_state42 ) rf.fit(X_train, y_train) rf_pred rf.predict(X_test) rf_acc accuracy_score(y_test, rf_pred) # 2. XGBoostBoosting xgb XGBClassifier( n_estimators100, learning_rate0.1, max_depth3, random_state42, eval_metricmlogloss ) xgb.fit(X_train, y_train) xgb_pred xgb.predict(X_test) xgb_acc accuracy_score(y_test, xgb_pred) # 3. Stacking base_models [ (rf, RandomForestClassifier(n_estimators50, random_state42)), (xgb, XGBClassifier(n_estimators50, random_state42, eval_metricmlogloss)), (svm, SVC(probabilityTrue, random_state42)) ] stack StackingClassifier( estimatorsbase_models, final_estimatorLogisticRegression(random_state42, max_iter1000) ) stack.fit(X_train, y_train) stack_pred stack.predict(X_test) stack_acc accuracy_score(y_test, stack_pred) # 輸出結果對比 print(
* 40) print( 模型準確率對比 ) print( * 40) print(f隨機森林準確率{rf_acc:.4f}) print(fXGBoost準確率{xgb_acc:.4f}) print(fStacking準確率{stack_acc:.4f}) print(
* 40) print( Stacking 分類報告 ) print( * 40) print(classification_report(y_test, stack_pred, target_namestarget_names)) # 可視化部分 # 1. 創(chuàng)建綜合可視化圖表 fig, axes plt.subplots(2, 3, figsize(18, 12)) fig.suptitle(Wine Classification Model Performance Visualization, fontsize16, fontweightbold) # 1.1 準確率對比柱狀圖 ax1 axes[0, 0] models [Random Forest, XGBoost, Stacking] accuracies [rf_acc, xgb_acc, stack_acc] colors [#FF6B6B, #4ECDC4, #45B7D1] bars ax1.bar(models, accuracies, colorcolors, alpha0.8) ax1.set_title(Model Accuracy Comparison, fontsize14, fontweightbold) ax1.set_ylabel(Accuracy, fontsize12) ax1.set_ylim(0, 1.1) ax1.grid(True, alpha0.3) for bar, acc in zip(bars, accuracies): height bar.get_height() ax1.text(bar.get_x() bar.get_width() / 2., height 0.02, f{acc:.3f}, hacenter, vabottom, fontweightbold) # 1.2 訓練集特征分布箱線圖 ax2 axes[0, 1] # 選擇前6個特征進行可視化 selected_features X_train.columns[:6] data_to_plot [] for feature in selected_features: data_to_plot.append(X_train[feature].values) box ax2.boxplot(data_to_plot, patch_artistTrue, labelsselected_features) colors_box [#FF9999, #66B2FF, #99FF99, #FFCC99, #FF99CC, #99CCFF] for patch, color in zip(box[boxes], colors_box): patch.set_facecolor(color) patch.set_alpha(0.7) ax2.set_title(Feature Distribution (Training Set), fontsize14, fontweightbold) ax2.set_ylabel(Value, fontsize12) ax2.tick_params(axisx, rotation45) # 1.3 類別分布餅圖 ax3 axes[0, 2] class_counts np.bincount(y_train) colors_pie [#FF6B6B, #4ECDC4, #45B7D1] wedges, texts, autotexts ax3.pie(class_counts, labelstarget_names, colorscolors_pie, autopct%1.1f%%, startangle90, explode(0.05, 0.05, 0.05)) ax3.set_title(Class Distribution (Training Set), fontsize14, fontweightbold) for autotext in autotexts: autotext.set_color(white) autotext.set_fontweight(bold) # 1.4 隨機森林特征重要性 ax4 axes[1, 0] rf_importance pd.DataFrame({ feature: wine.feature_names, importance: rf.feature_importances_ }).sort_values(importance, ascendingTrue) bars_rf ax4.barh(rf_importance[feature], rf_importance[importance], color#FF6B6B, alpha0.7) ax4.set_title(Random Forest Feature Importance, fontsize14, fontweightbold) ax4.set_xlabel(Importance Score, fontsize12) # 1.5 XGBoost特征重要性 ax5 axes[1, 1] xgb_importance pd.DataFrame({ feature: wine.feature_names, importance: xgb.feature_importances_ }).sort_values(importance, ascendingTrue) bars_xgb ax5.barh(xgb_importance[feature], xgb_importance[importance], color#4ECDC4, alpha0.7) ax5.set_title(XGBoost Feature Importance, fontsize14, fontweightbold) ax5.set_xlabel(Importance Score, fontsize12) # 1.6 混淆矩陣Stacking模型 ax6 axes[1, 2] cm confusion_matrix(y_test, stack_pred) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabelstarget_names, yticklabelstarget_names, axax6) ax6.set_title(Stacking Confusion Matrix, fontsize14, fontweightbold) ax6.set_xlabel(Predicted Label, fontsize12) ax6.set_ylabel(True Label, fontsize12) plt.tight_layout() plt.savefig(model_performance_visualization.png, dpi300, bbox_inchestight) plt.show() # 2. 創(chuàng)建ROC曲線圖 fig2, ax_roc plt.subplots(figsize(10, 8)) # 將標簽二值化 y_test_bin label_binarize(y_test, classes[0, 1, 2]) n_classes y_test_bin.shape[1] # 為每個模型計算ROC曲線 models_info [ (Random Forest, rf, rf_pred, #FF6B6B), (XGBoost, xgb, xgb_pred, #4ECDC4), (Stacking, stack, stack_pred, #45B7D1) ] for name, model, pred, color in models_info: # 獲取預測概率 if hasattr(model, predict_proba): y_score model.predict_proba(X_test) else: y_score model.decision_function(X_test) # 計算微平均ROC曲線 fpr_micro, tpr_micro, _ roc_curve(y_test_bin.ravel(), y_score.ravel()) roc_auc_micro auc(fpr_micro, tpr_micro) # 繪制ROC曲線 ax_roc.plot(fpr_micro, tpr_micro, colorcolor, lw2, labelf{name} (AUC {roc_auc_micro:.3f})) # 繪制對角線 ax_roc.plot([0, 1], [0, 1], k--, lw1, alpha0.6) ax_roc.set_xlim([0.0, 1.0]) ax_roc.set_ylim([0.0, 1.05]) ax_roc.set_xlabel(False Positive Rate, fontsize12) ax_roc.set_ylabel(True Positive Rate, fontsize12) ax_roc.set_title(ROC Curves (Micro-average), fontsize14, fontweightbold) ax_roc.legend(loclower right) ax_roc.grid(True, alpha0.3) plt.tight_layout() plt.savefig(roc_curves.png, dpi300, bbox_inchestight) plt.show() # 3. 創(chuàng)建性能對比雷達圖 fig3 plt.figure(figsize(10, 8)) ax_radar fig3.add_subplot(111, projectionpolar) # 獲取分類指標 def get_metrics(y_true, y_pred): report classification_report(y_true, y_pred, output_dictTrue) return { precision: report[macro avg][precision], recall: report[macro avg][recall], f1: report[macro avg][f1-score], accuracy: report[accuracy] } # 收集每個模型的指標 rf_metrics get_metrics(y_test, rf_pred) xgb_metrics get_metrics(y_test, xgb_pred) stack_metrics get_metrics(y_test, stack_pred) # 準備雷達圖數(shù)據 categories [Accuracy, Precision, Recall, F1-Score] N len(categories) # 將數(shù)據轉為列表 def metrics_to_list(metrics): return [metrics[accuracy], metrics[precision], metrics[recall], metrics[f1]] rf_values metrics_to_list(rf_metrics) xgb_values metrics_to_list(xgb_metrics) stack_values metrics_to_list(stack_metrics) # 角度設置 angles np.linspace(0, 2 * np.pi, N, endpointFalse).tolist() angles angles[:1] # 閉合 rf_values rf_values[:1] xgb_values xgb_values[:1] stack_values stack_values[:1] # 繪制雷達圖 ax_radar.plot(angles, rf_values, o-, linewidth2, labelRandom Forest, color#FF6B6B) ax_radar.fill(angles, rf_values, alpha0.1, color#FF6B6B) ax_radar.plot(angles, xgb_values, o-, linewidth2, labelXGBoost, color#4ECDC4) ax_radar.fill(angles, xgb_values, alpha0.1, color#4ECDC4) ax_radar.plot(angles, stack_values, o-, linewidth2, labelStacking, color#45B7D1) ax_radar.fill(angles, stack_values, alpha0.1, color#45B7D1) # 設置標簽 ax_radar.set_xticks(angles[:-1]) ax_radar.set_xticklabels(categories, fontsize12) ax_radar.set_ylim(0, 1.1) ax_radar.set_title(Model Performance Radar Chart, fontsize14, fontweightbold, pad20) ax_radar.legend(locupper right, bbox_to_anchor(1.3, 1.0)) ax_radar.grid(True) plt.tight_layout() plt.savefig(performance_radar_chart.png, dpi300, bbox_inchestight) plt.show() # 4. 特征相關性熱圖 fig4, ax_corr plt.subplots(figsize(12, 10)) correlation_matrix X.corr() mask np.triu(np.ones_like(correlation_matrix, dtypebool)) sns.heatmap(correlation_matrix, maskmask, annotTrue, fmt.2f, cmapcoolwarm, center0, squareTrue, linewidths0.5, cbar_kws{shrink: 0.8}, axax_corr) ax_corr.set_title(Feature Correlation Heatmap, fontsize14, fontweightbold) plt.tight_layout() plt.savefig(feature_correlation.png, dpi300, bbox_inchestight) plt.show() print(
* 50) print(Visualization Summary:) print( * 50) print(1. model_performance_visualization.png - Main performance dashboard) print(2. roc_curves.png - ROC curves for all models) print(3. performance_radar_chart.png - Performance comparison radar chart) print(4. feature_correlation.png - Feature correlation heatmap) print(
All charts have been saved to the current directory!)1.model_performance_visualization.png模型性能綜合可視化這張綜合圖表包含了6個子圖全面展示了模型的各個方面左上角模型準確率對比柱狀圖直觀顯示三個模型隨機森林、XGBoost、Stacking在測試集上的準確率柱狀圖高度代表準確率數(shù)值右上角訓練集特征分布箱線圖展示了前6個特征的數(shù)值分布情況箱體顯示數(shù)據的四分位數(shù)須線顯示數(shù)據范圍異常值以點顯示中上類別分布餅圖顯示訓練集中三個葡萄酒類別的比例分布幫助了解數(shù)據是否均衡左下角隨機森林特征重要性條形圖展示了隨機森林模型認為最重要的特征特征重要性越高表示該特征對分類貢獻越大中下XGBoost特征重要性條形圖展示了XGBoost模型的特征重要性排序可以與隨機森林的結果進行對比右下角Stacking模型混淆矩陣熱力圖顯示Stacking模型的預測結果對角線上的數(shù)值表示正確分類的樣本數(shù)非對角線表示誤分類情況2. roc_curves.pngROC曲線圖ROC曲線圖是評估分類模型性能的重要工具圖中展示了三個模型隨機森林、XGBoost、Stacking的ROC曲線橫軸假正率False Positive Rate即被錯誤分類為正類的負類樣本比例縱軸真正率True Positive Rate即被正確分類的正類樣本比例對角線隨機分類器的性能基準AUC0.5每條曲線下的面積AUC值顯示在標簽中AUC值越接近1表示模型性能越好微平均在多分類問題中我們將所有類別的預測合并計算一個整體的ROC曲線3. performance_radar_chart.png性能雷達圖雷達圖以多邊形形式對比三個模型在四個關鍵指標上的表現(xiàn)四個維度準確率所有樣本中被正確分類的比例精確率預測為正類的樣本中實際為正類的比例召回率實際為正類的樣本中被正確預測的比例F1分數(shù)精確率和召回率的調和平均數(shù)綜合衡量模型性能越靠近外圈表示性能越好最大值為1.0多邊形面積越大表示模型綜合性能越好不同顏色代表不同模型可以直觀比較哪個模型在各方面都表現(xiàn)更優(yōu)4. feature_correlation.png特征相關性熱圖這張熱圖展示了葡萄酒數(shù)據集中13個特征之間的相關性顏色深淺紅色表示正相關藍色表示負相關白色表示無相關數(shù)值范圍-1到1絕對值越大表示相關性越強對角線特征與自身的相關性為1最深紅色應用價值幫助識別高度相關的特征可能包含冗余信息指導特征選擇避免多重共線性問題理解數(shù)據集中特征之間的關系結構