Kaggle’s Titanic Competition: Chapter 2 – From icebergs to trees

Titanic

Titanic

Ở phần trước, chúng ta đã phân tích một số đặc trưng của tập dữ liệu để xác định rằng giới tính là tác nhân chính ảnh hưởng đến tỉ lệ sống sót. Thuật toán cây quyết định (decision tree) sẽ giúp ta tự động hóa quá trình này và xuất ra flowchart giúp chúng ta dễ dàng diễn giải kết quả dự đoán.

Về mặt khái niệm, thuật toán cây quyết định lấy tập dữ liệu đưa qua nút gốc (root node). Sau đó, dữ liệu được quét qua các thuộc tính phân nhóm. Khi chọn được một thuộc tính phân nhóm, ta sẽ tiếp tục phân nhóm cho đến hết thuộc tính của cây. Nút cuối cùng nằm ở đáy của cây cho biết kết quả dự đoán của mô hình.

Để tạo được cây quyết định, ta cần sử dụng rpart package. R packages là tập hợp các hàm, dữ liệu và mã lệnh được cài đặt sẵn giúp giảm tải công việc cài đặt thuật toán. Thay vì viết các thuật toán từ đầu chí cuối, bạn có thể dùng rpart package để cài đặt thuật toán cây quyết định.

# Load in the R package  
library(rpart)

Áp dụng thuật toán cây quyết định (Decision tree)

Ta sẽ sử dụng hàm rpart() để xây dụng mô hình cây quyết định. Hàm rpart() cần một số thông số như formula: chứa thông tin thuộc tính phân lớp (survived) và các thuộc tính hỗ trợ cho việc ra quyết định (sex, age).

# Build the decision tree
my_tree_two <- rpart(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data=train, method="class")

# Visualize the decision tree using plot() and text()
plot(my_tree_two)
text(my_tree_two)
Decision tree 1

Decision tree 1

Nếu bạn chạy thử dòng lệnh trên, ta nhận được biểu đồ không mấy rõ ràng. May thay, R có các package giúp cho việc biểu diễn thông tin trực quan hơn.

# Load in the packages to create a fancified version of your tree
library(rattle)
library(rpart.plot)
library(RColorBrewer)

# Time to plot your fancified tree
fancyRpartPlot(my_tree_two)
Decision tree 2

Decision tree 2

Dự đoán và submit kết quả lên Kaggle

Để submit kết quả lên Kaggle bạn cần dự đoán tỉ lệ sống sót trên tập dữ liệu test. Ở bài viết trước ta có xây dựng mô hình dự đoán đơn giản chỉ dựa trên một thuộc tính duy nhất là giới tính. May thay, với mô hình cây quyết định của chúng ta ta có thể nâng cao kết quả dự đoán với nhiều thuộc tính hơn.

# Make your prediction using the test set
my_prediction <- predict(my_tree_two, test, type = "class")

# Create a data frame with two columns: PassengerId &amp; Survived. Survived contains your predictions
my_solution <- data.frame(PassengerId = test$PassengerId, Survived = my_prediction)

# Check that your data frame has 418 entries
nrow(my_solution)

# Write your solution to a csv file with the name my_solution.csv
write.csv(my_solution, file = "my_solution.csv", row.names = FALSE)

# Current accuracy
0.78469

Quá khớp (Overfitting), nhược điểm của cây quyêts định

Nếu bạn đã submit kết quả của mình thì thứ hạng ở leaderboard của ta được nâng lên so với kết quả ban đầu. Chúng ta vẫn có thể xây dựng mô hình này phức tạp hơn. Trong rpart, ta có thể giới hạn chiều cao của cây quyết định qua hai thông số cp (xác định ngưỡng để cây quyết định ngừng phân nhánh) và minsplit (giới hạn tập dữ liệu huấn luyện).

# Create a new decision tree my_tree_three
my_tree_three <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data=train, method="class", control=rpart.control(minsplit=50, cp=0))
  
# Visualize your new decision tree
fancyRpartPlot(my_tree_three)
Decision tree 3

Decision tree 3

Tuy nhiên, khi submit mô hình trên ta sẽ không cải thiện được độ chính xác vì mô hình của ta bị quá khớp (overfitting: độ lỗi của mô hình dự đoán thấp trên tập huấn luyện nhưng cao trên tập test, một trong những lý do đó là xây dựng mô hình dựa vào quá nhiều thuộc tính). Do đó, chúng ta cần áp dụng kĩ thuật “feature engineering” cho tập dữ liệu.

Feature engineering cho tập dữ liệu Titanic

Data Science là nghệ thuật cần có bàn tay của con người đặt vào. Tái cấu trúc lại tập thuộc tính (feature engineering): nghĩa là ta sẽ tùy ý tạo ra các tập thuộc tính mới có khả năng phân lớp tốt hơn bằng cách kết hợp các thuộc tính sẵn có.

Giả sử ta tạo thêm một thuộc tính mới là family_size do ta thấy đây là một giả định hợp lý. Vì số lượng thành viên trong gia đình càng nhiều thì sẽ tốn nhiều thời gian hơn để sơ tán, dẫn đến tỉ lệ sống sót sẽ bị giảm. family_size được xác định bởi thuộc tính SibSb và Parch, cho biết số lượng thành viên trong gia đình mà hành khách này đi cùng. Ta sẽ tạo family_size cho tập dữ liệu huấn luyện và tập dữ liệu test.

# create a new train set with the new variable
train_two <- train
train_two$family_size <- train$SibSp + train$Parch + 1

# Create a new decision tree my_tree_three
my_tree_four <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked + family_size, data=train_two, method="class")
  
# Visualize your new decision tree
fancyRpartPlot(my_tree_four)
Decision tree 4

Decision tree 4

Sau khi thực hiện kĩ thuật trên ta đã cải thiện độ chính xác của mô hình lên 0.80383

Current rank

Current rank

Nguồn tham khảo: https://www.kaggle.com/c/titanic

Tham khảo thêm:

Advertisements

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