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

Hướng dẫn thi Kaggle: Machine Learning từ Titanic

Chuẩn bị cho cuộc thi Kaggle đầu tiên của bạn với hướng dẫn từng bước này.
· 9 phút đọc

Khám phá cùng AI

Trong hướng dẫn này, chúng ta sẽ đi qua bộ dữ liệu Titanic, phân tích và nộp kết quả vào cuộc thi thực tế. Bạn đã biết cách lấy dữ liệu và nhập vào Kaggle Notebook trong hướng dẫn này. Giờ đây, chúng ta sẽ dùng DataLab làm sổ tay khoa học dữ liệu. Bạn sẽ học cách dùng cả hai công cụ trên các nền tảng khác nhau để có thể chọn công cụ ưa thích.

Trước tiên, truy cập mục "Competitions" trên Kaggle và tìm Titanic (Hình 5.4). Trước khi đi thẳng vào notebook, bạn nên hiểu tất cả thông tin trong các mục "Description and Rules". Việc xem notebook của những người dùng khác cũng quan trọng, vì điều đó có thể gợi thêm ý tưởng cho lời giải.

Hình 5.4: Titanic - Machine Learning from Disaster

Cuộc thi yêu cầu dùng machine learning để tạo mô hình dự đoán hành khách nào đã sống sót sau vụ đắm tàu Titanic. Chúng ta sẽ dùng một bộ dữ liệu gồm thông tin hành khách như tên, giới tính, tuổi, v.v. Sẽ có 2 bộ dữ liệu khác nhau được sử dụng. Bộ thứ nhất là 'train.csv'. Trong bộ này, ngoài thông tin hành khách còn có nhãn đúng như 'survived' và 'not survived'. Ở bộ dữ liệu thứ hai có tên 'test.csv', sẽ không có các giá trị ground truth, vì chúng ta được yêu cầu dự đoán và nộp kết quả.

Tệp nộp bài chỉ có 2 cột: PassengerId và Survived. Hệ thống nộp bài sẽ báo lỗi nếu bạn tải lên tệp có nhiều hơn 2 giá trị. Lưu ý bạn có thể nộp tối đa 10 lần mỗi ngày.

Dựa trên thông tin trong mục "Competition Description", bước tiếp theo là lấy dữ liệu về DataLab và phân tích dữ liệu.

Trước hết, bạn cần tải bộ dữ liệu trong Data Explorer bằng cách vào thẻ Data (Hình 5.5). Bạn nên tải cả 'train.csv' và 'test.csv'.

Sau khi tải tệp, bạn chuyển đến DataLab. Lưu ý bạn cần tạo tài khoản trước. Việc tạo tài khoản và sử dụng DataLab là miễn phí.

Bạn có thể dễ dàng kéo thả tệp vào phía bên trái của notebook (Hình 5.6).

Hình 5.5: Tải bộ dữ liệu
Hình 5.6: Thêm bộ dữ liệu vào DataLab

Bước tiếp theo là xem từ điển dữ liệu trong phần mô tả bộ dữ liệu. Điều này sẽ giúp chúng ta quyết định cột nào cần trực quan hóa.

  • survival: Sống sót
  • pclass: Hạng vé
  • sex: Giới tính
  • Age: Tuổi tính theo năm
  • sibsp: Số anh/chị/em ruột / vợ/chồng đi cùng trên Titanic
  • parch: Số cha/mẹ / con cái đi cùng trên Titanic
  • ticket: Số vé
  • fare: Giá vé
  • cabin: Số cabin
  • embarked: Cảng lên tàu

Nhập dữ liệu

Bạn có thể dùng lệnh bash trong jupyter notebook bằng cách đặt dấu chấm than trước ô lệnh. Chúng ta sẽ kiểm tra vị trí các tệp dữ liệu đã tải lên bằng lệnh pwd và ls.

!pwd; ls

/work/files/workspace

notebook.ipynb test.csv train.csv

Pandas là một thư viện Python dùng cho thao tác và phân tích dữ liệu. Giờ chúng ta đã loại bỏ các cột Ticket, Name và PassengerId vì chúng không có dữ liệu số hoặc phân loại có ý nghĩa. Bây giờ bạn sẽ thấy các đặc trưng còn lại để sử dụng.

Ở vài dòng tiếp theo, các tệp dữ liệu huấn luyện và kiểm thử được đọc bằng phương thức read_csv của Pandas. Lưu ý các cột Survived và PassengerId lần lượt được thêm vào các dataframe train và test. Chúng ta sẽ đưa mô hình học lần lượt bằng các đặc trưng trong columns_to_be_added_as_features và nhãn trong cột Survived. Nhưng để đơn giản hóa tiền xử lý, ta có thể gộp chúng tạm thời. Biến test_df_matcher cũng bao gồm PassengerId. Chúng ta sẽ dùng nó để khớp PassengerId với các dự đoán của tập kiểm thử, nhằm tạo tệp CSV sẽ được tải lên Kaggle làm kết quả.

import pandas as pd
columns_to_be_added_as_features = ['Sex','Age','SibSp','Parch','Pclass','Fare','Embarked']
train_df = pd.read_csv('train.csv', usecols=columns_to_be_added_as_features + ['Survived'])
test_df_matcher = pd.read_csv('test.csv', usecols=columns_to_be_added_as_features + ['PassengerId'])
test_df = test_df[columns_to_be_added_as_features]

Với phương thức head(), ta có thể xem 5 dòng đầu tiên cùng tên cột. Bạn có thể định số dòng đầu hiển thị bằng tham số trong phương thức head(). Số dòng của tập huấn luyện và tập kiểm thử lần lượt được in ra ở ô lệnh sau.

print(train_df.head())
Hình 5.7: Dataframe
print("Number of rows in training set: {}".format(len(train_df)))
print("Number of rows in test set: {}".format(len(test_df)))

Số dòng trong tập huấn luyện: 891 Số dòng trong tập kiểm thử: 418

Tiền xử lý

Chúng ta nên chuyển kiểu giá trị sang float, kiểu sẽ được dùng làm đặc trưng cho mô hình. Việc chuyển đổi này cho phép thực hiện các phép toán số khi chuẩn hóa dữ liệu.

for column_title in columns_to_be_added_as_features:
    if column_title in ['Embarked', "Sex"]:
        continue
    train_df[column_title] = pd.to_numeric(train_df[column_title], downcast="float")
    test_df[column_title] = pd.to_numeric(test_df[column_title], downcast="float")

train_df["Survived"] = pd.to_numeric(train_df["Survived"], downcast="float")

Chúng ta cần đưa mô hình học bằng các giá trị số. Trong đoạn mã dưới đây, các chuỗi được chuyển thành giá trị số

train_df['Embarked'].replace('Q', 0,inplace=True)
train_df['Embarked'].replace('S', 1,inplace=True)
train_df['Embarked'].replace('C', 2,inplace=True)

test_df['Embarked'].replace('Q', 0,inplace=True)
test_df['Embarked'].replace('S', 1,inplace=True)
test_df['Embarked'].replace('C', 2,inplace=True)

train_df['Sex'].replace('male', 0,inplace=True)
train_df['Sex'].replace('female', 1,inplace=True)

test_df['Sex'].replace('male', 0,inplace=True)
test_df['Sex'].replace('female', 1,inplace=True)

print(train_df.head())
Hình 5.8: Dataframe với giá trị số

Bên dưới, tất cả đặc trưng được chuẩn hóa, nghĩa là được co giãn về khoảng từ 0 đến 1 trong trường hợp này.

#Credit: Michael Aquilina,
#https://stackoverflow.com/questions/26414913/normalize-columns-of-pandas-data-frame
def normalize(df):
    result = df.copy()
    for feature_name in df.columns:
        max_value = df[feature_name].max()
        min_value = df[feature_name].min()
        result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)
    return result

train_df = normalize(train_df)
test_df = normalize(test_df)

print(train_df.head())
Hình 5.9: Dataframe đã chuẩn hóa

Vì bộ dữ liệu sẽ được chia thành huấn luyện và kiểm định, chúng ta sẽ xáo trộn dữ liệu trước để tránh việc các nhóm chỉ rơi vào một tập.

#Credit: Kris, https://stackoverflow.com/questions/29576430/shuffle-dataframe-rows
train_df = train_df.sample(frac=1).reset_index(drop=True)

Tất cả giá trị trống sẽ được thay bằng 0; lựa chọn này nhằm tiết kiệm thời gian. Tuy nhiên, bạn có thể đọc hướng dẫn này để học cách xử lý giá trị thiếu trong machine learning.

train_df = train_df.fillna(0)
test_df = test_df.fillna(0)

Dưới đây, tỷ lệ kiểm định được đặt là 0,2, nghĩa là 20% dữ liệu sẽ dùng để kiểm định. Để tách bộ dữ liệu thành tập huấn luyện và kiểm định, chúng ta sẽ dùng phương thức train_test_split của Sklearn. Sau đó chúng ta sẽ tách đặc trưng và nhãn như ở 4 dòng cuối của đoạn mã dưới đây.

validation_set_ratio = 0.2
validation_set_size = int(len(train_df)*validation_set_ratio)
training_set_size = len(train_df) - validation_set_size

print("Total set size: {}".format(len(train_df)))
print("Training set size: {}".format(training_set_size))
print("Validation set size: {}".format(validation_set_size))

from sklearn.model_selection import train_test_split

train, val = train_test_split(train_df, test_size=validation_set_ratio)

train_X = train[columns_to_be_added_as_features]
train_Label = train[['Survived']]

val_X = val[columns_to_be_added_as_features]
val_Label = val[['Survived']]

Huấn luyện

Support vector machines là các mô hình học có giám sát dùng cho phân loại và hồi quy. Mô hình này được chọn với các tham số bên dưới. Bạn nên thử các mô hình khác với nhiều tổ hợp tham số khác nhau. Không cần chạy dừng mã mỗi lần muốn chỉnh tham số hay thử mô hình khác, vì bạn có thể tự động hóa quá trình này. Nếu bạn quan tâm đến Support Vector Machines, bạn có thể xem hướng dẫn Support Vector Machines với Scikit-learn trên DataCamp.

from sklearn.svm import SVC

SVM_KERNEL = "linear"
SVM_C = 10
SVM_GAMMA = 0.00001

svm_model = SVC(kernel = SVM_KERNEL, C = SVM_C, gamma = SVM_GAMMA)
svm_model.fit(train_X, train_Label)

Lấy dự đoán cho tập kiểm định

Ở phần này, chúng ta sẽ đưa đặc trưng của tập kiểm định vào mô hình và lấy dự đoán. Sau đó so sánh với các giá trị ground truth. Phương thức metrics.accuracy_score của Sklearn được dùng để việc tính độ chính xác dễ hơn. Độ chính xác trên tập kiểm định được tính là 0,799, đây là khởi đầu tốt.

from sklearn import metrics

y_pred = svm_model.predict(val_X)
print("Accuracy:",metrics.accuracy_score(val_Label, y_pred))

Accuracy: 0.7988826815642458

Lấy dự đoán cho tập kiểm thử

Giờ chúng ta tiến hành lấy dự đoán cho tập kiểm thử thực tế. Vì không có giá trị ground truth cho tập kiểm thử, chúng ta chỉ biết độ chính xác sau khi tải tệp dự đoán lên Kaggle.

test_pred = svm_model.predict(test_df)

Tạo Dataframe đầu ra

Cột PassengerId được lấy từ dataframe tên test_df_matcher. Khi trả về trực tiếp, kiểu của giá trị trả về sẽ là Series. Vì vậy, chúng ta sẽ ép kiểu sang DataFrame của Pandas. Sau đó chèn các dự đoán của tập kiểm thử làm cột thứ hai của dataframe.

result = pd.DataFrame(test_df_matcher['PassengerId'])
print(result.head(10))
Hình 5.10: Dataframe PassengerId
result.insert(1, "Survived", test_pred, True)
result["Survived"] = pd.to_numeric(result["Survived"], downcast="integer")
print(result.head(10))
Hình 5.11: Dataframe hoàn chỉnh

Tạo tệp đầu ra

Cuối cùng, định dạng đầu ra đã sẵn sàng. Ở bước cuối, các giá trị chỉ mục sẽ được loại bỏ bằng cách truyền False cho tham số index. Giờ bạn có thể tải tệp đã tạo và tải lên Kaggle. Bằng cách này, bạn sẽ biết độ chính xác của tập kiểm thử, sau đó bạn sẽ được xếp hạng trên bảng xếp hạng.

result.to_csv("out.csv", index=False)

Chúng ta sẽ quay lại trang cuộc thi, nhấp "Submit Predictions" rồi tải tệp dự đoán lên. Sau vài giây, bạn sẽ nhận được độ chính xác trên tập kiểm thử (Hình 5.12).

Hình 5.12: Độ chính xác của tập kiểm thử

Kết luận

Trong hướng dẫn này, bạn đã học cách phân tích một bộ dữ liệu và nộp kết quả vào một cuộc thi Kaggle. Nếu bạn thích tham gia các cuộc thi khoa học dữ liệu, bạn có thể tìm hiểu thêm về DataCamp Competitions tại đây.

Chủ đề

Liên quan