Chuyển đến nội dung chính

Machine Learning trong R cho người mới bắt đầu

Hướng dẫn nhỏ này nhằm giới thiệu cho bạn những kiến thức cơ bản về machine learning trong R: nó sẽ chỉ cho bạn cách dùng R để làm việc với KNN.
· 15 phút đọc

Khám phá cùng AI

Giới thiệu: Machine Learning trong R

Machine learning là một nhánh của khoa học máy tính nghiên cứu việc thiết kế các thuật toán có khả năng học. Những nhiệm vụ điển hình của machine learning gồm học khái niệm, học hàm hoặc “mô hình dự đoán”, phân cụm và tìm mẫu có khả năng dự đoán. Các nhiệm vụ này được học từ dữ liệu sẵn có được quan sát qua trải nghiệm hoặc hướng dẫn, chẳng hạn. Machine learning kỳ vọng rằng khi đưa trải nghiệm vào các nhiệm vụ, việc học sẽ ngày càng được cải thiện. Mục tiêu cuối cùng là cải thiện việc học đến mức tự động, để con người như chúng ta không cần can thiệp nữa.

Hướng dẫn nhỏ này nhằm giới thiệu cho bạn những điều cơ bản về machine learning trong R: cụ thể hơn, nó sẽ chỉ cho bạn cách dùng R để làm việc với thuật toán machine learning nổi tiếng “KNN” hay k-láng giềng gần nhất.

Nếu bạn muốn theo học một khóa, hãy cân nhắc xem qua khóa Introduction to Machine Learning with R hoặc khóa Unsupervised Learning in R của DataCamp!

Sử dụng R cho k-Nearest Neighbors (KNN)

Thuật toán KNN hay k-láng giềng gần nhất là một trong những thuật toán machine learning đơn giản nhất và là ví dụ của học dựa trên thể hiện (instance-based learning), trong đó dữ liệu mới được phân loại dựa trên các thể hiện đã lưu và có nhãn.

Cụ thể hơn, khoảng cách giữa dữ liệu đã lưu và thể hiện mới được tính bằng một số phép đo tương đồng. Phép đo tương đồng này thường được biểu diễn bởi một thước đo khoảng cách như khoảng cách Euclid, độ tương đồng cosine hoặc khoảng cách Manhattan.

Nói cách khác, mức độ tương đồng với dữ liệu đã có trong hệ thống sẽ được tính cho mọi điểm dữ liệu mới mà bạn đưa vào hệ thống.

Sau đó, bạn dùng giá trị tương đồng này để thực hiện mô hình dự đoán. Mô hình dự đoán có thể là phân loại, gán nhãn hoặc lớp cho thể hiện mới, hoặc hồi quy, gán một giá trị cho thể hiện mới. Việc bạn phân loại hay gán giá trị cho thể hiện mới dĩ nhiên phụ thuộc vào cách bạn xây dựng mô hình KNN.

Thuật toán k-láng giềng gần nhất bổ sung cho thuật toán cơ bản ở chỗ sau khi tính khoảng cách từ điểm mới đến tất cả các điểm dữ liệu đã lưu, các giá trị khoảng cách được sắp xếp và k láng giềng gần nhất được xác định. Nhãn của các láng giềng này được thu thập và một phép bỏ phiếu đa số hoặc bỏ phiếu có trọng số được dùng cho mục đích phân loại hoặc hồi quy.

Nói cách khác, điểm dữ liệu đã lưu nào có điểm số cao hơn thì khả năng thể hiện mới nhận cùng phân loại với láng giềng đó càng lớn. Trong trường hợp hồi quy, giá trị được gán cho điểm dữ liệu mới là trung bình của k láng giềng gần nhất.



Bước Một. Lấy Dữ liệu của bạn

Machine learning thường bắt đầu từ dữ liệu quan sát được. Bạn có thể dùng bộ dữ liệu của riêng mình hoặc tìm kiếm qua các nguồn khác để tìm một bộ phù hợp.

Bộ dữ liệu tích hợp trong R

Hướng dẫn này sử dụng bộ dữ liệu Iris, vốn rất nổi tiếng trong lĩnh vực machine learning. Bộ dữ liệu này được tích hợp sẵn trong R, nên bạn có thể xem bằng cách gõ vào console như sau:

iris

Kho lưu trữ Machine Learning UC Irvine

Nếu bạn muốn tải bộ dữ liệu thay vì dùng bộ tích hợp trong R, bạn có thể truy cập UC Irvine Machine Learning Repository và tìm bộ dữ liệu Iris.


Mẹo: đừng chỉ xem thư mục dữ liệu của bộ Iris, mà hãy xem cả trang mô tả dữ liệu nữa!

Sau đó, dùng lệnh sau để nạp dữ liệu:

# Read in `iris` data
iris <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), 
                 header = FALSE) 

# Print first lines
head(iris)

# Add column names
names(iris) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")

# Check the result
iris

Lệnh này đọc file .csv hay “Comma Separated Value” từ trang web. Tham số header được đặt là FALSE, nghĩa là bộ dữ liệu Iris từ nguồn này không có tên thuộc tính.

Thay vì tên thuộc tính, bạn có thể thấy các tên cột lạ như “V1” hoặc “V2” khi bạn xem thuộc tính iris với hàm như head(). Những tên này được đặt ngẫu nhiên.

Để đơn giản hóa việc làm việc với dữ liệu, bạn nên tự đặt tên cột: bạn có thể làm điều này qua hàm names(), hàm này lấy hoặc đặt tên của một đối tượng. Ghép các tên thuộc tính theo cách bạn muốn hiển thị. Trong khối mã trên, bạn sẽ liệt kê Sepal.Length, Sepal.Width, Petal.Length, Petal.Width và Species.

Một lần nữa, những tên này không phải tự nhiên mà có: hãy xem mô tả bộ dữ liệu ở liên kết phía trên; Bạn sẽ thấy các tên này được liệt kê.

Học Python cho Khoa học Dữ liệu với DataCamp

Bước Hai. Hiểu Dữ liệu của bạn

Giờ bạn đã nạp bộ dữ liệu Iris vào RStudio, bạn nên cố gắng hiểu thật kỹ dữ liệu của mình nói về điều gì. Chỉ nhìn hoặc đọc về dữ liệu chắc chắn không đủ để bắt đầu!

Bạn cần “xắn tay áo”, khám phá và trực quan hóa bộ dữ liệu, thậm chí bổ sung kiến thức miền nếu bạn thấy dữ liệu quá xa lạ.

Có lẽ bạn đã có sẵn kiến thức miền cần thiết, nhưng xin nhắc lại, mọi bông hoa đều có đài hoa (sepal) và cánh hoa (petal). Đài hoa bao bọc cánh hoa và thường có màu xanh, giống lá, trong khi cánh hoa thường có màu sắc. Với hoa iris, điều này hơi khác một chút, như bạn thấy ở hình dưới:

machine learning R

Tổng quan ban đầu về Bộ dữ liệu

Trước tiên, bạn có thể hình dung dữ liệu bằng cách vẽ một số biểu đồ, như histogram hoặc boxplot. Tuy nhiên, trong trường hợp này, scatter plot có thể cho bạn cái nhìn rõ ràng: thật thú vị khi xem một biến bị ảnh hưởng bởi biến khác đến mức nào.

Nói cách khác, bạn muốn xem liệu có mối tương quan nào giữa hai biến hay không.

Bạn có thể vẽ scatterplot với ggvis package, chẳng hạn.

Lưu ý rằng trước hết bạn cần nạp package ggvis:

# Load in `ggvis`
library(ggvis)

# Iris scatter plot
iris %>% ggvis(~Sepal.Length, ~Sepal.Width, fill = ~Species) %>% layer_points()

correlation iris

Bạn thấy có tương quan cao giữa chiều dài đài hoa và chiều rộng đài hoa của hoa iris Setosa, trong khi tương quan kém hơn đôi chút với các loài Virginica và Versicolor: các điểm dữ liệu phân tán hơn trên đồ thị và không tạo thành một cụm như trường hợp hoa Setosa.

Scatter plot biểu diễn chiều dài và chiều rộng cánh hoa cho câu chuyện tương tự:

iris %>% ggvis(~Petal.Length, ~Petal.Width, fill = ~Species) %>% layer_points()

scatterplot iris

Bạn thấy biểu đồ này cho thấy tương quan dương giữa chiều dài và chiều rộng cánh hoa cho tất cả các loài có trong bộ dữ liệu Iris. Tất nhiên, bạn có lẽ cần kiểm định giả thuyết này thêm nữa nếu muốn chắc chắn:

# Overall correlation `Petal.Length` and `Petal.Width`
cor(iris$Petal.Length, iris$Petal.Width)

# Return values of `iris` levels 
x=levels(iris$Species)

# Print Setosa correlation matrix
print(x[1])
cor(iris[iris$Species==x[1],1:4])

# Print Versicolor correlation matrix
print(x[2])
cor(iris[iris$Species==x[2],1:4])

# Print Virginica correlation matrix
print(x[3])
cor(iris[iris$Species==x[3],1:4])

Bạn thấy rằng khi gộp cả ba loài, tương quan mạnh hơn một chút so với khi xem riêng từng loài: tương quan tổng thể là 0,96, trong khi với Versicolor là 0,79. Ngược lại, Setosa và Virginica có tương quan giữa chiều dài và chiều rộng cánh hoa lần lượt là 0,31 và 0,32 khi làm tròn.

Mẹo: bạn tò mò về ggvis, biểu đồ hay histogram? Hãy xem hướng dẫn histogram và/hoặc khóa học ggvis.

Sau khi có cái nhìn tổng quan qua trực quan hóa, bạn cũng có thể xem bộ dữ liệu bằng cách nhập

# Return all `iris` data
iris

# Return first 5 lines of `iris`
head(iris)

# Return structure of `iris`
str(iris)

Tuy nhiên, như bạn sẽ thấy từ kết quả lệnh này, đây không phải là cách tốt nhất để kiểm tra kỹ bộ dữ liệu: dữ liệu chiếm nhiều không gian trong console, cản trở bạn hình thành bức tranh rõ ràng. Do đó, tốt hơn là xem xét bộ dữ liệu bằng cách chạy head(iris) hoặc str(iris).

Lưu ý lệnh sau sẽ giúp bạn phân biệt rõ kiểu dữ liệu num và ba mức của thuộc tính Species, vốn là một factor. Điều này rất tiện lợi, vì nhiều bộ phân loại machine learning trong R yêu cầu đặc trưng đích được mã hóa dạng factor.

Hãy nhớ rằng biến factor biểu diễn biến phân loại trong R. Do đó chúng chỉ nhận một số lượng giá trị khác nhau có hạn.

Xem nhanh thuộc tính Species cho bạn biết sự phân chia các loài hoa là 50-50-50. Mặt khác, nếu bạn muốn kiểm tra tỷ lệ phần trăm của thuộc tính Species, bạn có thể yêu cầu một bảng tỷ lệ:

# Division of `Species`
table(iris$Species) 

# Percentual division of `Species`
round(prop.table(table(iris$Species)) * 100, digits = 1)

Lưu ý rằng tham số round làm tròn các giá trị của đối số thứ nhất, prop.table(table(iris$Species))*100 tới số chữ số thập phân chỉ định, ở đây là một chữ số sau dấu phẩy. Bạn có thể điều chỉnh dễ dàng bằng cách đổi giá trị tham số digits.

Hiểu sâu về Dữ liệu

Đừng dừng lại ở cái nhìn cấp cao này! R cho phép bạn đi sâu hơn với hàm summary(). Hàm này sẽ trả về giá trị nhỏ nhất, tứ phân vị thứ nhất, trung vị, trung bình, tứ phân vị thứ ba và giá trị lớn nhất của bộ dữ liệu Iris cho các kiểu số. Với biến lớp, số lượng các factor sẽ được trả về:

# Summary overview of `iris`
summary(....) 

# Refined summary overview
summary(....[c("Petal.Width", "Sepal.Width")])

Như bạn thấy, hàm c() được thêm vào lệnh gốc: các cột petal width và sepal width được nối và sau đó chỉ yêu cầu thống kê tóm tắt cho hai cột này của bộ dữ liệu Iris.

Bước Ba. Tiếp theo làm gì?

Sau khi bạn đã hiểu rõ dữ liệu, bạn phải quyết định các trường hợp sử dụng phù hợp với bộ dữ liệu. Nói cách khác, bạn nghĩ về những gì bộ dữ liệu có thể dạy bạn hoặc những gì bạn có thể học được từ dữ liệu. Từ đó, bạn cân nhắc loại thuật toán nào có thể áp dụng cho bộ dữ liệu để thu được kết quả như kỳ vọng.

Mẹo: hãy nhớ rằng bạn càng quen thuộc với dữ liệu, việc đánh giá trường hợp sử dụng cho bộ dữ liệu cụ thể càng dễ. Điều này cũng đúng khi tìm thuật toán machine learning phù hợp.

Trong hướng dẫn này, bộ dữ liệu Iris sẽ được dùng cho phân loại, một ví dụ của mô hình dự đoán. Thuộc tính cuối cùng của bộ dữ liệu, Species, sẽ là biến đích hay biến mà bạn muốn dự đoán.

Lưu ý rằng bạn cũng có thể lấy một trong các biến số làm biến đích nếu bạn muốn dùng KNN cho hồi quy.

Bước Bốn. Chuẩn bị Môi trường làm việc

Nhiều thuật toán dùng trong machine learning không được tích hợp sẵn trong R. Rất có thể bạn sẽ cần tải về các package muốn dùng khi bắt đầu với machine learning.


Mẹo: bạn đã có ý tưởng về thuật toán học sẽ dùng, nhưng chưa rõ package nào cần? Bạn có thể tìm một tổng quan khá đầy đủ về mọi package được dùng trong R tại đây.

Để minh họa thuật toán KNN, hướng dẫn này làm việc với package class:

library(.....)

Nếu bạn chưa có package này, bạn có thể cài nhanh gọn bằng cách gõ dòng lệnh sau:

install.packages("<package name>")

Nhớ mẹo nerd: nếu bạn không chắc đã có package hay chưa, bạn có thể chạy lệnh sau để kiểm tra!

any(grepl("<name of your package>", installed.packages()))

Bước Năm. Chuẩn bị Dữ liệu

Sau khi khám phá dữ liệu và chuẩn bị môi trường làm việc, cuối cùng bạn có thể tập trung vào nhiệm vụ phía trước: xây dựng mô hình machine learning. Tuy nhiên, trước khi làm điều này, việc chuẩn bị dữ liệu cũng rất quan trọng. Phần sau sẽ nêu hai cách bạn có thể làm: chuẩn hóa dữ liệu (nếu cần) và chia dữ liệu thành tập huấn luyện và tập kiểm tra.

Chuẩn hóa (Normalization)

Trong phần chuẩn bị dữ liệu, bạn có thể cần chuẩn hóa dữ liệu để dữ liệu nhất quán. Với hướng dẫn nhập môn này, chỉ cần nhớ rằng chuẩn hóa giúp thuật toán KNN học dễ hơn. Có hai kiểu chuẩn hóa:

  • chuẩn hóa theo mẫu là điều chỉnh từng mẫu riêng lẻ, còn
  • chuẩn hóa theo đặc trưng là điều chỉnh mỗi đặc trưng theo cùng một cách trên tất cả các mẫu.

Vậy khi nào bạn cần chuẩn hóa bộ dữ liệu?

Tóm lại: khi bạn nghi ngờ dữ liệu không nhất quán.

Bạn có thể dễ dàng thấy điều này khi xem kết quả của hàm summary(). Hãy nhìn giá trị nhỏ nhất và lớn nhất của tất cả các thuộc tính (kiểu số). Nếu bạn thấy một thuộc tính có khoảng giá trị rất rộng, bạn sẽ cần chuẩn hóa, vì điều này đồng nghĩa khoảng cách sẽ bị chi phối bởi đặc trưng đó.

Ví dụ, nếu bộ dữ liệu chỉ có hai thuộc tính, X và Y, và X có giá trị từ 1 đến 1000, còn Y chỉ từ 1 đến 100, thì ảnh hưởng của Y lên hàm khoảng cách thường sẽ bị ảnh hưởng của X lấn át.

Khi bạn chuẩn hóa, bạn điều chỉnh miền giá trị của tất cả đặc trưng, để khoảng cách giữa các biến có miền lớn hơn không bị nhấn mạnh quá mức.

Mẹo: quay lại kết quả summary(iris) và thử xác định xem có cần chuẩn hóa hay không.

Bộ dữ liệu Iris không cần chuẩn hóa: thuộc tính Sepal.Length có giá trị từ 4,3 đến 7,9 và Sepal.Width từ 2 đến 4,4, trong khi Petal.Length từ 1 đến 6,9 và Petal.Width từ 0,1 đến 2,5. Tất cả giá trị của mọi thuộc tính đều nằm trong khoảng 0,1 đến 7,9, có thể xem là chấp nhận được.

Dù vậy, vẫn là ý hay để tìm hiểu chuẩn hóa và tác động của nó, đặc biệt nếu bạn mới làm quen machine learning. Bạn có thể thực hiện chuẩn hóa theo đặc trưng, ví dụ, bằng cách tự viết hàm normalize().

Sau đó, bạn có thể dùng đối số này trong lệnh khác, nơi bạn đưa kết quả chuẩn hóa vào một data frame qua as.data.frame() sau khi hàm lapply() trả về một danh sách cùng độ dài với bộ dữ liệu đầu vào. Mỗi phần tử của danh sách là kết quả của việc áp dụng đối số normalize lên bộ dữ liệu đầu vào:

YourNormalizedDataSet <- as.data.frame(lapply(YourDataSet, normalize))

Hãy thử trong khối DataCamp Light dưới đây!

# Build your own `normalize()` function
normalize <- function(x) {
num <- x - min(x)
denom <- max(x) - min(x)
return (num/denom)
}

# Normalize the `iris` data
iris_norm <- .............(......(iris[1:4], normalize))

# Summarize `iris_norm`
summary(.........)

Với bộ Iris, bạn sẽ áp dụng đối số normalize lên bốn thuộc tính số của bộ dữ liệu (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) và đưa kết quả vào một data frame.

Mẹo: để minh họa kỹ hơn tác động của chuẩn hóa lên bộ dữ liệu, hãy so sánh kết quả sau với phần thống kê tóm tắt của bộ Iris ở bước hai.

Tập Huấn luyện và Tập Kiểm tra

Để đánh giá hiệu năng mô hình sau này, bạn cần chia bộ dữ liệu thành hai phần: tập huấn luyện và tập kiểm tra.

Tập đầu để huấn luyện hệ thống, còn tập sau để đánh giá hệ thống đã học/được huấn luyện. Trên thực tế, việc chia dữ liệu thành hai tập là rời nhau: lựa chọn phổ biến là lấy 2/3 dữ liệu gốc làm tập huấn luyện, còn 1/3 còn lại làm tập kiểm tra.

Một lần xem cuối dữ liệu cho thấy nếu bạn chia hai tập ngay trên bộ dữ liệu hiện có, bạn có thể nhận tập huấn luyện chỉ gồm các loài “Setosa” và “Versicolor”, mà không có “Virginica”. Do đó mô hình sẽ phân loại mọi thể hiện chưa biết thành “Setosa” hoặc “Versicolor”, vì nó không biết sự hiện diện của loài thứ ba trong dữ liệu.

Tóm lại, bạn sẽ nhận dự đoán sai cho tập kiểm tra.

Vì vậy bạn cần đảm bảo cả ba lớp loài đều có mặt trong mô hình huấn luyện. Hơn nữa, số lượng thể hiện của cả ba loài cần xấp xỉ bằng nhau để bạn không thiên vị lớp nào trong dự đoán.

Để tạo tập huấn luyện và kiểm tra, trước tiên bạn đặt seed. Đây là số cho bộ tạo số ngẫu nhiên của R. Ưu điểm lớn nhất của việc đặt seed là bạn có thể nhận cùng một dãy số ngẫu nhiên mỗi khi cung cấp cùng seed cho bộ tạo số ngẫu nhiên.

set.seed(1234)

Sau đó, bạn muốn đảm bảo bộ Iris được xáo trộn và bạn có lượng mỗi loài bằng nhau trong các tập huấn luyện và kiểm tra.

Bạn dùng hàm sample() để lấy mẫu với kích thước bằng số dòng của bộ Iris, tức 150. Bạn lấy mẫu có hoàn lại: bạn chọn từ một vector gồm 2 phần tử và gán 1 hoặc 2 cho 150 dòng của bộ Iris. Việc gán này theo trọng số xác suất 0,67 và 0,33.

ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.67, 0.33))

Lưu ý rằng tham số replace được đặt TRUE: nghĩa là bạn gán 1 hoặc 2 cho một dòng nhất định rồi đặt lại vector 2 phần tử về trạng thái ban đầu. Điều này có nghĩa với các dòng tiếp theo, bạn lại có thể gán 1 hoặc 2 mỗi lần. Xác suất chọn 1 hoặc 2 không nên tỷ lệ theo trọng số giữa các phần tử còn lại, nên bạn chỉ định trọng số xác suất. Cũng lưu ý rằng, dù bạn không thấy trong khối DataCamp Light, seed vẫn được đặt là 1234.

Nhớ rằng bạn muốn tập huấn luyện chiếm 2/3 dữ liệu gốc: đó là lý do bạn gán “1” với xác suất 0,67 và “2” với xác suất 0,33 cho 150 dòng được lấy mẫu.

Bạn có thể dùng mẫu lưu trong biến ind để xác định tập huấn luyện và tập kiểm tra:

# Compose training set
iris.training <- ....[ind==1, 1:4]

# Inspect training set
head(................)

# Compose test set
iris.test <- ....[ind==2, 1:4]

# Inspect test set
head(...........)

Lưu ý rằng, ngoài tỷ lệ 2/3 và 1/3 như đã nêu, bạn không lấy tất cả thuộc tính để tạo tập huấn luyện và kiểm tra. Cụ thể, bạn chỉ lấy Sepal.Length, Sepal.Width, Petal.Length và Petal.Width. Đó là vì bạn thực sự muốn dự đoán thuộc tính thứ năm, Species: đây là biến đích. Tuy nhiên, bạn vẫn muốn đưa nó vào thuật toán KNN, nếu không sẽ không có dự đoán nào cho thuộc tính này.

Do đó, bạn cần lưu trữ nhãn lớp trong các vector factor và chia chúng cho tập huấn luyện và kiểm tra:

# Compose `iris` training labels
iris.trainLabels <- iris[ind==1,5]

# Inspect result
print(iris.trainLabels)

# Compose `iris` test labels
iris.testLabels <- iris[ind==2, 5]

# Inspect result
print(iris.testLabels)

Bước Sáu. Mô hình KNN thực tế

Xây dựng Bộ phân loại của bạn

Sau tất cả bước chuẩn bị, bạn đã đảm bảo toàn bộ dữ liệu đã biết (huấn luyện) được lưu trữ. Chưa có mô hình hay việc học thực sự nào diễn ra cho đến lúc này. Giờ, bạn muốn tìm k láng giềng gần nhất cho tập huấn luyện.

Một cách dễ để làm hai bước này là dùng hàm knn(), hàm dùng thước đo khoảng cách Euclid để tìm k láng giềng gần nhất với thể hiện mới, chưa biết. Ở đây, tham số k là do bạn tự đặt.

Như đã đề cập, các thể hiện mới được phân loại bằng cách nhìn vào bỏ phiếu đa số hoặc bỏ phiếu có trọng số. Trong trường hợp phân loại, điểm dữ liệu có điểm số cao nhất sẽ “thắng” và thể hiện chưa biết nhận nhãn của điểm dữ liệu thắng đó. Nếu có số lượng “thắng” bằng nhau, việc phân loại diễn ra ngẫu nhiên.

Lưu ý: tham số k thường là số lẻ để tránh hòa điểm khi bỏ phiếu.

Để xây dựng bộ phân loại, bạn chỉ cần gọi hàm knn() và thêm một số đối số, như ví dụ sau:

# Build the model
iris_pred <- ...(train = iris.training, test = iris.test, cl = iris.trainLabels, k=3)

# Inspect `iris_pred`
.........

Bạn lưu vào iris_pred kết quả hàm knn() với các đối số là tập huấn luyện, tập kiểm tra, nhãn huấn luyện và số lượng láng giềng bạn muốn tìm. Kết quả của hàm là một vector factor với lớp dự đoán cho mỗi dòng của dữ liệu kiểm tra.

Lưu ý rằng bạn không muốn đưa nhãn kiểm tra vào: chúng sẽ được dùng để xem mô hình có dự đoán đúng lớp thực tế hay không!

Bạn sẽ thấy khi kiểm tra kết quả, iris_pred trả về vector factor với lớp dự đoán cho mỗi dòng của dữ liệu kiểm tra.

Bước Bảy. Đánh giá Mô hình

Một bước thiết yếu tiếp theo trong machine learning là đánh giá hiệu năng mô hình. Nói cách khác, bạn muốn phân tích mức độ đúng đắn của các dự đoán mô hình.

Ở góc nhìn trừu tượng hơn, bạn chỉ cần so sánh kết quả iris_pred với nhãn kiểm tra bạn đã định nghĩa trước đó:

# Put `iris.testLabels` in a data frame
irisTestLabels <- data.frame(...............)

# Merge `iris_pred` and `iris.testLabels` 
merge <- data.frame(........., ...............)

# Specify column names for `merge`
names(.....) <- c("Predicted Species", "Observed Species")

# Inspect `merge` 
merge

Bạn thấy mô hình dự đoán khá chính xác, ngoại trừ một phân loại sai ở dòng 29, nơi dự đoán “Versicolor” trong khi nhãn kiểm tra là “Virginica”.

Đây đã là chỉ dấu về hiệu năng mô hình, nhưng bạn có thể muốn đi sâu hơn. Cho mục đích này, bạn có thể nhập package gmodels:

install.packages("package name")

Tuy nhiên, nếu bạn đã cài package này, bạn chỉ cần nhập

library(gmodels)

Sau đó bạn có thể tạo một bảng chéo hay bảng dự phòng. Loại bảng này thường dùng để hiểu mối quan hệ giữa hai biến. Trong trường hợp này, bạn muốn hiểu cách các lớp của dữ liệu kiểm tra, lưu trong iris.testLabels liên hệ với mô hình của bạn lưu trong iris_pred:

CrossTable(x = iris.testLabels, y = iris_pred, prop.chisq=FALSE)

Crosstable iris knn

Lưu ý rằng tham số cuối prop.chisq cho biết có bao gồm hay không phần đóng góp chi-bình phương của mỗi ô. Thống kê chi-bình phương là tổng các đóng góp từ từng ô riêng lẻ và dùng để quyết định sự khác biệt giữa giá trị quan sát và kỳ vọng có ý nghĩa hay không.

Từ bảng này, bạn có thể suy ra số dự đoán đúng và sai: một thể hiện trong tập kiểm tra được mô hình gán nhãn Versicolor, trong khi thực tế là loài Virginica. Bạn có thể thấy điều này ở hàng đầu tiên của loài “Virginica” trong cột iris.testLabels. Các trường hợp khác đều dự đoán đúng. Bạn có thể kết luận hiệu năng mô hình đủ tốt và bạn không cần cải thiện thêm!

Học Python cho Khoa học Dữ liệu với DataCamp

Machine Learning trong R với caret

Ở các phần trước, bạn đã bắt đầu với học có giám sát trong R qua thuật toán KNN. Như bạn có thể thấy, machine learning trong R có thể trở nên khá phức tạp, vì có nhiều thuật toán với cú pháp khác nhau, tham số khác nhau, v.v. Có lẽ bạn sẽ đồng ý rằng việc nhớ tên các package khác nhau cho từng thuật toán có thể khá khó, hoặc áp dụng cú pháp cho từng thuật toán cụ thể là quá nhiều.

Đó là lúc package caret trở nên hữu ích: đây là viết tắt của “Classification and Regression Training” và cung cấp mọi thứ bạn cần để giải quyết bài toán học có giám sát: nó mang đến một giao diện thống nhất cho rất nhiều thuật toán machine learning. Nếu bạn quen thuộc một chút với machine learning bằng Python, bạn có thể thấy điểm tương đồng với scikit-learn!

Tiếp theo, bạn sẽ đi qua các bước như trên, nhưng lần này, bạn sẽ dùng caret để phân loại dữ liệu. Lưu ý rằng bạn đã làm được rất nhiều nếu đã theo các bước ở trên: bạn đã nắm dữ liệu, đã khám phá, đã chuẩn bị môi trường, v.v. Giờ là lúc tiền xử lý dữ liệu với caret!

Như trước đây, bạn có thể nghiên cứu tác động của chuẩn hóa, nhưng bạn sẽ thấy điều này ở phần sau của hướng dẫn.

Bạn đã biết bước tiếp theo rồi! Hãy chia dữ liệu thành tập huấn luyện và kiểm tra. Tuy nhiên, trong trường hợp này, bạn xử lý hơi khác: bạn chia dữ liệu dựa trên nhãn trong iris$Species. Ngoài ra, tỷ lệ ở đây là 75-25 cho hai tập huấn luyện và kiểm tra.

# Create index to split based on labels  
index <- createDataPartition(iris$Species, p=0.75, list=FALSE)

# Subset training set with index
iris.training <- iris[.......,]

# Subset test set with index
iris.test <- iris[-.........,]

Bạn đã sẵn sàng để huấn luyện mô hình rồi! Nhưng, như bạn nhớ, caret là một dự án cực kỳ lớn bao gồm nhiều thuật toán. Nếu bạn phân vân thuật toán nào được bao gồm, bạn có thể lấy danh sách tất cả. Hiển thị danh sách bằng cách chạy names(getModelInfo()), như khối mã dưới đây minh họa. Tiếp theo, chọn một thuật toán và huấn luyện mô hình với hàm train():

# Overview of algos supported by caret
names(getModelInfo())

# Train a model
model_knn <- train(iris.training[, 1:4], iris.training[, 5], method='knn')

Lưu ý rằng việc tạo mô hình khác trở nên cực kỳ đơn giản khi bạn đã đi xa đến đây; Bạn chỉ cần đổi tham số method, như ví dụ sau:

model_cart <- train(iris.training[, 1:4], iris.training[, 5], method='rpart2')

Giờ bạn đã huấn luyện mô hình, đến lúc dự đoán nhãn cho tập kiểm tra vừa tạo và đánh giá mô hình hoạt động ra sao với dữ liệu của bạn:

# Predict the labels of the test set
predictions<-predict(object=model_knn,iris.test[,1:4])

# Evaluate the predictions
table(predictions)

# Confusion matrix 
confusionMatrix(predictions,iris.test[,5])

Bên cạnh đó, bạn có thể thử thực hiện lại bài test như trước, để kiểm tra tác động của tiền xử lý, như scale và center, lên mô hình. Chạy khối mã sau:

Tiến tới Big Data

Chúc mừng! Bạn đã hoàn thành hướng dẫn này!

Hướng dẫn này chủ yếu tập trung vào việc thực hiện thuật toán machine learning cơ bản KNN với R. Bộ dữ liệu Iris được dùng nhỏ và dễ bao quát; Không chỉ bạn thấy cách tự thực hiện mọi bước, mà bạn cũng đã thấy cách dễ dàng sử dụng một giao diện thống nhất, như caret cung cấp, để khởi động machine learning của bạn.

Nhưng bạn còn có thể làm được nhiều hơn thế!

Nếu bạn đã thử nghiệm đủ với các kiến thức cơ bản được trình bày trong hướng dẫn này và các thuật toán machine learning khác, bạn có thể sẽ muốn đi xa hơn với R và phân tích dữ liệu.

Chủ đề

Liên quan