Python機器學習性能度量利用鳶尾花數據繪制P-R曲線
一、性能度量
性能度量目的是對學習期的泛華能力進行評估,性能度量反映了任務需求,在對比不同算法的泛華能力時,使用不同的性能度量往往會導致不同的評判結果。常用度量有均方誤差,錯誤率與精度,查準率與查全率等。
1.錯誤率與精度
這兩種度量既適用于二分類任務,也適用于多分類任務。錯誤率是分類錯誤的樣本數占樣本總數的比例,精度則是分類正確的樣本數占樣本總數的比例。
2.查準率、查全率與F1
查準率(precision)與查全率(recall)是對于需求在信息檢索、Web搜索等應用評估性能度量適應度高的檢測數值。對于二分類問題,可將真實類別與算法預測類別的組合劃分為真正例(ture positive)、假證例(false positive)、真反例(true negative)、假反例(false negative)四種情形。顯然TP+FP+TN+FN=樣例總數。分類結果為混淆矩陣:
真實情況 預測結果
正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)
查準率P定義為:

一般來說。查準率高時,查全率往往偏低;而查全率高時,查準率往往偏低。通常只有一些簡單任務中,才可能使查全率和查準率都很高。
二、代碼實現:
1.基于具體二分類問題算法實現代碼:
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])): # 樣本數都不等,顯然是有錯誤的
print("真實結果與預測結果樣本數不一致。")
else:
for i in range(0, len(true[m])): # 對每一組數據分別計數
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)
下面給出利用鳶尾花數據集繪制P-R曲線的代碼(主要體現其微互斥性)
2.利用鳶尾花繪制P-R曲線
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
import numpy as np
iris = datasets.load_iris()
# 鳶尾花數據導入
x = iris.data
#每一列代表了萼片或花瓣的長寬,一共4列,每一列代表某個被測量的鳶尾植物,iris.shape=(150,4)
y = iris.target
#target是一個數組,存儲了data中每條記錄屬于哪一類鳶尾植物,所以數組的長度是150,所有不同值只有三個
random_state = np.random.RandomState(0)
#給定狀態(tài)為0的隨機數組
n_samples, n_features = x.shape
x = np.c_[x, random_state.randn(n_samples, 200 * n_features)]
#添加合并生成特征測試數據集
x_train, x_test, y_train, y_test = train_test_split(x[y < 2], y[y < 2],
test_size=0.25,
random_state=0)
#根據此模型訓練簡單數據分類器
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)于前者。為取得比較合理的判斷依據,將采用“平衡點”(Break-Even Point,BEP)度量對比算法的泛華性能強弱。它是“查準率=查全率”時的取值。但BEP還是過于簡化,更常用F1度量(all為樣例總數):

以上就是Python機器學習性能度量利用鳶尾花數據繪制P-R曲線的詳細內容,更多關于Python鳶尾花數據繪制P-R曲線的資料請關注腳本之家其它相關文章!
相關文章
python利用re,bs4,requests模塊獲取股票數據
這篇文章主要介紹了python利用re,bs4,requests模塊獲取股票數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07

