基于python的機器學習(八)—— 評估算法(一)

目錄

一、機器學習評估的基本概念

1.1?評估的定義與目標

1.2?常見評估指標

1.3?訓練集、驗證集與測試集的劃分

二、分離數據集

2.1 分離訓練數據集和評估數據集?

2.2 k折交叉驗證分離?

2.3 棄一交叉驗證分離?

2.4 重復隨機評估和訓練數據集分離

三、交叉驗證技術

3.1 K折交叉驗證的原理與實現

3.2 留一法交叉驗證

3.2.1 留一法交叉驗證的優缺點

3.3 分層交叉驗證


一、機器學習評估的基本概念

機器學習評估是指通過一系列指標和方法來衡量模型在特定任務上的表現。評估的目的是確保模型不僅在訓練數據上表現良好,還能在未見過的數據上保持穩定的性能。

1.1?評估的定義與目標

評估是指通過系統化的方法和指標對模型性能進行量化分析,旨在判斷模型在特定任務中的表現是否符合預期。其核心目標包括驗證模型的泛化能力(即對未見數據的預測準確性)、識別過擬合或欠擬合問題、比較不同算法的優劣,并為模型優化提供依據。

1.2?常見評估指標

常用的評估指標包括:準確率、精確率、召回率、F1分數、ROC曲線和AUC值等;

  • 準確率(Accuracy):模型預測正確的樣本占總樣本的比例。
from sklearn.metrics import accuracy_scorey_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy: {accuracy}")

?

  • 精確率(Precision):模型預測為正類的樣本中,實際為正類的比例。
from sklearn.metrics import precision_scorey_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
precision = precision_score(y_true, y_pred)
print(f"Precision: {precision}")

?

  • 召回率(Recall):實際為正類的樣本中,模型預測為正類的比例。
from sklearn.metrics import recall_scorey_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
recall = recall_score(y_true, y_pred)
print(f"Recall: {recall}")
  • F1分數(F1 Score):精確率和召回率的調和平均數,用于平衡兩者。
from sklearn.metrics import f1_scorey_true = [0, 1, 1, 0, 1]
y_pred = [0, 1, 0, 0, 1]
f1 = f1_score(y_true, y_pred)
print(f"F1 Score: {f1}")
  • ROC曲線(Receiver Operating Characteristic Curve):通過不同閾值下的真正類率和假正類率繪制的曲線。
  • AUC值(Area Under Curve):ROC曲線下的面積,用于衡量分類器的整體性能。

1.3?訓練集、驗證集與測試集的劃分

點擊鏈接跳轉至之前的機器學習的基本知識篇,有詳細介紹訓練集、驗證集與測試集的劃分

這里就不做贅述了

https://love-xin.blog.csdn.net/article/details/143162589?spm=1011.2415.3001.5331https://love-xin.blog.csdn.net/article/details/143162589?spm=1011.2415.3001.5331

二、分離數據集

常用的分離數據集方法有:分離訓練數據集和評估數據集、k折交叉驗證分離、棄一交叉驗證分離、重復隨機評估和訓練數據集分離。

2.1 分離訓練數據集和評估數據集?

將數據集劃分為訓練集和評估集是最基礎的分離方法。通常采用70%-30%80%-20%的比例分配。訓練集用于模型訓練,評估集用于驗證模型性能。

這種方法的優勢在于簡單直接,適用于大規模數據集。但需要注意數據分布的均衡性,避免因隨機劃分導致評估偏差。

使用scikit-learn實現分離訓練數據集和評估數據集

from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression# 導入數據
filename = 'Sklearn\pima_data.csv'        #(注意自己數據集的路徑)
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 將數據分為輸入數據和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
test_size = 0.33
seed = 4
X_train, X_test, Y_traing, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression(max_iter=3000)
model.fit(X_train, Y_traing)
result = model.score(X_test, Y_test)
print("算法評估結果:%.3f%%" % (result * 100))

執行結果為:80.315%

2.2 k折交叉驗證分離?

k折交叉驗證將數據集分為k個大小相似的子集。每次使用k-1個子集作為訓練集,剩余1個子集作為驗證集,重復k次。最終性能取k次驗證的平均值。這種方法充分利用數據,適合中小規模數據集。典型k值為5或10,需注意k值過大會增加計算成本。

使用scikit-learn實現k折交叉驗證:

from pandas import read_csv
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold# 導入數據
filename = 'Sklearn\pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 將數據分為輸入數據和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
n_splits=10
seed=4
kfold=KFold(n_splits=n_splits,random_state=seed,shuffle=True)
model=LogisticRegression(max_iter=3000)
result=cross_val_score(model, X,Y,cv=kfold)
print("結果:%.3f%% (%.3f%%)"%(result.mean()*100, result.std()*100))

執行結果為:77.729% (4.617%)

2.3 棄一交叉驗證分離?

棄一交叉驗證是k折交叉驗證的特例,k等于樣本數量。每個樣本單獨作為驗證集,其余樣本用于訓練。這種方法提供無偏估計,但計算復雜度高,僅適用于極小樣本量場景。需注意樣本代表性,避免異常值影響整體評估。

使用scikit-learn實現棄一交叉驗證???????:

from pandas import read_csv
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import LeaveOneOut# 導入數據
filename = 'Sklearn\pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 將數據分為輸入數據和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
loocv = LeaveOneOut()
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model, X, Y, cv=loocv)
print("算法評估結果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

執行結果為:77.604% (41.689%)

2.4 重復隨機評估和訓練數據集分離

另外一種對K折交叉驗證的用法是隨機分離數據成訓練數據集和評估數據集,但是重復這個過程多次,就如同交叉驗證分離。

下面的例子就是將數據按照67%/33%分離,重復這個過程10次:

from pandas import read_csv
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import ShuffleSplit# 導入數據
filename = 'Sklearn\pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)# 將數據分為輸入數據和輸出結果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
n_splits = 10
test_size = 0.33
seed = 4
kfold = ShuffleSplit(n_splits=n_splits, test_size=test_size, random_state=seed)
model = LogisticRegression(max_iter=3000)
result = cross_val_score(model, X, Y, cv=kfold)
print("結果:%.3f%% (%.3f%%)" % (result.mean() * 100, result.std() * 100))

執行結果為:75.945% (2.626%)

三、交叉驗證技術

3.1 K折交叉驗證的原理與實現

K折交叉驗證(K-Fold Cross Validation)是一種評估機器學習模型性能的統計方法,通過將數據集劃分為K個子集(“折”),依次使用其中K-1個子集作為訓練數據,剩余1個子集作為驗證數據,重復K次并計算平均性能指標。

使用scikit-learn實現K折交叉驗證:

import numpy as np
from sklearn.model_selection import KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score# 加載數據
data = load_iris()
X, y = data.data, data.target# 初始化模型和K折劃分器
model = RandomForestClassifier()
kf = KFold(n_splits=5, shuffle=True, random_state=42)# 存儲每輪得分
scores = []for train_index, val_index in kf.split(X):X_train, X_val = X[train_index], X[val_index]y_train, y_val = y[train_index], y[val_index]model.fit(X_train, y_train)y_pred = model.predict(X_val)scores.append(accuracy_score(y_val, y_pred))# 輸出平均準確率
print(f"Mean Accuracy: {np.mean(scores):.4f} (±{np.std(scores):.4f})")

執行結果為:Mean Accuracy: 0.9600 (±0.0249)

3.2 留一法交叉驗證

留一法交叉驗證(Leave-One-Out Cross-Validation, LOOCV)是一種特殊的交叉驗證方法,適用于小樣本數據集。其核心思想是每次從數據集中留出一個樣本作為測試集,其余樣本作為訓練集,重復這一過程直到所有樣本都被作為測試集一次。

3.2.1 留一法交叉驗證的優缺點

優點:

  • 無偏估計:由于每次訓練集幾乎包含所有樣本(僅少一個),模型的評估結果更接近真實性能;
  • 適用小樣本:特別適合樣本量極少的情況(如N<100)。

缺點:

  • 計算成本高:需要訓練模型N次,對于大數據集(N較大)時效率極低;
  • 方差較高:每次訓練集僅相差一個樣本,可能導致評估結果波動較大。

使用Python和scikit-learn實現留一法交叉驗證的示例:

from sklearn.model_selection import LeaveOneOut, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_irisdata = load_iris()              # 加載數據集
X, y = data.data, data.targetmodel = LogisticRegression(max_iter=200)        # 初始化模型
loo = LeaveOneOut()                             # 初始化留一法交叉驗證
scores = cross_val_score(model, X, y, cv=loo, scoring='accuracy')       # 計算交叉驗證得分
print(f"Mean Accuracy: {scores.mean():.4f}")

執行結果為:Mean Accuracy: 0.9667

3.3 分層交叉驗證

分層交叉驗證(Stratified Cross-Validation)是一種在交叉驗證過程中保持數據集中各類別比例一致的技術。它特別適用于分類問題,尤其是當數據集中的類別分布不均衡時。通過分層交叉驗證,可以確保每一折的訓練集和驗證集中各類別的比例與原始數據集一致,從而提高模型評估的準確性。

使用scikit-learn庫中的StratifiedKFold類來實現分層交叉驗證:

from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 加載數據集
data = load_iris()
X = data.data
y = data.target# 初始化分層交叉驗證
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)# 初始化模型
model = LogisticRegression(max_iter=200)# 進行交叉驗證
accuracies = []
for train_index, test_index in skf.split(X, y):X_train, X_test = X[train_index], X[test_index]y_train, y_test = y[train_index], y[test_index]model.fit(X_train, y_train)y_pred = model.predict(X_test)accuracies.append(accuracy_score(y_test, y_pred))# 輸出平均準確率
print(f"平均準確率: {sum(accuracies) / len(accuracies):.4f}")

執行結果為:0.9667

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

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

相關文章

Win11 系統登入時綁定微軟郵箱導致用戶名欠缺

Win11 系統登入時綁定微軟郵箱導致用戶名欠缺 解決思路 -> 解綁當前微軟郵箱和用戶名 -> 斷網離線建立本地賬戶 -> 設置本地賬戶為Admin權限 -> 注銷當前賬戶&#xff0c;登入新建的用戶 -> 聯網綁定微軟郵箱 -> 刪除舊的用戶命令步驟 管理員權限打開…

Mac系統-最方便的一鍵環境部署軟件ServBay(支持php,java,python,node,go,mysql等)沒有之一,已親自使用!

自從換成Mac電腦以后&#xff0c;做開發有時候要部署各種環境&#xff0c;如php&#xff0c;mysql&#xff0c;nginx&#xff0c;pgsql&#xff0c;java&#xff0c;node&#xff0c;python&#xff0c;go時&#xff0c;嘗試過原生環境部署&#xff0c;各種第三方軟件部署&…

Flink中Kafka連接器的基本應用

文章目錄 前言Kafka連接器基礎案例演示前置說明和環境準備步驟Kafka連接器基本配置關聯數據源映射轉換案例效果演示基于Kafka連接器同步數據到MySQL案例說明前置準備Kafka連接器消費位點調整映射轉換與數據投遞MysqlSlink持久化收集器數據最終效果演示小結參考前言 本文將基于…

Leetcode 刷題記錄 11 —— 二叉樹第二彈

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言。 01 二叉樹的層序遍歷 /*** Definition…

【R語言科研繪圖】

R語言在繪制SCI期刊圖像時具有顯著優勢&#xff0c;以下從功能、靈活性和學術適配性三個方面分析其適用性&#xff1a; 數據可視化庫豐富 R語言擁有ggplot2、lattice、ggpubr等專業繪圖包&#xff0c;支持生成符合SCI期刊要求的高分辨率圖像&#xff08;如TIFF/PDF格式&#…

【Node.js】Web開發框架

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js Web框架概述1.1 Web框架的作用1.2 Node.js主要Web框架生態1.3 框架選擇考慮因素 2. Express.js2.1 Express.js概述2.2 基本用法2.2.1 安裝Express2.2.2 創建基本服務器 2.3 路由2.4 中間件2.5 請求…

PDF 轉 JPG 圖片小工具:CodeBuddy 助力解決轉換痛點

本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 在數字化辦公與內容創作的浪潮中&#xff0c;將 PDF 文件轉換為 JPG 圖片格式的需求日益頻繁。無論是學術文獻中的圖表提取&#xff0c;還是宣傳資料的視覺化呈現&am…

Linux 文件系統層次結構

Linux 的文件系統遵循 Filesystem Hierarchy Standard (FHS) 標準&#xff0c;其目錄結構是層次化的&#xff0c;每個目錄都有明確的用途。以下是 Linux 中部分目錄的作用解析&#xff1a; 1. 根目錄 / 作用&#xff1a;根目錄是整個文件系統的頂層目錄&#xff0c;所有其他目…

密碼學標準(Cryptography Standards)介紹

密碼學標準(Cryptography Standards)是為確保信息安全傳輸、存儲和處理而制定的一系列技術規范和協議,廣泛應用于通信、金融、互聯網等領域。以下從分類、主流標準、應用場景和發展趨勢四個方面進行詳細介紹: 一、密碼學標準的分類 密碼學標準可根據技術原理和應用場景分…

ubuntu 22.04安裝和使用docker介紹

docker安裝和使用 準備環境常見的docker操作linux系統常用的配置卸載docker 準備環境 本機環境&#xff1a; Linux yz-MS-7E06 6.8.0-59-generic #61~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 15 17:03:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux安裝依賴軟件&#xff1a;…

obsidian 中的查找和替換插件,支持正則

最近用著 obsidian 時&#xff0c;發現想要在當前文檔中 查找和替換 內容時&#xff0c;沒有自動查找和替換的功能&#xff0c;去插件市場查找也沒有發現好用的插件&#xff0c;那就自己寫一個吧。 全程用的 AI 來寫的&#xff0c;當然&#xff0c;我對 JS/CSS/TypeScript 等沒…

針對vue項目的webpack優化攻略

一、開發階段優化 1. 熱更新加速&#xff08;HMR&#xff09; // vue.config.js module.exports {devServer: {hot: true, // 開啟熱更新injectClient: true, // 自動注入HMR客戶端watchOptions: {ignored: /node_modules/, // 忽略node_modules變化aggregateTimeout: 300…

BTC官網關注巨鯨12億美元平倉,XBIT去中心化交易平臺表現穩定

在全球加密貨幣市場波動加劇的背景下&#xff0c;2025年5月25日傳出重磅消息。據今日最新國際報道&#xff0c;知名巨鯨James Wynn完全平倉價值12億美元的BTC多頭倉位&#xff0c;整體盈利約845萬美元&#xff0c;此舉引發市場廣泛關注。與此同時&#xff0c;收益型穩定幣市場迎…

在WPF中添加動畫背景

在WPF中添加動畫背景 在WPF中創建動畫背景可以大大增強應用程序的視覺效果。以下是幾種實現動畫背景的方法&#xff1a; 方法1&#xff1a;使用動畫ImageBrush&#xff08;圖片輪播&#xff09; <Window x:Class"AnimatedBackground.MainWindow"xmlns"htt…

單點擊登錄sso實現

一、單點登錄&#xff08;SSO&#xff09;是什么&#xff1f; 核心定義 單點登錄&#xff08;Single Sign-On&#xff0c;SSO&#xff09;是一種身份認證解決方案&#xff0c;允許用戶通過一次登錄訪問多個相互信任的應用系統。其核心邏輯是統一認證中心與分布式會話管理&…

JavaWebsocket-demo

Websocket客戶端 pom依賴 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.4.0</version></dependency>客戶端代碼片段 Component Slf4j public class PositionAlarmL…

Java Collection(集合) 接口

Date: 2025-05-21 20:21:32 author: lijianzhan Java 集合框架提供了一組接口和類&#xff0c;以實現各種數據結構和算法。 以下是關于 Java 集合的核心內容說明&#xff1a; /*** Java Collection Framework 說明&#xff1a;** 在 Java 中&#xff0c;集合&#xff08;Collec…

讓MySQL更快:EXPLAIN語句詳盡解析

前言 在數據庫性能調優中&#xff0c;SQL 查詢的執行效率是影響系統整體性能的關鍵因素之一。MySQL 提供了強大的工具——EXPLAIN 語句&#xff0c;幫助開發者和數據庫管理員深入分析查詢的執行計劃&#xff0c;從而發現潛在的性能瓶頸并進行針對性優化。 EXPLAIN 語句能夠模…

Java基礎 Day20

一、HashSet 集合類 1、簡介 HashSet 集合底層采取哈希表存儲數據 底層是HashMap 不能使存取有序 JDK8之前的哈希表是數組和鏈表&#xff0c;頭插法 JDK8之后的哈希表是數組、鏈表和紅黑樹&#xff0c;尾插法 2、存儲元素 &#xff08;1&#xff09;如果要保證元素的唯…

2505C++,32位轉64位

原文 假設有個想要將一個32位值傳遞給一個帶64位值的函數的函數.你不關心高32位的內容,因為該值是傳遞給回調函數的直通值,回調函數會把它截斷為32位值. 因此,你都擔心編譯器一般生成的將32位值擴展到64位值的那條指令的性能影響. 我懷疑這條指令不是程序中的性能瓶頸. 我想出…