機器學習:效能度量篇-Python利用鳶尾花資料繪製P-R曲線

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

一、效能度量

效能度量目的是對學習期的泛華能力進行評估,效能度量反映了任務需求,在對比不同演算法的泛華能力時,使用不同的效能度量往往會導致不同的評判結果。常用度量有均方誤差,錯誤率與精度,查準率與查全率等。

1.錯誤率與精度

這兩種度量既適用於二分類任務,也適用於多分類任務。錯誤率是分類錯誤的樣本數佔樣本總數的比例,精度則是分類正確的樣本數佔樣本總數的比例。

2.查準率、查全率與F1

查準率(precision)與查全率(recall)是對於需求在資訊檢索、Web搜尋等應用評估效能度量適應度高的檢測數值。對於二分類問題,可將真實類別與演算法預測類別的組合劃分為真正例(ture positive)、假證例(false positive)、真反例(true negative)、假反例(false negative)四種情形。顯然TP+FP+TN+FN=樣例總數。分類結果為混淆矩陣:

image.png 查準率P定義為:

image.png 查全率R定義為:

image.png 一般來說。查準率高時,查全率往往偏低;而查全率高時,查準率往往偏低。通常只有一些簡單任務中,才可能使查全率和查準率都很高。

二、程式碼實現:

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)

給定狀態為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() ```

效果:

image.png P-R圖直觀的顯示出學習器在樣本上的查全率、查準率。在進行比較時,若一個休息區的P-R曲線被另一個學習器的曲線完全“包住”,則可斷言後者的效能優於前者。為取得比較合理的判斷依據,將採用“平衡點”(Break-Even Point,BEP)度量對比演算法的泛華效能強弱。它是“查準率=查全率”時的取值。但BEP還是過於簡化,更常用F1度量(all為樣例總數):

image.png