<jupyter_start><jupyter_text>1. One vs AllÝ tưởng của bài toán phân loại nhiều lớp sử dụng Logistic Regression là đưa về bài toán phân loại nhị phân. Điều đó có nghĩa là chúng ta phải thay đổi nhiều lớp về thành 2 lớp. Chúng ta sẽ đặt nhãn cho các nhóm cần phân là 1, còn các nhóm còn lại sẽ là 0.Mặc dù có thể phân loại nhiều nhóm bằng Logistic Regression nhưng kết quả phân loại thường không quá cao và đạt được kỳ vọng như ta mong đợi. Chính vì vậy mà `Softmax Regression` (chúng ta sẽ học ở bài tới) sẽ giúp phân loại nhiều lớp tốt hơn rất nhiều so với việc dùng Logistic Regression. Nội dung trong phần này sẽ chỉ mang tính tham khảo ! (Phân loại nhiều nhóm bằng Logistic Regresison cực ít được sử dụng trong các bài toán thực tế).  2. Phân loại 10 nhóm bộ dữ liệu CIFAR Sử dụng One-vs-all logistic regression phân loại 10 nhóm dữ liệu trong bộ dữ liệu CIFAR. Các bạn có thể Download bộ dữ liệu này tại http://www.cs.toronto.edu/~kriz/cifar.html.Chú ý: Hầu hết các mã code trong phần này sẽ gọi các thư viện được viết sẵn.<jupyter_code># Import thư viện 
import random 
import numpy as np
import matplotlib.pyplot as plt
import CIFAR

%matplotlib inline<jupyter_output><empty_output><jupyter_text>Nhập dữ liệu và trực quan hoá<jupyter_code># Tên của 10 nhóm dữ liệu 
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']

# Lấy dữ liệu trong Data 
X_train_raw, y_train_raw, X_val_raw, y_val_raw, X_test_raw, y_test_raw = CIFAR.get_CIFAR10_data()

# Trực quan hoá 
CIFAR.visualize_sample(X_train_raw, y_train_raw, classes)<jupyter_output><empty_output><jupyter_text>Xử lý dữ liệu và in ra thông tin của dữ liệu<jupyter_code>X_train, y_train, X_val, y_val, X_test, y_test = CIFAR.preprocessing_CIFAR10_data(X_train_raw, y_train_raw, X_val_raw, y_val_raw, X_test_raw, y_test_raw)

print('Train data shape: ', X_train.shape)
print('Train labels shape: ', y_train.shape)
print('Validation data shape: ', X_val.shape)
print('Validation labels shape: ', y_val.shape)
print('Test data shape: ', X_test.shape)
print('Test labels shape: ', y_test.shape)<jupyter_output>Train data shape:  (3073, 49000)
Train labels shape:  (49000,)
Validation data shape:  (3073, 1000)
Validation labels shape:  (1000,)
Test data shape:  (3073, 10000)
Test labels shape:  (10000,)<jupyter_text>Thực hiện Train Ý tưởng đơn giản là nhóm nào cần phân loại sẽ gán là 1, còn lại sẽ đưa về 0. ```y_train_logistic[idxs_i] = 1y_train_logistic[~idxs_i] = 0Với idxs_i là nhóm cần phân loại.```<jupyter_code># train 10 logistic classifier
from algorithms.classifiers import Logistic
from copy import deepcopy

logistic_classifiers = []
num_classes = np.max(y_train) + 1
losses = []
for i in range(num_classes):
    print('\nThe %d/%dth logistic classifier training...' %(i+1, num_classes))
    y_train_logistic = deepcopy(y_train)
    idxs_i = y_train_logistic == i
    y_train_logistic[idxs_i] = 1
    y_train_logistic[~idxs_i] = 0
    logistic = Logistic()
    loss = logistic.train(X_train, y_train_logistic, method='sgd', batch_size=200, learning_rate=1e-6,
              reg = 1e3, num_iters=1000, verbose=True, vectorized=True)
    losses.append(loss)
    logistic_classifiers.append(logistic)
# Vẽ hàm Loss
plt.plot(range(len(losses[9])), losses[9])<jupyter_output><empty_output><jupyter_text>Dự đoán kết quả sau khi train<jupyter_code># Tính toán độ chính xác của thuật toán
def predict_one_vs_all(logistic_classifiers, X, num_classes):
    scores = np.zeros((num_classes, X.shape[1]))
    for i in range(num_classes):
        logistic = logistic_classifiers[i]
        scores[i, :] = logistic.predict(X)[1]
    pred_X = np.argmax(scores, axis=0)
    return pred_X

pred_train_one_vs_all = predict_one_vs_all(logistic_classifiers, X_train, num_classes)
pred_val_one_vs_all = predict_one_vs_all(logistic_classifiers, X_val, num_classes)
pred_test_one_vs_all = predict_one_vs_all(logistic_classifiers, X_test, num_classes)
print('Training dataset accuracy: %f' % (np.mean(y_train == pred_train_one_vs_all)))
print('Validation dataset accuracy: %f' % (np.mean(y_val == pred_val_one_vs_all)))
print('Test datast accuracy: %f' % (np.mean(y_test == pred_test_one_vs_all)))<jupyter_output>Training dataset accuracy: 0.330837
Validation dataset accuracy: 0.342000
Test datast accuracy: 0.327400
{'fraction_non_alphanumeric': 0.0949278734295021, 'fraction_numerical': 0.023731968357375524, 'mean_word_length': 5.221418234442837, 'pattern_counts': {'":': 0, '<': 19, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '627965', 'license': 'MIT', 'n_tokens_mistral': 1976, 'n_tokens_neox': 1919, 'n_words': 493, 'path': 'Week 4/4. Logistic Regression - One vs All .ipynb', 'repo_name': 'thanhhff/AIVN-Course-AI-For-Everyone', 'size': '4298'}