8

Phân loại và dự đoán là hai khía cạnh quan trọng nhất của Machine Learning và Naive Bayes là một thuật toán đơn giản nhưng mạnh mẽ đáng ngạc nhiên cho mô hình dự đoán. Vì vậy, các bạn, trong hướng dẫn Naive Bayes này, tôi sẽ đề cập đến các chủ đề sau:

  • Naive Bayes là gì?
  • Định lý Bayes là gì?
  • Dự đoán trò chơi bằng Định lý Bayes
  • Naive Bayes trong ngành công nghiệp
  • Từng bước thực hiện của Naive Bayes
  • Naive Bayes với SKLEARN

Naive Bayes là gì?

Naive Bayes là một trong những thuật toán đơn giản nhất nhưng mạnh nhất để phân loại dựa trên Định lý Bayes với giả định độc lập giữa các yếu tố dự đoán. Mô hình Naive Bayes rất dễ xây dựng và đặc biệt hữu ích cho các tập dữ liệu rất lớn. Có hai phần của thuật toán này:

  • Ngây thơ

  • Bayes

Trình phân loại Naive Bayes giả định rằng sự hiện diện của một tính năng trong một lớp không liên quan đến bất kỳ tính năng nào khác. Ngay cả khi các tính năng này phụ thuộc vào nhau hoặc phụ thuộc vào sự tồn tại của các tính năng khác, tất cả các tính chất này đều góp phần độc lập vào xác suất rằng một loại trái cây cụ thể là táo hoặc cam hoặc chuối, và đó là lý do tại sao nó được gọi là "Naive . "

Định lý Bayes là gì.

Trong thống kê và lý thuyết xác suất, định lý của Bayes mô tả xác suất của một sự kiện, dựa trên kiến ​​thức trước về các điều kiện có thể liên quan đến sự kiện. Nó phục vụ như một cách để tìm ra xác suất có điều kiện.

Cho một giả thuyết ( H) và bằng chứng ( E) , Bayes' Định lý khẳng định rằng mối quan hệ giữa xác suất của các giả thuyết trước khi nhận được bằng chứng,  P (H) ,  và xác suất của giả thuyết sau khi có bằng chứng,  P (H | E) ,  là:

Vì lý do này, P (H) được gọi là xác suất trước , trong khi P (H | E) được gọi là xác suất sau . Yếu tố liên quan đến hai, P (H | E) / P (E) , được gọi là tỷ lệ khả năng . Sử dụng các thuật ngữ này, định lý của Bayes có thể được định nghĩa lại là:

"Xác suất sau bằng với xác suất trước nhân với tỷ lệ khả năng."

Một chút nhầm lẫn? Đừng lo lắng. Hãy tiếp tục hướng dẫn Naive Bayes của chúng tôi và hiểu khái niệm này với một khái niệm đơn giản.

Ví dụ định lý Bayes

Giả sử chúng ta có một Bộ bài và chúng ta muốn tìm hiểu xác suất của lá bài chúng ta chọn ngẫu nhiên để trở thành một vị vua, cho rằng đó là một lá bài mặt. Vì vậy, theo Định lý Bayes, chúng ta có thể giải quyết vấn đề này. Đầu tiên, chúng ta cần tìm hiểu xác suất:

  • P (King)4/52 vì có 4 Kings trong Bộ bài.
  • P (Face | King) bằng 1 vì tất cả các vị vua đều là quân bài.
  • P (Face) bằng 12/52 vì có 3 Thẻ Mặt trong Bộ đồ gồm 13 thẻ và có tổng cộng 4 Bộ quần áo.

Bây giờ, kết hợp tất cả các giá trị vào phương trình của Bayes, chúng ta nhận được kết quả là  1/3 .

Dự đoán trò chơi bằng định lý Bayes

Hãy tiếp tục hướng dẫn Naive Bayes của chúng tôi và dự đoán tương lai với một số dữ liệu thời tiết.

Ở đây chúng tôi có dữ liệu của chúng tôi, bao gồm điều kiện ban ngày, triển vọng, độ ẩm và gió. Cột cuối cùng là 'Chơi', tức là chúng ta có thể chơi bên ngoài mà chúng ta phải dự đoán.

  • Đầu tiên, chúng ta sẽ tạo một   bảng tần số bằng cách sử dụng từng thuộc tính của tập dữ liệu.

  • Đối với mỗi bảng tần số, chúng tôi sẽ tạo một   bảng khả năng .

  • Khả năng ' ' được đưa ra ' Nắng ' là:
    • P (c | x) = P (Có | Nắng) = P (Nắng | Có) * P (Có) / P (Nắng) = (0,3 x 0,71) /0,36 = 0,591 
  • Tương tự, khả năng ' Không ' được đưa ra ' Nắng ' là:
    • P (c | x) = P (Không | Nắng) = P (Nắng | Không) * P (Không) / P (Nắng) = (0,4 x 0,36) /0,36 = 0,40
  • Bây giờ, theo cùng một cách, chúng ta cũng cần tạo Bảng khả năng cho các thuộc tính khác.

Giả sử chúng ta có một Ngày với các giá trị sau:

  • Triển vọng = Mưa

  • Độ ẩm = Cao

  • Gió = yếu

  • Chơi =?

Vì vậy, với dữ liệu, chúng tôi phải dự đoán wheter "chúng tôi có thể chơi vào ngày đó hay không."

  • Khả năng 'Có' vào ngày đó =  P (Outlook = Mưa | Có) * P (Độ ẩm = Cao | Có) * P (Gió = Yếu | Có) * P (Có)

    • = 2/9 * 3/9 * 6/9 * 9/14 = 0,0199

  • Khả năng 'Không' vào ngày đó = P (Outlook = Mưa | Không) * P (Độ ẩm = Cao | Không) * P (Gió = Yếu | Không) * P (Không)

    • = 2/5 * 4/5 * 2/5 * 5/14 = 0,0166

Bây giờ, khi chúng ta bình thường hóa giá trị, chúng ta nhận được:

  • P (Có) = 0,0199 / (0,0199+ 0,0166) = 0,55
  • P (Không) = 0,0166 / (0,0199+ 0,0166) = 0,45

Mô hình của chúng tôi dự đoán rằng có  55%  cơ hội sẽ có một trò chơi vào ngày mai.

Naive Bayes trong ngành công nghiệp

Bây giờ bạn đã có ý tưởng về chính xác Naive Bayes là gì và cách thức hoạt động, hãy xem nó được sử dụng ở đâu trong ngành.

Nguồn cấp dữ liệu RSS

Trường hợp sử dụng công nghiệp đầu tiên của chúng tôi là Phân loại tin tức hoặc chúng tôi có thể sử dụng thuật ngữ 'phân loại văn bản' để mở rộng phổ của thuật toán này. Tin tức trên web đang phát triển nhanh chóng trong đó mỗi trang web tin tức có bố cục và phân loại khác nhau để phân nhóm tin tức. Các công ty sử dụng trình thu thập dữ liệu web để trích xuất văn bản hữu ích từ các trang HTML của các bài báo để xây dựng RSS toàn văn. Nội dung của mỗi bài viết tin tức được token hóa  (phân loại). Để đạt được kết quả phân loại tốt hơn, chúng tôi loại bỏ các từ ít quan trọng hơn, tức là dừng lại, khỏi tài liệu. Chúng tôi áp dụng trình phân loại Bayes ngây thơ để phân loại nội dung tin tức dựa trên mã tin tức.

Lọc thư rác


Phân loại Naive Bayes là một kỹ thuật thống kê phổ biến của lọc e-mail. Họ thường sử dụng một túi các từ / tính năng để xác định e-mail spam, một cách tiếp cận thường được sử dụng trong phân loại văn bản. Các trình phân loại của Naive Bayes hoạt động bằng cách tương quan việc sử dụng mã thông báo (thường là từ hoặc đôi khi là những thứ khác), với email và thư rác không phải thư rác và sau đó, sử dụng định lý Bayes, tính xác suất email có hoặc không phải là thư rác.

Các từ đặc biệt có xác suất cụ thể xảy ra trong email spam và email hợp pháp. Chẳng hạn, hầu hết người dùng email sẽ thường xuyên gặp từ "Xổ số" và "Rút thăm may mắn" trong email spam, nhưng sẽ hiếm khi thấy nó trong các email khác. Mỗi từ trong email đóng góp vào xác suất spam của email hoặc chỉ những từ thú vị nhất. Đóng góp này được gọi là xác suất sau và được tính bằng định lý củaBayes . Sau đó, xác suất spam của email được tính trên tất cả các từ trong email và nếu tổng số vượt quá một ngưỡng nhất định (giả sử là 95%), bộ lọc sẽ đánh dấu email là thư rác.

Chẩn đoán y khoa


Ngày nay, các bệnh viện hiện đại được trang bị tốt với các thiết bị theo dõi và thu thập dữ liệu khác, dẫn đến lượng dữ liệu khổng lồ liên tục được thu thập thông qua kiểm tra sức khỏe và điều trị y tế. Một trong những ưu điểm chính của phương pháp Naive Bayes thu hút các bác sĩ là "tất cả các thông tin có sẵn được sử dụng để giải thích quyết định."  Giải thích này dường như là "tự nhiên" để chẩn đoán và tiên lượng y tế, tức là gần với cách các bác sĩ chẩn đoán bệnh nhân.

Khi xử lý dữ liệu y tế, phân loại Naive Bayes tính đến bằng chứng từ nhiều thuộc tính để đưa ra dự đoán cuối cùng và đưa ra những giải thích minh bạch về các quyết định của nó và do đó nó được coi là một trong những phân loại hữu ích nhất để hỗ trợ các quyết định của bác sĩ.


Dự báo thời tiết

Một mô hình dựa trên Bayes để dự đoán thời tiết được sử dụng, trong đó xác suất sau được sử dụng để tính toán khả năng của mỗi nhãn lớp cho trường hợp dữ liệu đầu vào và mô hình có khả năng tối đa được coi là đầu ra kết quả.

Thực hiện từng bước của Naive Bayes

Ở đây chúng tôi có một bộ dữ liệu bao gồm 768 quan sát của phụ nữ từ 21 tuổi trở lên. Bộ dữ liệu mô tả các phép đo tức thời được lấy từ bệnh nhân, như tuổi tác, máu, và số lần họ đã mang thai. Mỗi hồ sơ có một giá trị nhóm cho biết liệu bệnh nhân có bị bệnh tiểu đường trong vòng 5 năm hay không. Các giá trị là 1 cho bệnh nhân tiểu đường và 0 cho người không mắc bệnh tiểu đường.

Bây giờ, hãy tiếp tục hướng dẫn Naive Bayes của chúng tôi và hiểu tất cả các bước, từng bước một. Tôi đã chia toàn bộ quá trình thành các bước sau:


  • Xử lý dữ liệu

  • Tóm tắt dữ liệu

  • Dự đoán

  • Đánh giá độ chính xác

Bước 1: Xử lý dữ liệu

Điều đầu tiên chúng ta cần làm là tải tập tin dữ liệu của chúng tôi. Dữ liệu ở định dạng CSV mà không có dòng tiêu đề hoặc bất kỳ dấu ngoặc kép nào. Chúng ta có thể mở tệp bằng chức năng mở và đọc các dòng dữ liệu bằng chức năng đọc trong mô-đun CSV.

import csv
import math
import random


def loadCsv(filename):
lines = csv.reader(open(r'C:\Users\Kislay\Desktop\pima-indians-diabetes.data.csv'))
dataset = list(lines)
for i in range(len(dataset)):
dataset[i] = [float(x) for x in dataset[i]]
return dataset

Bây giờ chúng ta cần chia dữ liệu thành các tập dữ liệu huấn luyện và thử nghiệm.

def splitDataset(dataset, splitRatio):
trainSize = int(len(dataset) * splitRatio)
trainSet = []
copy = list(dataset)
while len(trainSet) < trainSize:
index = random.randrange(len(copy))
trainSet.append(copy.pop(index))
return [trainSet, copy]

Bước 2: Tóm tắt dữ liệu

Tóm tắt dữ liệu huấn luyện được thu thập liên quan đến giá trị trung bình và độ lệch chuẩn cho từng thuộc tính, theo giá trị lớp. Chúng được yêu cầu khi đưa ra dự đoán để tính xác suất của các giá trị thuộc tính cụ thể thuộc về từng giá trị lớp.

Chúng ta có thể chia việc chuẩn bị dữ liệu tóm tắt này thành các nhiệm vụ phụ sau:

Phân tách dữ liệu theo lớp: 

def separateByClass(dataset):
separated = {}
for i in range(len(dataset)):
vector = dataset[i]
if (vector[-1] not in separated):
separated[vector[-1]] = []
separated[vector[-1]].append(vector)
return separated

Tính trung bình: 

def mean(numbers):
return sum(numbers)/float(len(numbers))

Tính độ lệch chuẩn:

def stdev(numbers):
avg = mean(numbers)
variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1)
return math.sqrt(variance)

Tóm tắt dữ liệu:

def summarize(dataset):
summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)]
del summaries[-1]
return summaries

Tóm tắt các thuộc tính theo lớp:

def summarizeByClass(dataset):
separated = separateByClass(dataset)
summaries = {}
for classValue, instances in separated.items():
summaries[classValue] = summarize(instances)
return summaries

Bước 3: Dự đoán

Bây giờ chúng tôi đã sẵn sàng để đưa ra dự đoán bằng cách sử dụng các bản tóm tắt được chuẩn bị từ dữ liệu đào tạo của chúng tôi. Việc đưa ra dự đoán liên quan đến việc tính xác suất mà một thể hiện dữ liệu đã cho thuộc về mỗi lớp, sau đó chọn lớp có xác suất lớn nhất làm dự đoán. Chúng ta cần thực hiện các nhiệm vụ sau:

Tính hàm mật độ xác suất Gaussian:

def calculateProbability(x, mean, stdev):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
return (1/(math.sqrt(2*math.pi)*stdev))*exponent

Tính xác suất của lớp: 

def calculateClassProbabilities(summaries, inputVector):
probabilities = {}
for classValue, classSummaries in summaries.items():
probabilities[classValue] = 1
for i in range(len(classSummaries)):
mean, stdev = classSummaries[i]
x = inputVector[i]
probabilities[classValue] *= calculateProbability(x, mean, stdev)
return probabilities

Làm cho một dự đoán:

def predict(summaries, inputVector):
probabilities = calculateClassProbabilities(summaries, inputVector)
bestLabel, bestProb = None, -1
for classValue, probability in probabilities.items():
if bestLabel is None or probability > bestProb:
bestProb = probability
bestLabel = classValue
return bestLabel

Dự đoán: 

def getPredictions(summaries, testSet):
predictions = []
for i in range(len(testSet)):
result = predict(summaries, testSet[i])
predictions.append(result)
return predictions

Nhận chính xác: 

def getAccuracy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x][-1] == predictions[x]:
correct += 1
return (correct/float(len(testSet)))*100.0

Cuối cùng, chúng tôi xác định hàm chính của chúng tôi, nơi chúng tôi gọi tất cả các phương thức mà chúng tôi đã xác định, từng cái một, để có được độ chính xác của mô hình mà chúng tôi đã tạo.

def main():
filename = 'pima-indians-diabetes.data.csv'
splitRatio = 0.67
dataset = loadCsv(filename)
trainingSet, testSet = splitDataset(dataset, splitRatio)
print('Split {0} rows into train = {1} and test = {2} rows'.format(len(dataset),len(trainingSet),len(testSet)))
#prepare model
summaries = summarizeByClass(trainingSet)
#test model
predictions = getPredictions(summaries, testSet)
accuracy = getAccuracy(testSet, predictions)
print('Accuracy: {0}%'.format(accuracy))

main()

Đầu ra:

Vì vậy, ở đây bạn có thể thấy độ chính xác của mô hình của chúng tôi là 66%. Bây giờ, giá trị này khác nhau từ mô hình này sang mô hình khác và cũng từ tỷ lệ phân chia.

Bây giờ chúng ta đã thấy các bước liên quan đến Trình phân loại Naive Bayes, Python đi kèm với một thư viện, Sckit-learn, làm cho tất cả các bước được đề cập ở trên dễ dàng thực hiện và sử dụng. Hãy tiếp tục hướng dẫn Naive Bayes của chúng tôi và xem cách thực hiện điều này.

Naive Bayes với Sckit-learn

Đối với nghiên cứu của chúng tôi, chúng tôi sẽ sử dụng bộ dữ liệu IRIS , đi kèm với thư viện Sckit-learn. Bộ dữ liệu chứa 3 lớp gồm 50 trường hợp, trong đó mỗi lớp đề cập đến một loại cây iris. Ở đây chúng ta sẽ sử dụng mô hình GaussianNB, đã có sẵn trong Thư viện Sckit-learn.

Nhập thư viện và tải dữ liệu

from sklearn import datasets
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB

 

dataset = datasets.load_iris()

Tạo mô hình Naive Bayes của chúng tôi bằng Sckit-learn

Ở đây chúng ta có một  GaussianNB() phương thức thực hiện chính xác các chức năng giống như mã được giải thích ở trên:

model = GaussianNB()
model.fit(dataset.data, dataset.target)

Dự đoán

expected = dataset.target
predicted = model.predict(dataset.data)

Lấy độ chính xác và thống kê

Ở đây chúng tôi sẽ tạo một báo cáo phân loại có chứa các số liệu thống kê khác nhau cần thiết để đánh giá một mô hình. Sau đó, chúng tôi sẽ tạo ra một ma trận nhầm lẫn sẽ cho chúng tôi một ý tưởng rõ ràng về độ chính xác và sự phù hợp của mô hình.

print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

Báo cáo phân loại:

Ma trận hỗn loạn:

Như bạn có thể thấy, hàng trăm dòng mã có thể được tóm tắt thành một vài dòng mã với thư viện mạnh mẽ này.

Vì vậy, với điều này, chúng ta đi đến phần cuối của hướng dẫn Naive Bayes này. Xin chúc mừng, bạn không còn là người mới đến Naive Bayes! Tôi hy vọng bạn thích bài viết này. Hãy thử ví dụ đơn giản này trên hệ thống của bạn bây giờ.

|