使用Python和scikit-learn創建混淆矩陣的示例詳解

一、混淆矩陣概述

在訓練瞭有監督的機器學習模型(例如分類器)之後,您想知道它的工作情況。

這通常是通過將一小部分稱為測試集的數據分開來完成的,該數據用作模型以前從未見過的數據。

如果它在此數據集上表現良好,那麼該模型很可能在其他數據上也表現良好 – 當然,如果它是從與您的測試集相同的分佈中采樣的。

現在,當您測試您的模型時,您向其提供數據 – 並將預測與基本事實進行比較,測量真陽性、真陰性、假陽性和假陰性的數量。這些隨後可以在視覺上吸引人的混淆矩陣中可視化。

在今天我們將學習如何使用 Scikit-learn 創建這樣的混淆矩陣,Scikit-learn 是當今機器學習社區中使用最廣泛的機器學習框架之一。通過使用 Python 創建的示例,展示如何生成一個矩陣,您可以使用該矩陣輕松直觀地確定模型的性能。

1、示例1

一個混淆矩陣的例子

它是一個歸一化的混淆矩陣。它的描述瞭兩個度量:

True label,這是您的測試集所代表的基本事實。

Predicted label,即機器學習模型對與真實標簽對應的特征生成的預測。

例如,在上面的模型中,對於所有真實標簽 1,預測標簽為 1。這意味著來自第 1 類的所有樣本都被正確分類。

對於其他類,性能也不錯,但稍差一些。如您所見,對於第 2 類,一些樣本被預測為第 0 類和第 1 類的一部分。

簡而言之,它回答瞭“對於我的真實標簽/基本事實,模型的預測效果如何?”這個問題。

2、示例2

也可以從預測的角度看,問題將變為“對於我的預測標簽,有多少預測實際上是預測類別的一部分?”。這是相反的觀點,但在許多機器學習案例中可能是一個有意義的問題。

最優情況,是整個真實標簽集等於預測標簽集。在這些情況下,除瞭從左上角到右下角的線之外,您會在各處看到零。然而,在實踐中,這種情況並不經常發生。很可能更加分散,例如下面這個 SVM 分類器,其中需要許多支持向量來繪制不能完美工作但足夠充分的決策邊界:

二、使用Scikit-learn 創建混淆矩陣

現在創建一個混淆矩陣。將使用 Python 和 Scikit-learn。

創建混淆矩陣涉及多個步驟:

1、生成示例數據集。需要數據來訓練我們的模型。因此,我們將首先生成數據,以便我們接下來可以為 ML 模型類做出適當的選擇。

2、選擇機器學習模型類。顯然,如果我們要評估一個模型,我們需要訓練一個模型。我們將首先選擇適合我們數據特征的特定類型的模型。

3、構建和訓練 ML 模型。前兩個步驟的結果是我們最終得到瞭一個訓練有素的模型。

4、生成混淆矩陣。最後,基於訓練好的模型,我們可以創建我們的混淆矩陣。

1、相應軟件包

需要以下包,假定已經安裝好瞭Python環境、Scikit-learn、Numpy、Matplotlib、Mlxtend

2、生成示例數據集

第一步是生成示例數據集。我們也將為此目的使用 Scikit-learn。首先,創建一個名為 的文件confusion-matrix.py

(1)導入相關的包

# Imports
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

Scikit-learn的make_blobs功能可以生成樣本的“blob”或集群。這些斑點以某個點為中心,並且樣本基於某個標準偏差分散在該點周圍。這使您可以靈活地確定生成的數據集的位置和結構,從而使您可以試驗各種 ML 模型。

在評估模型時,我們需要確保數據集在訓練數據和測試數據之間進行分割。Scikit-learn使用train_test_split函數實現分割。

(2)相關配置

# Configuration options
blobs_random_seed = 42
centers = [(0,0), (5,5), (0,5), (2,3)]
cluster_std = 1.3
frac_test_split = 0.33
num_features_for_samples = 4
num_samples_total = 5000

隨機種子描述瞭用於生成數據塊的偽隨機數生成器的初始化。您可能知道,沒有隨機數生成器是真正隨機的。更重要的是,它們的初始化方式也不同。配置固定種子可確保每次運行腳本時,隨機數生成器都以相同的方式初始化。如果出現奇怪的行為,您就知道它可能不是隨機數生成器。

中心描述瞭我們數據塊的二維空間中的中心。如您所見,我們今天有 4 個 blob。

聚類標準差描述瞭從隨機點生成器使用的抽樣分佈中抽取樣本的標準差。我們將其設置為 1.3;較低的數字會產生更好分離的集群,反之亦然。

訓練/測試拆分的比例決定瞭為瞭測試目的拆分瞭多少數據。在我們的例子中,這是 33% 的數據。

我們樣本的特征數量是 4,並且確實描述瞭我們有多少目標:4,因為我們有 4 個數據塊。

最後,生成的樣本數量。我們將其設置為 5000 個樣本。

(3)生成數據

# Generate data
inputs, targets = make_blobs(n_samples = num_samples_total, centers = centers, n_features = num_features_for_samples, cluster_std = cluster_std)
X_train, X_test, y_train, y_test = train_test_split(inputs, targets, test_size=frac_test_split, random_state=blobs_random_seed)

(4)保存數據(可選)

# Save and load temporarily
np.save('./data_cf.npy', (X_train, X_test, y_train, y_test))
X_train, X_test, y_train, y_test = np.load('./data_cf.npy', allow_pickle=True)

(5)可視化數據

# Generate scatter plot for training data 
plt.scatter(X_train[:,0], X_train[:,1])
plt.title('Linearly separable data')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

3、訓練一個SVM

(1)導入相關包

from sklearn import svm
from sklearn.metrics import plot_confusion_matrix
from mlxtend.plotting import plot_decision_regions

(2)訓練分類器

# Initialize SVM classifier
clf = svm.SVC(kernel='linear')
 
# 擬合數據
clf = clf.fit(X_train, y_train)

4、生成混淆矩陣

它是評估步驟的一部分,我們用它來可視化它在測試集上的預測和泛化能力。

使用plot_confusion_matrix調用為我們解決瞭這個問題,我們隻需向它提供分類器 (clf)、測試集 (X_testy_test)、顏色圖以及是否對數據進行歸一化。

# Generate confusion matrix
matrix = plot_confusion_matrix(clf, X_test, y_test,
                                 cmap=plt.cm.Blues,
                                 normalize='true')
plt.title('Confusion matrix for our classifier')
plt.show(matrix)
plt.show()

5、可視化邊界

如果要生成邊界圖,需要安裝 Mlxtend

# Get support vectors
support_vectors = clf.support_vectors_
 
# Visualize support vectors
plt.scatter(X_train[:,0], X_train[:,1])
plt.scatter(support_vectors[:,0], support_vectors[:,1], color='red')
plt.title('Linearly separable data with support vectors')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
 
# Plot decision boundary
plot_decision_regions(X_test, y_test, clf=clf, legend=2)
plt.show()

唯一表現不佳的班級是第 3 類,得分為 0.68。這可以通過查看決策邊界圖中的類來解釋。在這裡,由於這些樣本被其他樣本包圍,很明顯模型在生成決策邊界時遇到瞭很大的困難。例如,我們可以通過使用考慮到這一點的不同內核函數來解決這個問題,從而確保更好的可分離性。

​ 以上就是我們使用 Python 和 Scikit-learn 創建瞭一個混淆矩陣。在研究瞭混淆矩陣是什麼,以及它如何顯示真陽性、真陰性、假陽性和假陰性之後,我們給出瞭一個自己創建示例。

該示例包括生成數據集、為數據集選擇合適的機器學習模型、構建、配置和訓練它,最後解釋結果,即混淆矩陣。

到此這篇關於使用Python和scikit-learn創建混淆矩陣的文章就介紹到這瞭,更多相關Python和scikit-learn混淆矩陣內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: