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.
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ả.
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("Number of rows in training set: {}".format(len(train_df)))print("Number of rows in test set: {}".format(len(test_df)))Được hỗ trợ bởi
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")Được hỗ trợ bởi
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ố
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-framedefnormalize(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())Được hỗ trợ bởi
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)Được hỗ trợ bởi
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)Được hỗ trợ bởi
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']]Được hỗ trợ bởi
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)Được hỗ trợ bởi
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))Được hỗ trợ bởi
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.
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))Được hỗ trợ bởi
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))Được hỗ trợ bởi
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.
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.
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.
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).
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.
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.
/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ả.
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.
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.
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ố
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.