CNTK - Mô hình phân loại

Chương này sẽ giúp bạn hiểu cách đo lường hiệu suất của mô hình phân loại trong CNTK. Chúng ta hãy bắt đầu với ma trận nhầm lẫn.

Ma trận hỗn loạn

Ma trận nhầm lẫn - một bảng có đầu ra dự đoán so với đầu ra dự kiến ​​là cách dễ nhất để đo hiệu suất của một bài toán phân loại, trong đó đầu ra có thể là hai hoặc nhiều loại lớp.

Để hiểu cách thức hoạt động, chúng tôi sẽ tạo một ma trận nhầm lẫn cho một mô hình phân loại nhị phân dự đoán, liệu một giao dịch thẻ tín dụng là bình thường hay là một gian lận. Nó được hiển thị như sau:

Gian lận thực tế Thực tế bình thường

Predicted fraud

Thực sự tích cực

Dương tính giả

Predicted normal

Phủ định sai

Phủ định thực sự

Như chúng ta có thể thấy, ma trận nhầm lẫn mẫu ở trên chứa 2 cột, một cột dành cho gian lận trong lớp và cột khác dành cho lớp bình thường. Theo cách tương tự, chúng ta có 2 hàng, một hàng được thêm cho gian lận trong lớp và hàng còn lại được thêm cho lớp bình thường. Sau đây là giải thích về các thuật ngữ liên quan đến ma trận nhầm lẫn -

  • True Positives - Khi cả lớp thực tế và lớp dự đoán của điểm dữ liệu là 1.

  • True Negatives - Khi cả lớp thực tế và lớp dự đoán của điểm dữ liệu bằng 0.

  • False Positives - Khi lớp thực tế của điểm dữ liệu là 0 và lớp dự đoán của điểm dữ liệu là 1.

  • False Negatives - Khi lớp dữ liệu thực tế là 1 và lớp dữ liệu dự đoán là 0.

Hãy xem, làm thế nào chúng ta có thể tính toán số thứ khác nhau từ ma trận nhầm lẫn -

  • Accuracy- Là số dự đoán đúng được thực hiện bởi mô hình phân loại ML của chúng tôi. Nó có thể được tính toán với sự trợ giúp của công thức sau:

  • Precision− Nó cho chúng ta biết có bao nhiêu mẫu được dự đoán chính xác trong số tất cả các mẫu chúng ta dự đoán. Nó có thể được tính toán với sự trợ giúp của công thức sau:

  • Recall or Sensitivity- Nhớ lại là số lượng dương tính được trả về bởi mô hình phân loại ML của chúng tôi. Nói cách khác, nó cho chúng ta biết có bao nhiêu trường hợp gian lận trong tập dữ liệu đã được mô hình thực sự phát hiện. Nó có thể được tính toán với sự trợ giúp của công thức sau:

  • Specificity- Ngược lại với việc nhớ lại, nó cung cấp số lượng các phủ định được trả về bởi mô hình phân loại ML của chúng tôi. Nó có thể được tính toán với sự trợ giúp của công thức sau:

Thước đo F

Chúng ta có thể sử dụng F-Measure để thay thế cho ma trận Lẫn lộn. Lý do chính đằng sau điều này, chúng tôi không thể tối đa hóa Nhớ lại và Độ chính xác cùng một lúc. Có một mối quan hệ rất chặt chẽ giữa các chỉ số này và có thể hiểu được điều đó với sự trợ giúp của ví dụ sau:

Giả sử, chúng ta muốn sử dụng mô hình DL để phân loại các mẫu tế bào là ung thư hay bình thường. Ở đây, để đạt được độ chính xác tối đa, chúng ta cần giảm số lượng dự đoán xuống còn 1. Mặc dù, điều này có thể giúp chúng ta đạt độ chính xác khoảng 100%, nhưng khả năng thu hồi sẽ trở nên thực sự thấp.

Mặt khác, nếu muốn đạt được mức thu hồi tối đa, chúng ta cần đưa ra càng nhiều dự đoán càng tốt. Mặc dù, điều này có thể cung cấp cho chúng ta khoảng thu hồi 100%, nhưng độ chính xác sẽ trở nên thực sự thấp.

Trong thực tế, chúng ta cần tìm cách cân bằng giữa độ chính xác và khả năng thu hồi. Chỉ số đo F cho phép chúng tôi làm như vậy, vì nó thể hiện mức trung bình hài hòa giữa độ chính xác và thu hồi.

Công thức này được gọi là độ đo F1, trong đó số hạng phụ được gọi là B được đặt thành 1 để có được tỷ lệ chính xác và thu hồi bằng nhau. Để nhấn mạnh sự nhớ lại, chúng ta có thể đặt hệ số B thành 2. Mặt khác, để nhấn mạnh độ chính xác, chúng ta có thể đặt hệ số B thành 0,5.

Sử dụng CNTK để đo lường hiệu suất phân loại

Trong phần trước, chúng tôi đã tạo một mô hình phân loại bằng cách sử dụng tập dữ liệu hoa Iris. Ở đây, chúng tôi sẽ đo lường hiệu suất của nó bằng cách sử dụng ma trận nhầm lẫn và số liệu F-Measure.

Tạo ma trận nhầm lẫn

Chúng tôi đã tạo mô hình, vì vậy chúng tôi có thể bắt đầu quá trình xác thực, bao gồm confusion matrix, trên cùng một. Đầu tiên, chúng tôi sẽ tạo ma trận nhầm lẫn với sự trợ giúp củaconfusion_matrix chức năng từ scikit-learn. Đối với điều này, chúng tôi cần các nhãn thực cho các mẫu thử nghiệm của chúng tôi và các nhãn dự đoán cho các mẫu thử nghiệm giống nhau.

Hãy tính toán ma trận nhầm lẫn bằng cách sử dụng mã python sau:

from sklearn.metrics import confusion_matrix
y_true = np.argmax(y_test, axis=1)
y_pred = np.argmax(z(X_test), axis=1)
matrix = confusion_matrix(y_true=y_true, y_pred=y_pred)
print(matrix)

Đầu ra

[[10 0 0]
[ 0 1 9]
[ 0 0 10]]

Chúng ta cũng có thể sử dụng chức năng bản đồ nhiệt để hình dung một ma trận nhầm lẫn như sau:

import seaborn as sns
import matplotlib.pyplot as plt
g = sns.heatmap(matrix,
     annot=True,
     xticklabels=label_encoder.classes_.tolist(),
     yticklabels=label_encoder.classes_.tolist(),
     cmap='Blues')
g.set_yticklabels(g.get_yticklabels(), rotation=0)
plt.show()

Chúng ta cũng nên có một số hiệu suất duy nhất, chúng ta có thể sử dụng để so sánh mô hình. Đối với điều này, chúng ta cần tính toán lỗi phân loại bằng cách sử dụngclassification_error chức năng, từ gói số liệu trong CNTK như được thực hiện trong khi tạo mô hình phân loại.

Bây giờ để tính toán lỗi phân loại, hãy thực hiện phương pháp kiểm tra trên hàm mất mát với một tập dữ liệu. Sau đó, CNTK sẽ lấy các mẫu mà chúng tôi đã cung cấp làm đầu vào cho chức năng này và đưa ra dự đoán dựa trên các tính năng đầu vào X_test.

loss.test([X_test, y_test])

Đầu ra

{'metric': 0.36666666666, 'samples': 30}

Thực hiện các biện pháp F

Để thực hiện các biện pháp F, CNTK cũng bao gồm chức năng gọi là phương pháp đo lường. Chúng ta có thể sử dụng chức năng này, trong khi đào tạo NN bằng cách thay thế ôcntk.metrics.classification_error, với một cuộc gọi đến cntk.losses.fmeasure khi xác định chức năng nhà máy tiêu chí như sau:

import cntk
@cntk.Function
def criterion_factory(output, target):
   loss = cntk.losses.cross_entropy_with_softmax(output, target)
metric = cntk.losses.fmeasure(output, target)
   return loss, metric

Sau khi sử dụng hàm cntk.losses.fmeasure, chúng ta sẽ nhận được đầu ra khác nhau cho loss.test lệnh gọi phương thức như sau:

loss.test([X_test, y_test])

Đầu ra

{'metric': 0.83101488749, 'samples': 30}