python:如何調節機器學習算法的魯棒性,以支持向量機SVM為例,讓伙伴們看的更明白

魯棒性(Robustness)指模型在噪聲數據或異常值干擾下保持性能穩定的能力。想詳細了解的可參考本人之前的博文

python機器學習:評價智能學習算法性能與效果的常見術語:不收斂、過擬合、欠擬合、泛化能力、魯棒性一句話、一張圖給您說明白,機器學習算法搞的明明白白的-CSDN博客文章瀏覽閱讀1.2k次,點贊43次,收藏13次。機器學習中的關鍵概念解析,理解這些概念有助于優化算法設計和應用效果:不收斂指算法無法找到最優解,表現為損失函數持續波動或發散;欠擬合是模型過于簡單,未能捕獲數據規律;過擬合則是模型過度記憶訓練數據,泛化能力差。泛化能力衡量模型在新數據上的表現,而魯棒性則評估模型對數據干擾的抵抗能力。提高模型性能需針對不同問題采取相應策略:調整學習率、優化算法、正則化、數據增強等方法可改善不收斂和過擬合問題;增加訓練數據、使用交叉驗證能提升泛化能力;對抗訓練和魯棒損失函數則有助于增強魯棒性。 https://blog.csdn.net/hlnzxl/article/details/149747294?spm=1001.2014.3001.5501

目錄

一、文章內容介紹

二、控制魯棒性的常用方法及指標

三、python程序設計?

四、應用建議


一、文章內容介紹

本文以支持向量機SVM為例,詳細介紹如何調節機器學習算法的魯棒性。通過一個簡單的例子展示SVM在不同噪聲水平下的表現,并調節正則化參數C來增強魯棒性。

二、控制魯棒性的常用方法及指標

常用方法:??

1. 數據預處理:處理異常值、缺失值,數據標準化/歸一化。

?2. 正則化:如SVM中的C參數,控制對誤分類的懲罰程度,C越小,容錯性越強,魯棒性越好(但可能欠擬合)。

?3. 使用對異常值不敏感的損失函數:例如SVM本身使用Hinge Loss,對異常值有一定魯棒性。

4. 核函數選擇:線性核可能比復雜核(如RBF)對噪聲更魯棒。

5.特征工程:選擇相關性強、抗干擾的特征。

?常用指標:

1.標準差:多次運行結果的標準差。

2.噪聲測試準確率:添加噪聲后的性能保持度

3.特征擾動敏感度:特征變化時的性能波動

重點,以下是提升魯棒性的黃金法則

三、python程序設計?

程序設計流程:

1. 生成帶有不同噪聲水平的數據集(使用make_blobs生成,并手動添加噪聲點)。

2. 創建不同C值的SVM模型。

3. 在訓練集上訓練,并在測試集上評估。

4. 可視化決策邊界,觀察模型對噪聲的敏感程度。

程序源代碼如下,每條語句均有詳細的注釋,方便伙伴們學習。運行效果在程序后面。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #解決中文不顯示問題
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 1. 數據準備:加載乳腺癌數據集(增加更多噪聲特征)
data = datasets.load_breast_cancer()
X, y = data.data, data.target# 添加更多隨機噪聲特征(從5個增加到15個)
np.random.seed(42)
noise_features = np.random.randn(X.shape[0], 15)  # 增加到15個噪聲特征
X_noisy = np.hstack([X, noise_features])  # 合并原始特征和噪聲# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_noisy, y, test_size=0.3, random_state=42
)# 標準化數據
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 2. 創建不同配置的SVM模型(調整參數以增強對比)
models = {# 高C值模型(低正則化)+ RBF核:對噪聲非常敏感"噪聲敏感_SVM": svm.SVC(C=500, kernel='rbf', gamma=0.5),# 低C值模型(高正則化)+ 線性核:增強魯棒性"強魯棒性_SVM": svm.SVC(C=0.01, kernel='linear'),# 默認參數模型(基準)"默認_SVM": svm.SVC(kernel='rbf', gamma='scale', C=1.0)
}# 3. 評估模型魯棒性(增加噪聲強度)
results = {}
for name, model in models.items():# 標準準確率評估model.fit(X_train_scaled, y_train)test_acc = accuracy_score(y_test, model.predict(X_test_scaled))# 交叉驗證(評估穩定性)cv_scores = cross_val_score(model, X_train_scaled, y_train, cv=10)  # 增加交叉驗證折數cv_mean = np.mean(cv_scores)cv_std = np.std(cv_scores)# 噪聲魯棒性測試:向測試集添加更強的噪聲X_test_noisy = X_test_scaled + np.random.normal(0, 1.0, X_test_scaled.shape)  # 標準差從0.5增加到1.0noisy_acc = accuracy_score(y_test, model.predict(X_test_noisy))# 存儲結果results[name] = {'test_acc': test_acc,'cv_mean': cv_mean,'cv_std': cv_std,'noisy_acc': noisy_acc,'noisy_drop': test_acc - noisy_acc}# 4. 打印魯棒性評估報告
print("="*60)
print("{:<15} {:<10} {:<10} {:<10} {:<10} {:<10}".format("模型", "測試精度", "CV均值", "CV標準差", "噪聲精度", "精度下降"))
print("-"*60)for name, res in results.items():print("{:<15} {:<10.4f} {:<10.4f} {:<10.4f} {:<10.4f} {:<10.4f}".format(name, res['test_acc'],res['cv_mean'],res['cv_std'],res['noisy_acc'],res['noisy_drop']))# 5. 可視化魯棒性對比(增強效果)
labels = list(results.keys())
test_accs = [res['test_acc'] for res in results.values()]
noisy_accs = [res['noisy_acc'] for res in results.values()]
drops = [res['noisy_drop'] for res in results.values()]x = np.arange(len(labels))
width = 0.25# 創建更清晰的對比圖
plt.figure(figsize=(12, 8))# 主圖:清潔數據與噪聲數據精度對比
ax1 = plt.subplot(2, 1, 1)
rects1 = ax1.bar(x - width/2, test_accs, width, color='skyblue', label='清潔數據')
rects2 = ax1.bar(x + width/2, noisy_accs, width, color='salmon', label='噪聲數據')# 添加數據標簽
for rect in rects1 + rects2:height = rect.get_height()ax1.annotate(f'{height:.3f}',xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3),  # 垂直偏移textcoords="offset points",ha='center', va='bottom')ax1.set_ylabel('精度')
ax1.set_title('SVM模型魯棒性對比 (噪聲強度:1.0)', fontsize=14)
ax1.set_xticks(x)
ax1.set_xticklabels(labels)
ax1.legend()
ax1.grid(True, linestyle='--', alpha=0.3)
ax1.set_ylim(0.7, 1.0)  # 限制Y軸范圍使差異更明顯# 子圖:精度下降對比
ax2 = plt.subplot(2, 1, 2)
rects3 = ax2.bar(x, drops, width, color='orange')# 添加數據標簽
for rect in rects3:height = rect.get_height()ax2.annotate(f'{height:.3f}',xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3),  # 垂直偏移textcoords="offset points",ha='center', va='bottom')ax2.set_ylabel('精度下降')
ax2.set_title('噪聲導致的精度下降', fontsize=14)
ax2.set_xticks(x)
ax2.set_xticklabels(labels)
ax2.grid(True, linestyle='--', alpha=0.3)plt.tight_layout()
plt.show()

魯棒性關鍵指標分析:

1.噪聲準確率下降 (Drop%)

敏感模型:12.9%下降 → 魯棒性差

魯棒模型:僅3.5%下降 → 抗干擾能力強

2.交叉驗證標準差 (CV Std)

敏感模型:0.023 → 穩定性較差

魯棒模型:0.015 → 結果更穩定

3.噪聲測試準確率

魯棒模型在噪聲數據上保持88.9%準確率

敏感模型在噪聲數據上暴跌至80.1%

四、應用建議

在醫療診斷、金融風控等高風險領域,寧可犧牲少量精度也要確保魯棒性。優先選擇線性模型,將C值設置在0.1-1.0范圍,并使用特征選擇降低維度噪聲影響。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91982.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

號源加鎖升級思路(解決高并發問題)

原先邏輯鏈接&#xff1a;號源預約加鎖思路_java 預約 接口加鎖-CSDN博客 一、進行治療項目和號源數據緩存 1.新建一個定時任務&#xff0c;主要在凌晨時緩存治療項目和號源數據 1.1.類中使用redission獲取鎖&#xff08;用于分布式系統獲取數據&#xff0c;保證原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能體與外部工具的連接

> 一條標準化的數據通道,讓AI從“對話專家”蛻變為“行動專家”,背后是一場由協議驅動的工具連接革命。 2024年11月,Anthropic公司開源了**Model Context Protocol(MCP)**。在短短9個月內,這項技術徹底改變了AI與外部世界的交互方式。截至2025年8月,MCP服務數量**從…

啟用“安全登錄”組合鍵(Ctrl+Alt+Delete)解鎖

文章目錄背景目標功能操作步驟效果背景 在日常工作中&#xff0c;我們有時需要讓電腦長期開機運行&#xff08;如處理長任務、作為服務器等&#xff09;。然而&#xff0c;這其中存在一個潛在風險&#xff1a;當電腦處于鎖屏或登錄界面時&#xff0c;如果有人無意中觸碰鍵盤比…

【08】C++實戰篇——C++ 生成動態庫.dll 及 C++調用DLL,及實際項目中的使用技巧

文章目錄一、創建動態庫dll (方法一)1 生成C 動態庫dll1.1 創建項目MyDLL1.2 編寫.h 和 .cpp文件1.3 設置 及 生成 DLL2 調用 C 動態庫dll2.1 創建C 空項目DLLtest2.2 動態庫配置 及代碼調用測試3 實際項目中的使用技巧3.1 設置dll輸出路徑3.2 設置頭文件引入路徑3.3 改進后 測…

kettle插件-kettle http client plus插件,輕松解決https接口無法調用文件流下載問題

場景&#xff1a;小伙伴在使用kettle調用https接口過程中無法正常調用&#xff0c;程序出錯問題&#xff0c;今天演示下用自研插件輕松解決這個問題。1、使用openssl 生成自簽名證書openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、使用…

C#中的除法

在C#中&#xff0c;除法操作可以通過使用 / 運算符執行。這個運算符可以進行整數除法或浮點除法&#xff0c;這取決于操作數的類型。整數除法當兩個整數相除時&#xff0c;結果將自動向下取整到最接近的整數。這意味著結果是一個整數&#xff0c;而不是小數。int a 10; int b …

PPT文件密碼解密工具推薦:Tenorshare PassFab for PPT綠色免安裝一鍵解除密碼限制,附詳細教程和下載地址

前段時間&#xff0c;我幫朋友做一個商業演示的 PPT&#xff0c;為了防止文件被誤操作或者內容泄露&#xff0c;我給 PPT 設置了密碼。結果等朋友來拿文件的時候&#xff0c;我居然把密碼忘得干干凈凈&#xff0c;這下可把我倆都急壞了。朋友那邊馬上就要用這個 PPT 去參加重要…

【數據結構】二叉樹接口實現指南:遞歸方法的高效運用 (附經典算法OJ)

文章目錄 1、前置說明 1、定義二叉樹結點結構 2、創建新節點 3、手動創建二叉樹 2、二叉樹的遍歷 1、前序&#xff0c;中序和后序遍歷 1.1、二叉樹前序遍歷 1.2、二叉樹中序遍歷 1.3、二叉樹后序遍歷 2、二叉樹層序遍歷 3、二叉樹的基礎操作 1、二叉樹節點總數 2、…

自動駕駛控制算法——LQR控制算法

自動駕駛控制算法——LQR控制算法 文章目錄自動駕駛控制算法——LQR控制算法**一、LQR 是什么&#xff1f;**二、LQR 原理2.1 線性狀態空間模型 (State–Space Model)2.2 二次型性能指標 JJJ2.3 代數黎卡提方程 (ARE)2.4 特點總結2.5 一句話總結 LQR 原理&#xff1a;2.5.1 場景…

Jotai:React輕量級原子化狀態管理,告別重渲染困擾

簡介 Jotai 是一個為 React 提供的原子化狀態管理庫&#xff0c;采用自下而上的方法來進行狀態管理。Jotai 受 Recoil 啟發&#xff0c;通過組合原子來構建狀態&#xff0c;并且渲染基于原子依賴性進行優化。這解決了 React 上下文的額外重新渲染問題&#xff0c;并消除了對 m…

C語言數據結構(7)貪吃蛇項目2.貪吃蛇項目實現

8. 核心邏輯實現分析 8.1 游戲主邏輯 程序開始就設置程序支持本地模式&#xff0c;然后進入程序的主邏輯。 主邏輯分為3個過程&#xff1a; ? 游戲開始&#xff08;GameStart&#xff09;完成游戲的初始化。 ? 游戲運行&#xff08;GameRun&#xff09;完成游戲運行邏輯的…

知識蒸餾 - 最小化KL散度與最小化交叉熵是完全等價的

知識蒸餾 - 最小化KL散度與最小化交叉熵是完全等價的 flyfish KL散度與交叉熵的數學關系 對于兩個概率分布 PPP&#xff08;真實分布&#xff09;和 QQQ&#xff08;模型預測分布&#xff09;&#xff0c;KL散度的定義是&#xff1a; DKL(P∥Q)∑xP(x)log?(P(x)Q(x)) D_{KL}(P…

設計心得——網絡包的處理

一、介紹 在程序的開發中&#xff0c;網絡開發是一個重要的應用場景。畢竟這些年IT行業之所以火&#xff0c;主要還是互聯網&#xff08;移動互聯網&#xff09;帶來的。網絡開發&#xff0c;有各種平臺、框架以及系統和庫提供的API&#xff0c;如果說網絡開發是一個特別復雜和…

sqli-labs通關筆記-第30關GET字符注入(WAF繞過 雙引號閉合 手工注入+腳本注入兩種方法)

目錄 一、源碼分析 1、index.php代碼審計 2、login.php代碼審計 3、java_implimentation函數 4、whitelist函數 5、SQL安全性分析 二、滲透實戰 1、進入靶場 2、WAF探測 &#xff08;1&#xff09;觸發WAF &#xff08;2&#xff09;繞過WAF 3、手工注入 &#xf…

【openlayers框架學習】九:openlayers中的交互類(select和draw)

文章目錄openlayers進階28 openlayers中的事件29 openlayers中select交互類的使用30 openlayers中select常見的配置選項31 openlayers中繪制交互類&#xff08;Draw&#xff09;openlayers進階 28 openlayers中的事件 常用進行事件交互的對象&#xff1a;map\view\source29 o…

Java企業級應用性能優化實戰

在企業級Java應用開發中,性能優化是確保系統穩定運行的關鍵因素。本文將從多個維度深入分析Java應用性能瓶頸,并提供實戰優化方案。 ?? 性能優化核心領域 1. 對象操作性能優化 在企業應用中,對象拷貝是一個高頻操作,特別是在分層架構中的DO、DTO、VO轉換。選擇合適的拷…

LLM Prompt與開源模型資源(3)如何寫一個好的 Prompt

學習材料&#xff1a;https://www.hiascend.com/developer/courses/detail/1935520434893606913 &#xff08;3.5&#xff09;學習時長&#xff1a; 預計 60 分鐘學習目的&#xff1a; 了解提示工程的定義與作用熟悉提示工程的關鍵技術相關概念掌握基于昇騰適配的大模型提示工程…

日志管理工具 ——ELK Stack

一、ELK Stack 概述1.1 核心組件ELK Stack&#xff08;現更名為 Elastic Stack&#xff09;是一套開源的日志收集、存儲、分析和可視化平臺&#xff0c;由三個核心組件構成&#xff1a;Elasticsearch&#xff1a;分布式搜索引擎&#xff0c;負責日志數據的存儲、索引和快速查詢…

SpringAI:AI工程應用框架新選擇

Spring AI 是一個用于 AI 工程的應用框架 Spring AI 是一個用于 AI 工程的應用框架。其目標是將可移植性和模塊化設計等 Spring 生態系統設計原則應用于 AI 領域,并推廣使用 POJO 作為應用程序的構建塊到 AI 領域。 Spring AI 的核心是解決 AI 集成的基本挑戰:將企業數據和…

Kettle 開源ETL數據遷移工具從入門到實戰

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于數據抽取、轉換和加載的軟件工具&#xff0c;用于支持數據倉庫和數據集成過程。Kettle作為傳統的ETL工具是純 java 開發的開源的 ETL工具&#xff0c;用于數據庫間的數據遷移 。可以在 Linux、windows、unix 中運…