Hàm cross_val_score trong machine learning là gì năm 2024

Ở phần trước chúng ta đã tìm hiểu các phương pháp để đọc, phân tích dữ liệu trên python. Bây giờ chúng ta sẽ tiến hành xây dựng một mô hình hoàn chỉnh.

Chúng ta cần đưa dữ liệu từ dataframe ra một ma trận 80×45 (số chiều dữ liệu) để đưa vào thuật toán huấn luyện

Code:

array = dataset.values
X_train = array[:,0:44].astype(int)
Y_train = array[:,44]

Câu hỏi đặt ra bây giờ là: chúng ta sẽ sử dụng thuật toán Máy học nào để thực hiện?

Ở đây, mình sẽ giới thiệu cho các bạn một số thuật toán Máy học cơ bản(chỉ liệt kê, mình sẽ cố gắng viết blog giải thích ý tưởng từng thuật toán). Do chúng ta đang thực hiện một bài toán phân loại (classification), cho nên mình sẽ liệt kê các thuật toán dùng để phân loại.

Những thuật toán tuyến tính (Linear)

  • Logistic Regression
  • Linear Discriminant Analysis

Những thuật toán phi tuyến (Non linear)

  • k-Nearest Neighbors.
  • Naive Bayes.
  • Classification and Regression Trees.
  • Support Vector Machines.

Trong 6 thuật toán trên làm sao ta biết được thuật toán nào phù hợp với dữ liệu của chúng ta nhất? Để biết được chúng ta cần phải thử nghiệm hết các thuật toán trên. Ta cần dùng đến một phương pháp gọi là Spot-check.

Spot check là gì? Nói một cách ngắn gọn, spot check là một phương pháp để chúng ta có thể xem độ chính xác của một tập hợp gồm các thuật toán, qua đó ta sẽ chọn thuật toán có độ chính xác cao nhất để huấn luyện dữ liệu

Tuy nhiên để Spot check hiệu quả, chúng ta cần tạo ra một bộ validation từ dữ liệu của chúng ta để đánh giá các thuật toán, ở đây mình sẽ sử dụng phương pháp k-fold Cross Validation

k-fold Cross Validation k-fold Cross Validation là một phương pháp chuẩn bị tập validation để đánh giá độ chính xác thuật toán, ý tưởng của nó ngắn gọn như sau:

Từ tập dữ liệu train của bạn, phương pháp này sẽ chia ra thành k phần(fold). Trong đó, việc huấn luyện chỉ được thực hiện trên k-1 fold, và chừa lại một test fold để thuật toán đó dự đoán thử. Và công việc này sẽ được thực hiện lặp lại nhiều lần để đảm bảo mỗi fold sẽ được trở thành test fold. Qua đó ta sẽ có k độ chính xác khác nhau, và kết quả ta thấy được chính là trung bình cộng của k độ chính xác đó.

Ok, ta bắt đầu code:

Code k-fold Cross Validation

# Test options and evaluation metric
num_folds = 10
seed = 7
scoring = 'accuracy'

  • num_folds: số fold ta chia ra
  • seed: số lần ta lặp lại việc chọn một test fold
  • scoring: thang đo độ chính xác, ở đây ta chọn là accuracy (phần trăm dự đoán đúng trên tổng số dự đoán được)

Code spot check từng thuật toán:

# Spot-Check Algorithms
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))
results = []
names = []
for name, model in models:
    kfold = KFold(n_splits=num_folds, random_state=seed)
    cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())

Ta tiến hành kiểm tra độ chính xác từng thuật toán:

fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(names)
pyplot.show()

Kết quả:

Hàm cross_val_score trong machine learning là gì năm 2024

Ở đây ta thấy có 3 thuật toán trong quá trình dự đoán thử đã đạt đến 100% độ chính xác, đó là KNN, CART và NB. Tuy nhiên, có vẻ như NB là hiệu quả nhất bởi vì dao động độ chính xác của nó là không nhiều (chỉ trong khoảng tầm 0.7 hơn đến gần 0.9). Trong khi đó KNN và CART độ chính xác thu về hơi chênh lệch. Như vậy NB (Naive Bayes) có vẻ là thuật toán tối ưu cho tập dữ liệu train này.

Sau khi đã xác định được thuật toán hiệu quả nhất, ta tiến hành huấn luyện mô hình( Lưu ý: Spot check không có nghĩa là huấn luyện dữ liệu, nó chỉ dùng để đánh giá thuật toán nào tối ưu để ta tiến hành việc huấn luyện).

Trước hết ta load data test của chúng ta:

# Load testset
url = 'SPECTF.test.csv'
testset = read_csv(url, header=None)
array_test = testset.values
X_validation = array_test[:,0:44]
Y_validation = array_test[:,44]

Huấn luyện mô hình:

model = GaussianNB()
model.fit(X_train, Y_train)

Kết quả:

Hàm cross_val_score trong machine learning là gì năm 2024

Sau khi huấn luyện xong, ta tiến hành đưa dữ liệu test vào để kiểm tra độ chính xác:

predictions = model.predict(X_validation)

Kiểm tra độ chính xác của mô hình dựa vào dữ liệu test:

print(accuracy_score(Y_validation, predictions))

Kết quả:

Hàm cross_val_score trong machine learning là gì năm 2024

Như vậy mặc dù quá trình Spot check thì NB đưa về độ chính xác khá cao, nhưng khi đưa dữ liệu test vào thì độ chính xác thu được chỉ tầm khoảng 69%, không thực sự cao. Qua đó cho thấy ta cần sử dụng thêm nhiều phương pháp nữa để nâng cao độ chính xác của mô hình :D. Có lẽ mình sẽ để nó ở phần 4 của blog này.

Tuy nhiên đến đây có lẽ mình đã trình bày tổng quan cách để thực hiện một dự án Máy học nho nhỏ, là tiền đề để phát triển các bài toán về sau. Mong nó sẽ giúp ích cho những ai đang mới tiếp cận về ML như mình 😀