Scikit-learn: Naive Bayes Classifier

Bayes rule

Bayes rule

Trong bài viết này, ta sẽ làm quen với thuật toán phân lớp Naive Bayes. Đây là một thuật toán đơn giản, dễ dàng cài đặt, và có độ chính xác tốt trong hầu hết các trường hợp.

Đây là hướng tiếp cận phân lớp theo mô hình xác suất. Dự đoán xác suất một đối tượng mới thuộc về thành viên của lớp đang xét.

Định lý Bayes

Cho X, C là các biến bất kỳ (rời rạc, liên tục, cấu trúc). Mục tiêu của ta là dự đoán C từ X. Từ mô hình Bayes ta có thể lượng giá các tham số của P(X|C), P(C) trực tiếp từ tập huấn luyện. Sau đó, ta sử dụng định lý Bayes để tính P(C|X=x).

Độc lập điều kiện (conditional independence): X độc lập điều kiện với Y khi cho Z nếu phân bố xác suất trên X độc lập với các giá trị của Y khi cho các giá trị của Z. Ta thường viết P(X|Y,Z) = P(X|Z). Ví dụ, P(Sấm sét|Mưa,Chớp) = P(Sấm sét|Chớp).

Naive Bayes

Giả sử D là tập huấn luyện gồm các mẫu biểu diễn dưới dạng X = <x_1, ..., x_n>. C_{i,D} là tập các mẫu của D thuộc lớp C_i ( i = \{1, ...,m\}). Các thuộc tính x_1, ...,x_n độc lập điều kiện đôi một với nhau khi cho lớp C.

Thuật toán

Bước 1: Huấn luyện Naive Bayes trên tập dữ liệu huấn luyện. Lượng giá P(C_i)P(X_k|C_i).

Bước 2: X_new được gán vào lớp cho giá trị công thức lớn nhất:

argmax_{C_k} P(C_i) \prod\limits_{k = 1}^n P(x_k | C_i)

Trường hợp X là giá trị rời rạc

Giả sử X = <x_1, ...,x_n>. Trong đó, x_i nhận các giá trị rời rạc. Khi đó, lượng giá P(C_i) và lượng giá P(X_k|C_i) theo công thức

P(C_i) \approx \frac{|C_{i, D}|}{D} \hskip 2em P(X_i|C_i) \approx \frac{\#C_{i, D}\{x_k\}}{|C_{i, D}|}

Để tránh trường hợp giá trị P(X_k |C_i ) = 0 do không có mẫu nào trong dữ liệu huấn kuyện thỏa mãn tử số, ta làm trơn bằng cách thêm một số mẫu ảo. Ta áp dụng phương pháp làm trơn Laplace.

P(C_i) \approx \frac{|C_{i, D}| + 1}{|D| + m} \hskip 2em P(x_k | C_i) \approx \frac{\#C_{i, D}\{x_k\} + 1}{|C_{i, D}| + r}

với m là số lớp, r là số giá trị rời rạc của thuộc tính.

Trường hợp X là giá trị liên tục

Nếu thuộc tính nhận giá trị liên tục thì xác suất P(X_k|C_i) thường được tính dựa theo phân bố Gauss với giá trị trung bình mu và độ lệch sigma:

g(x, \mu, \sigma) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(x - \mu)^2}{2\sigma^2}}

P(X_k|C_i) là:

P(X|C_i) = g(x_k, \mu_{c_i}, \sigma_{c_i})

Ví dụ với tập dữ liệu đánh tennis

Cho tập dữ liệu sau

outlook temperature humidity wind playtennis
sunny hot high FALSE no
sunny hot high TRUE no
overcast hot high FALSE yes
rainy mild high FALSE yes
rainy cool normal FALSE yes
rainy cool normal TRUE no
overcast cool normal TRUE yes
sunny mild high FALSE no
sunny cool normal FALSE yes
rainy mild normal FALSE yes
sunny mild normal TRUE yes
overcast mild high TRUE yes
overcast hot normal FALSE yes
rainy mild high TRUE no
Naive Bayes applied to one attribute golf dataset

Naive Bayes applied to one attribute golf dataset

Bước 1: Ước lượng P(C_i) với C_1 = ``yes", C_2 = ``no"P(x_k|C_i) theo công thức làm trơn Laplace.

P(C_1) = (9+1)/(14+2) = 10/16
P(C_2) = (5+1)/(14+2) = 6/16

# OUTLOOK
P(sunny|y) = 3/12, P(sunny|n) = 4/8
P(overcast|y) = 5/12, P(overcast|n) = 1/8
P(rain|y) = 4/12, P(rain|n) = 3/8

# TEMPARATURE
P(hot|y) = 3/12, P(hot|n) = 3/8
P(mild|y) = 5/12, P(mild|n) = 3/8
P(cool|y) = 4/12, P(cool|n) = 2/8

# HUMIDITY
P(high|y) = 4/11, P(high|n) = 5/7
P(normal|y) = 7/11, P(normal|n) = 2/7

# WINDY
P(strong|y) = 4/11, P(strong|n) = 4/7
P(weak|y) = 7/11, P(weak|n) = 3/7

Bước 2: Phân loại X_{new} = <Outlook=overcast, Temp=cool, Humidity=high, Windy=strong>

Ta tính theo công thức làm trơn Laplace

P(C_1)*P(X|C_1)=P(C_1)*P(ovecast|y)*P(cool|y)*P(high|y)*P(strong|y)= .011
P(C_2)*P(X|C_2)=P(C_2)*P(ovecast|n)*P(cool|n)*P(high|n)*P(strong|n) = .005

Vậy X_{new} thuộc lớp C_1(``yes")

Sử dụng Naive Bayes của Scikit-learn để xây dựng mô hình dự đoán trên tập dữ liệu Iris

# Gaussian Naive Bayes
from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
# load the iris datasets
dataset = datasets.load_iris()
# fit a Naive Bayes model to the data
model = GaussianNB()
model.fit(dataset.data, dataset.target)
print(model)
GaussianNB()

# make predictions
expected = dataset.target
predicted = model.predict(dataset.data)
# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        50
          1       0.94      0.94      0.94        50
          2       0.94      0.94      0.94        50

avg / total       0.96      0.96      0.96       150

print(metrics.confusion_matrix(expected, predicted))
[[50  0  0]
 [ 0 47  3]
 [ 0  3 47]]

Đánh giá

Ưu điểm

  • Dễ dàng cài đặt
  • Thời gian thi hành tương tự như cây quyết định
  • Đạt kết quả tốt trong phần lớn các trường hợp

Khuyết điểm

  • Giả thiết về tính độc lập điều kiện của các thuộc tính làm giảm độ chính xác
Advertisements

3 thoughts on “Scikit-learn: Naive Bayes Classifier

  1. Tôi đang bối rối về việc machine learning và deep learning trong thị trường chứng khoán, ngoại hối. Có rất nhiều mô hình trong đó phân tích qua biểu đồ sử dụng AmiBroker hoặc metastock mà vẽ lại giá lịch sử và có những dự báo trong mô hình đó. Liệu nó gọi machine learning hoặc deep learning ?
    Nếu nó đúng thì liệu chúng ta có thể làm được gì nhiều hơn để được ra được các thuật toán deep learning cho kết quả chính xác hơn ?

    Số lượt thích

    • Chào bạn,
      Nếu những nhà nghiên cứu đã giải quyết được bài toán dự đoán thị trường chứng khoán thông qua machine learning (ML)/deep learning (DL) thì mọi người đã đổ xô nhau mà học Khoa học máy tính rồi.
      ML/DL bản chất vẫn cần dữ liệu đầu vào (do bạn thu thập được) bao gồm các trường thuộc tính quan trọng (do kinh nghiệm là chủ yếu – ví dụ: giá xăng, giá dầu, giá vàng, thời sự, thời tiết, thiên tai, …) để có thể huấn luyện cho máy hiểu được pattern từ dữ liệu lịch sử.
      Vì vậy, các công cụ như AmiBroker hoặc metastock mà bạn đề cập thường là công cụ chủ yếu để bạn thu được kinh nghiệm cho riêng bản thân cho từng loại chứng khoán cụ thể.
      Ở đây ta thường áp dụng các phương pháp thống kê/data mining là chủ yếu (một nhánh liên quan đến ML). DL đến hiện nay chỉ cho kết quả tốt đối với dữ liệu dạng tín hiệu số như giọng nói, video, hình ảnh, văn bản… Và việc thiết kế sẽ ảnh hưởng đến độ chính xác của mô hình.
      Trong học thuật, bạn cần tập dữ liệu, sau đó cố gắng áp dụng các phương pháp (ML/DL) bạn nghĩ rằng sẽ hiệu quả hơn để so sánh với các nghiên cứu trước đó (statistics, data mining, …).

      Số lượt thích

      • Cám ơn bạn đã cho câu trả lời chuyên môn về vấn đề mình băn khoăn .

        Theo kinh nghiệm của bạn liệu có các công cụ hoặc phương pháp, trường lớp nào đang dạy hoặc nghiên cứu xử lí dự báo các số liệu tài chính theo phương pháp ML/DL nhằm ứng dụng trong forecast stock, forex ko? Có thể tìm hiểu các tài liệu này thế nào hoăc tham gia khoá học về việc này theo trình tự ra sao , nếu có ?

        Thanks

        Số lượt thích

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s