Hướng dẫn how does python calculate classifier accuracy? - python làm cách nào để tính toán độ chính xác của trình phân loại?

Python như bạn có nghĩa là nó

Giả sử rằng chúng ta đang làm việc trên một dự án trong đó chúng ta có một số mô hình có thể xử lý một hình ảnh và phân loại nội dung của nó. Ví dụ, chức năng

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
6 của tôi cố gắng phân loại xem một bức tranh là của một con mèo (lớp 0), một con chó (lớp 1), một con ngỗng (lớp 2) hoặc một cái gì đó khác (lớp 3). Chúng tôi muốn đo độ chính xác của phân loại của chúng tôi. Đó là, chúng tôi muốn cung cấp cho nó một loạt các hình ảnh có nội dung được biết đến và số lần dự đoán mô hình phù hợp với nội dung thực của một hình ảnh. Độ chính xác là phần của hình ảnh mà mô hình phân loại chính xác.

Đối với mỗi hình ảnh, chúng tôi cung cấp mô hình

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
6, nó sẽ tạo ra bốn điểm - một điểm cho mỗi lớp. Mô hình được thiết kế sao cho lớp có điểm cao nhất tương ứng với dự đoán của nó. Không có ràng buộc về các giá trị mà điểm số có thể đạt được. Ví dụ: nếu mô hình xử lý một hình ảnh, nó sẽ trả về một hình dạng-\ ((1, 4) \) điểm số điểm:scores - one score for each class. The model was designed such that the class with the highest score corresponds to its prediction. There are no constraints on the values the scores can take. For example, if the model processes one image it will return a shape-\((1, 4)\) score-array:

>>> scores = cat_dog_goose_other(image)
# processing one image produces a 1x4 array of classification scores
>>> scores
array([[-10, 33, 580, 100]])

Ở đây, mô hình của chúng tôi đã dự đoán rằng đây là hình ảnh của một con ngỗng, vì điểm số liên kết với lớp 2 (

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
8) là giá trị lớn nhất. Nói chung, nếu chúng ta vượt qua
# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
6 một mảng hình ảnh \ (n \), nó sẽ trả về một hình dạng - \ ((n, 4) \) mảng điểm phân loại - mỗi hình ảnh \ (n \) có \ (4 (4 \) điểm số liên quan đến nó.\(N\) images, it will return a shape-\((N, 4)\) array of classification scores - each of the \(N\) images has \(4\) scores associated with it.

Bởi vì chúng tôi đang đo độ chính xác của mô hình, chúng tôi đã quản lý một tập hợp các hình ảnh có nội dung được biết đến. Đó là, chúng ta có một nhãn thực sự cho mỗi hình ảnh, được mã hóa dưới dạng ID lớp. Ví dụ, một hình ảnh của một con mèo sẽ có nhãn

# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
0 được liên kết với nó, một hình ảnh của một con chó sẽ có nhãn
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
1, v.v. Do đó, một chồng các hình ảnh \ (n \) sẽ có liên quan đến nó một hình dạng-\ ((n,) \) mảng của nhãn số nguyên, mỗi nhãn nằm trong \ ([0, 4) \).label for each image, which is encoded as a class-ID. For example, a picture of a cat would have the label
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
0 associated with it, a picture of a dog would have the label
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
1 and so on. Thus, a stack of \(N\) images would have associated with it a shape-\((N,)\) array of integer labels, each label is within \([0, 4)\).

Giả sử chúng ta đã vượt qua mô hình năm hình ảnh của mình và nó đã tạo ra các điểm sau:

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose

Và giả sử rằng các nhãn thực sự cho năm hình ảnh này là:

# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])

Mô hình của chúng tôi phân loại ba trong số năm hình ảnh một cách chính xác; Do đó, chức năng chính xác của chúng tôi sẽ trả về 0,6:

>>> classification_accuracy(scores, labels)
0.6

Để khái quát hóa vấn đề này, giả sử rằng trình phân loại của bạn đang xử lý các lớp \ (k \) (thay vì \ (4 \)). Hoàn thành chức năng sau.\(K\) classes (instead of \(4\)). Complete the following function.

Mẹo: Bạn sẽ thấy hữu ích khi tận dụng chức năng Numpy từ ArgMax You will find it useful to leverage numpy’s argmax function`f

def classification_accuracy(classification_scores, true_labels):
    """
    Returns the fractional classification accuracy for a batch of N predictions.

    Parameters
    ----------
    classification_scores : numpy.ndarray, shape=(N, K)
        The scores for K classes, for a batch of N pieces of data
        (e.g. images).
    true_labels : numpy.ndarray, shape=(N,)
        The true label for each datum in the batch: each label is an
        integer in the domain [0, K).

    Returns
    -------
    float
        (num_correct) / N
    """
    # YOUR CODE HERE
    pass

Giải pháp chưa được khám phá

Một cách tiếp cận đơn giản cho vấn đề này là lần đầu tiên lặp qua các hàng điểm phân loại của chúng tôi. Chúng tôi biết rằng mỗi hàng như vậy lưu trữ điểm số cho mỗi lớp cho một điểm dữ liệu cụ thể và chỉ số của điểm số cao nhất trong hàng đó cung cấp cho chúng tôi nhãn dự đoán cho điểm dữ liệu đó (ví dụ: & NBSP; hình ảnh trong trường hợp sử dụng giả thuyết của chúng tôi) . Sau đó, chúng ta có thể so sánh trực tiếp các nhãn dự đoán này với các nhãn thực để tính độ chính xác.

Chúng ta có thể sử dụng hàm

# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
2 để có được chỉ số của điểm số cao nhất và do đó, lớp ID dự đoán, cho mỗi điểm dữ liệu. Hãy nhớ lại rằng các mảng Numpy sử dụng thứ tự truyền tải hàng hàng, do đó, việc thực hiện vòng lặp trên
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
3 sẽ mang lại một hàng của mảng một lúc.

pred_labels = []  # Will store the N predicted class-IDs
for row in classification_scores:
    # store the index associated with the highest score for each datum
    pred_labels.append(np.argmax(row))

Tiếp theo, chúng ta cần đếm tỷ lệ ID lớp dự đoán phù hợp với phân loại nhãn thực sự phù hợp với phân loại thực sự.

num_correct = 0
for i in range(len(pred_labels)):
    if pred_labels[i] == true_labels[i]:
        num_correct += 1

Hoặc chúng ta có thể sử dụng sự hiểu biết của máy phát và itertools để cô đọng hơn nhiều:

# recall: int(True) -> 1, int(False) -> 0
num_correct = sum(p == t for p, t in zip(pred_labels, true_labels))

Chúng ta có thể chính thức viết điều này vào chức năng sau:

def unvectorized_accuracy(classification_scores, true_labels):
    """
    Returns the fractional classification accuracy for a batch of N predictions.

    Parameters
    ----------
    classification_scores : numpy.ndarray, shape=(N, K)
        The scores for K classes, for a batch of N pieces of data
        (e.g. images).
    true_labels : numpy.ndarray, shape=(N,)
        The true label for each datum in the batch: each label is an
        integer in the domain [0, K).

    Returns
    -------
    float
        (num_correct) / N
    """
    pred_labels = []  # Will store the N predicted class-IDs
    for row in classification_scores:
        pred_labels.append(np.argmax(row))

    num_correct = 0
    for i in range(len(pred_labels)):
        if pred_labels[i] == true_labels[i]:
            num_correct += 1
    return num_correct / len(true_labels)

Kiểm tra chống lại ví dụ của chúng tôi từ trên:

>>> unvectorized_accuracy(scores, labels)
0.6

Horray! Chúng tôi có một chức năng chính xác làm việc! Tuy nhiên, chức năng này có thể được đơn giản hóa và tối ưu hóa rất nhiều bằng cách vector hóa nó.

Giải pháp vectorized

# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
2 là một trong những hàm tuần tự vector hóa Numpy. Như vậy, nó chấp nhận trục như một đối số từ khóa. Điều này có nghĩa là, thay vì gọi
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
5 trên mỗi hàng của
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
3 trong vòng lặp, chúng ta chỉ có thể hướng dẫn
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
5 hoạt động trên các cột của mỗi hàng của mảng bằng cách chỉ định
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
8.

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
0

Biểu thức đơn giản này loại bỏ hoàn toàn vòng lặp đầu tiên của chúng tôi.

Tiếp theo, chúng ta có thể sử dụng các hoạt động logic vector hóa của Numpy, cụ thể là

# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
9, để có được một mảng có giá trị boolean lưu trữ
>>> classification_accuracy(scores, labels)
0.6
0 bất cứ nơi nào các nhãn dự đoán khớp với nhãn thực và
>>> classification_accuracy(scores, labels)
0.6
1 ở mọi nơi khác. Hãy nhớ lại rằng
>>> classification_accuracy(scores, labels)
0.6
0 hoạt động như
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
1 và
>>> classification_accuracy(scores, labels)
0.6
1 như
# truth: cat, dog, dog, goose, other
>>> labels = np.array([0, 1, 1, 2, 3])
0. Do đó, chúng tôi có thể gọi
>>> classification_accuracy(scores, labels)
0.6
6 trên mảng có giá trị boolean kết quả của chúng tôi để tính toán số lượng dự đoán chính xác chia cho tổng số dự đoán. Do đó, chúng ta có thể vector hóa vòng lặp thứ hai của mình với:

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
1

Tất cả cùng nhau, việc sử dụng vector hóa sắc sảo cho phép chúng tôi viết chức năng chính xác phân loại của mình trong một dòng mã duy nhất.

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
2

Điều này không chỉ để xem xét hơn, mà còn đơn giản hơn và ít dễ bị lỗi hơn. Hơn nữa, nó nhanh hơn nhiều so với giải pháp chưa được khám phá của chúng tôi - đã cho các lớp dữ liệu \ (n = 10.000 \) và các lớp \ (k = 100 \), giải pháp vectơ của chúng tôi gần như \ (40 \ lần \)\(N=10,000\) data points and \(K=100\) classes, our vectorized solution is roughly \(40\times\) faster

.

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
3

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
4

# Classification scores produced by `cat_dog_goose_other`
# on five images. A shape-(5, 4) array.
>>> import numpy as np
>>> scores = np.array([[ 30,   1,  10,  80],  # prediction: other
...                    [-10,  20,   0,  -5],  # prediction: dog
...                    [ 27,  50,   9,  30],  # prediction: dog
...                    [ -1,   0,  84,   3],  # prediction: goose
...                    [  5,   2,  10,   0]]) # prediction: goose
5

Độ chính xác của phân loại được tính toán như thế nào?

Độ chính xác là một số liệu được sử dụng trong các vấn đề phân loại được sử dụng để cho biết tỷ lệ phần trăm dự đoán chính xác.Chúng tôi tính toán nó bằng cách chia số lượng dự đoán chính xác cho tổng số dự đoán.dividing the number of correct predictions by the total number of predictions.

Độ chính xác được tính toán trong gấu trúc như thế nào?

Bạn có thể lấy giao điểm của các cột để tìm ra cột nào phổ biến giữa đường cơ sở và dự báo và chỉ áp dụng chính xác_score trên các cột đó.Viết một chức năng để lấy đường cơ sở và một dự báo để cung cấp cho bạn độ chính xác.Đối với hồi quy, hãy thử có nghĩa là lỗi tuyệt đối, lỗi càng thấp thì dự đoán tốt nhất là tốt nhất.apply accuracy_score on those columns. Write a function to take baseline and a forecast to give you accuracy. For regression try mean absolute error, the lower the error the best the prediction is.

Độ chính xác được tính toán trong sklearn như thế nào?

Ở đây chúng ta có thể sử dụng Scikit Tìm hiểu chính xác_score để tính độ chính xác của dữ liệu.y_pred = [0, 5, 2, 4] được sử dụng làm giá trị dự đoán mà chúng ta có thể chọn.y_true = [0, 1, 2, 3] được sử dụng làm giá trị thực đã được đưa ra.Accuracy_score (y_true, y_pred) được sử dụng để kiểm tra độ chính xác của giá trị thực và giá trị dự đoán.