Python機器學習性能度量利用鳶尾花數(shù)據(jù)繪制P-R曲線
一、性能度量
性能度量目的是對學習期的泛華能力進行評估,性能度量反映了任務需求,在對比不同算法的泛華能力時,使用不同的性能度量往往會導致不同的評判結果。常用度量有均方誤差,錯誤率與精度,查準率與查全率等。
1.錯誤率與精度
這兩種度量既適用于二分類任務,也適用于多分類任務。錯誤率是分類錯誤的樣本數(shù)占樣本總數(shù)的比例,精度則是分類正確的樣本數(shù)占樣本總數(shù)的比例。
2.查準率、查全率與F1
查準率(precision)與查全率(recall)是對于需求在信息檢索、Web搜索等應用評估性能度量適應度高的檢測數(shù)值。對于二分類問題,可將真實類別與算法預測類別的組合劃分為真正例(ture positive)、假證例(false positive)、真反例(true negative)、假反例(false negative)四種情形。顯然TP+FP+TN+FN=樣例總數(shù)。分類結果為混淆矩陣:
真實情況 預測結果 正例 反例 正例 TP(真正例) FN(假反例) 反例 FP(假正例) TN(真反例)
查準率P定義為:
一般來說。查準率高時,查全率往往偏低;而查全率高時,查準率往往偏低。通常只有一些簡單任務中,才可能使查全率和查準率都很高。
二、代碼實現(xiàn):
1.基于具體二分類問題算法實現(xiàn)代碼:
import numpy import matplotlib from matplotlib import pyplot as plt # true = [真實組1,真實組2...真實組N],predict = [預測組1,預測組2...預測組N] def evaluation(true, predict): num = len(true) # 確定有幾組 (TP, FP, FN, TN) = ([0] * num for i in range(4)) # 賦初值 for m in range(0, len(true)): if (len(true[m]) != len(predict[m])): # 樣本數(shù)都不等,顯然是有錯誤的 print("真實結果與預測結果樣本數(shù)不一致。") else: for i in range(0, len(true[m])): # 對每一組數(shù)據(jù)分別計數(shù) if (predict[m][i] == 1) and ((true[m][i] == 1)): TP[m] += 1.0 elif (predict[m][i] == 1) and ((true[m][i] == 0)): FP[m] += 1.0 elif (predict[m][i] == 0) and ((true[m][i] == 1)): FN[m] += 1.0 elif (predict[m][i] == 0) and ((true[m][i] == 0)): TN[m] += 1.0 (P, R) = ([0] * num for i in range(2)) for m in range(0, num): if (TP[m] + FP[m] == 0): P[m] = 0 # 預防一些分母為0的情況 else: P[m] = TP[m] / (TP[m] + FP[m]) if (TP[m] + FN[m] == 0): R[m] = 0 # 預防一些分母為0的情況 else: R[m] = TP[m] / (TP[m] + FN[m]) plt.title("P-R") plt.xlabel("P") plt.ylabel("R") #plt.plot(P, R) #plt.show() if __name__ == "__main__": # 簡單舉例 myarray_ture = numpy.random.randint(0, 2, (3, 100)) myarray_predict = numpy.random.randint(0, 2, (3, 100)) evaluation(myarray_ture,myarray_predict)
下面給出利用鳶尾花數(shù)據(jù)集繪制P-R曲線的代碼(主要體現(xiàn)其微互斥性)
2.利用鳶尾花繪制P-R曲線
from sklearn import svm, datasets from sklearn.model_selection import train_test_split import numpy as np iris = datasets.load_iris() # 鳶尾花數(shù)據(jù)導入 x = iris.data #每一列代表了萼片或花瓣的長寬,一共4列,每一列代表某個被測量的鳶尾植物,iris.shape=(150,4) y = iris.target #target是一個數(shù)組,存儲了data中每條記錄屬于哪一類鳶尾植物,所以數(shù)組的長度是150,所有不同值只有三個 random_state = np.random.RandomState(0) #給定狀態(tài)為0的隨機數(shù)組 n_samples, n_features = x.shape x = np.c_[x, random_state.randn(n_samples, 200 * n_features)] #添加合并生成特征測試數(shù)據(jù)集 x_train, x_test, y_train, y_test = train_test_split(x[y < 2], y[y < 2], test_size=0.25, random_state=0) #根據(jù)此模型訓練簡單數(shù)據(jù)分類器 classifier = svm.LinearSVC(random_state=0)#線性分類支持向量機 classifier.fit(x_train, y_train) y_score = classifier.decision_function(x_test) from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt precision, recall, _ =precision_recall_curve(y_test, y_score) plt.fill_between(recall, precision,color='b') plt.xlabel('Recall') plt.ylabel('Precision') plt.ylim([0.0, 1.0]) plt.xlim([0.0, 1.0]) plt.plot(recall, precision) plt.title("Precision-Recall") plt.show()
效果:
P-R圖直觀的顯示出學習器在樣本上的查全率、查準率。在進行比較時,若一個休息區(qū)的P-R曲線被另一個學習器的曲線完全“包住”,則可斷言后者的性能優(yōu)于前者。為取得比較合理的判斷依據(jù),將采用“平衡點”(Break-Even Point,BEP)度量對比算法的泛華性能強弱。它是“查準率=查全率”時的取值。但BEP還是過于簡化,更常用F1度量(all為樣例總數(shù)):
以上就是Python機器學習性能度量利用鳶尾花數(shù)據(jù)繪制P-R曲線的詳細內容,更多關于Python鳶尾花數(shù)據(jù)繪制P-R曲線的資料請關注腳本之家其它相關文章!
相關文章
python+selenium 定位到元素,無法點擊的解決方法
今天小編就為大家分享一篇python+selenium 定位到元素,無法點擊的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01pandas數(shù)據(jù)分列實現(xiàn)分割符號&固定寬度
數(shù)據(jù)分列在數(shù)據(jù)處理中很常見,數(shù)據(jù)分列一般指的都是字符串分割,本文主要介紹了pandas數(shù)據(jù)分列實現(xiàn)分割符號&固定寬度,具有一定的參考價值,感興趣的可以了解一下2024-04-04解決tensorflow測試模型時NotFoundError錯誤的問題
今天小編就為大家分享一篇解決tensorflow測試模型時NotFoundError錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實例
今天小編就為大家分享一篇 python3中利用filter函數(shù)輸出小于某個數(shù)的所有回文數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python+Selenium實現(xiàn)一鍵摸魚&采集數(shù)據(jù)
將Selenium程序編寫為 .bat 可執(zhí)行文件,從此一鍵啟動封裝好的Selenium程序,省時省力還可以復用,豈不美哉。所以本文將利用Selenium實現(xiàn)一鍵摸魚&一鍵采集數(shù)據(jù),需要的可以參考一下2022-08-08