Trong hướng dẫn Kaggle này, bạn sẽ học cách tiếp cận và xây dựng các mô hình học có giám sát với sự hỗ trợ của phân tích dữ liệu thăm dò (EDA) trên dữ liệu Titanic.
Đầu tháng này, tôi đã thực hiện một buổi Facebook Live Code Along, trong đó tôi (và mọi người cùng lập trình theo) xây dựng một số thuật toán với độ phức tạp tăng dần để dự đoán liệu một hành khách bất kỳ trên tàu Titanic có sống sót hay không, dựa trên dữ liệu như giá vé họ đã trả, nơi họ lên tàu và tuổi của họ.
Trong bài viết này, bạn sẽ xem lại một số nội dung chúng ta đã đề cập trong buổi đó. Nếu muốn xem lại hoặc theo dõi bài viết này cùng với video, bạn có thể xem tại đây:
Đặc biệt, bạn có thể vẫn nhớ rằng chúng ta đã xây dựng các mô hình học có giám sát.
Học có giám sát là nhánh của Machine Learning (ML) liên quan đến việc dự đoán nhãn, chẳng hạn như "Sống sót" hoặc "Không". Những mô hình này học từ dữ liệu đã gắn nhãn, tức là dữ liệu bao gồm việc hành khách có sống sót hay không (gọi là "huấn luyện mô hình"), rồi sau đó dự đoán trên dữ liệu chưa gắn nhãn.
Trên Kaggle, một nền tảng cho các cuộc thi mô hình dự đoán và phân tích, chúng được gọi là tập huấn luyện và tập kiểm tra vì
Bạn muốn xây dựng một mô hình học được các mẫu trong tập huấn luyện, và
Sau đó dùng mô hình để đưa ra dự đoán trên tập kiểm tra.
Sau đó Kaggle cho bạn biết tỷ lệ bạn dự đoán đúng: đây được gọi là độ chính xác (accuracy) của mô hình.
Bắt đầu với Học có Giám sát như thế nào
Như bạn có thể đã biết, một cách tiếp cận tốt cho học có giám sát là như sau:
Thực hiện Phân tích Dữ liệu Thăm dò (EDA) trên bộ dữ liệu của bạn;
Xây dựng một mô hình nhanh và đơn giản, hay mô hình chuẩn (baseline), để làm mốc so sánh với các mô hình sau này bạn sẽ xây dựng;
Lặp lại quy trình này. Bạn sẽ EDA thêm và xây dựng một mô hình khác;
Thiết kế đặc trưng (feature engineering): lấy các đặc trưng sẵn có và kết hợp chúng hoặc trích xuất thêm thông tin để cuối cùng đi đến điểm cuối cùng, đó là
Có được một mô hình hoạt động tốt hơn.
Trong buổi code along này, bạn đã hoặc sẽ làm tất cả các bước trên!
Lưu ý chúng tôi cũng có các khóa học giúp bạn bắt đầu với machine learning cho bộ dữ liệu Titanic bằng Python và R.
Nhập Dữ liệu và Khám phá Nhanh
Bước đầu tiên luôn là nhập dữ liệu để nhanh chóng xem qua dữ liệu bạn sẽ làm việc. Trong trường hợp này, bạn sẽ nhập gói pandas và dùng hàm read_csv() để đọc dữ liệu:
Lưu ý rằng trong các khối mã bên dưới, những gói và module khác như matplotlib, sklearn và seaborn đã được nhập sẵn. Bạn sẽ dùng chúng nhiều hơn sau này cho việc trực quan hóa dữ liệu (thống kê) và mục đích machine learning!
Bạn cũng sử dụng lệnh magic của IPython %matplotlib inline để các biểu đồ hiển thị ngay trong notebook. Bạn thêm sns.set() để đổi phong cách trực quan hóa về phong cách Seaborn cơ bản:
# Import modulesimport pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.metrics import accuracy_score
# Figures inline and set visualization style%matplotlib inline
sns.set()Được hỗ trợ bởi
Không chần chừ nữa, hãy nhập dữ liệu và thực hiện bước đầu tiên trong việc kiểm tra dữ liệu:
# Import test and train datasets
df_train = pd.read_csv('../data/train.csv')
df_test = pd.read_csv('../data/test.csv')# View first lines of training data
df_train.head(n=4)Được hỗ trợ bởi
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
0
1
0
3
Braund, Mr. Owen Harris
male
22.0
1
0
A/5 21171
7.2500
NaN
S
1
2
1
1
Cumings, Mrs. John Bradley (Florence Briggs Th...
female
38.0
1
0
PC 17599
71.2833
C85
C
2
3
1
3
Heikkinen, Miss. Laina
female
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
3
4
1
1
Futrelle, Mrs. Jacques Heath (Lily May Peel)
female
35.0
1
0
113803
53.1000
C123
S
Nếu bạn muốn xem tất cả các đặc trưng này là gì, hãy tham khảo tài liệu dữ liệu Kaggle tại đây.
Trước khi tiếp tục, sẽ hữu ích nếu lưu ý một số thuật ngữ sau:
Biến mục tiêu là biến bạn cố gắng dự đoán;
Các biến khác được gọi là "đặc trưng" (hoặc "biến dự đoán", là những đặc trưng bạn dùng để dự đoán biến mục tiêu).
Với điều này trong đầu, bạn có thể tiếp tục khám phá dữ liệu với, chẳng hạn, hàm head(), dùng để lấy ra năm hàng đầu tiên của bộ dữ liệu:
# View first lines of test data
df_test.head()Được hỗ trợ bởi
PassengerId
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
0
892
3
Kelly, Mr. James
male
34.5
0
0
330911
7.8292
NaN
Q
1
893
3
Wilkes, Mrs. James (Ellen Needs)
female
47.0
1
0
363272
7.0000
NaN
S
2
894
2
Myles, Mr. Thomas Francis
male
62.0
0
0
240276
9.6875
NaN
Q
3
895
3
Wirz, Mr. Albert
male
27.0
0
0
315154
8.6625
NaN
S
4
896
3
Hirvonen, Mrs. Alexander (Helga E Lindqvist)
female
22.0
1
1
3101298
12.2875
NaN
S
Lưu ý rằng DataFrame df_test không có cột 'Survived' vì đây chính là thứ bạn sẽ cố gắng dự đoán!
Bạn cũng có thể dùng phương thức DataFrame .info() để xem kiểu dữ liệu, giá trị khuyết và hơn thế nữa (của df_train).
<class'pandas.core.frame.DataFrame'>RangeIndex:891 entries,0 to 890
Data columns(total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes:float64(2),int64(5),object(5)
memory usage:83.6+KBĐược hỗ trợ bởi
Trong trường hợp này, bạn thấy chỉ có 714 giá trị không null cho cột 'Age' trong một DataFrame có 891 hàng. Điều này có nghĩa là có 177 giá trị null hoặc bị thiếu.
Ngoài ra, dùng phương thức DataFrame .describe() để xem thống kê tóm tắt của các cột số (của df_train).
74% phụ nữ sống sót, trong khi 19% nam giới sống sót.
Giờ hãy xây dựng mô hình thứ hai và dự đoán rằng tất cả phụ nữ đều sống sót còn tất cả đàn ông thì không. Một lần nữa, đây là mô hình thiếu thực tế, nhưng nó sẽ cung cấp mốc chuẩn để so sánh với các mô hình sau.
Tạo cột 'Survived' cho df_test mã hóa dự đoán trên.
Lưu các cột 'PassengerId' và 'Survived' của df_test ra .csv và nộp lên Kaggle.
df_test['Survived']= df_test.Sex =='female'
df_test['Survived']= df_test.Survived.apply(lambda x:int(x))
df_test.head()Được hỗ trợ bởi
PassengerId
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Survived
0
892
3
Kelly, Mr. James
male
34.5
0
0
330911
7.8292
NaN
Q
0
1
893
3
Wilkes, Mrs. James (Ellen Needs)
female
47.0
1
0
363272
7.0000
NaN
S
1
2
894
2
Myles, Mr. Thomas Francis
male
62.0
0
0
240276
9.6875
NaN
Q
0
3
895
3
Wirz, Mr. Albert
male
27.0
0
0
315154
8.6625
NaN
S
0
4
896
3
Hirvonen, Mrs. Alexander (Helga E Lindqvist)
female
22.0
1
1
3101298
12.2875
NaN
S
1
df_test[['PassengerId','Survived']].to_csv('../data/predictions/women_survive.csv', index=False)Được hỗ trợ bởi
Vậy, khi bạn nộp mô hình này lên Kaggle thì độ chính xác là bao nhiêu?
Độ chính xác trên Kaggle là 76.6%:
Với lần nộp này, bạn đã tăng khoảng 2.000 bậc trên bảng xếp hạng! Đồng thời, bạn đã cải thiện điểm số, vậy là làm rất tốt!
Khám phá Dữ liệu thêm nữa!
Dùng seaborn để vẽ các biểu đồ cột của đặc trưng 'Survived' được chia (facet) theo đặc trưng 'Pclass' của bộ dữ liệu Titanic.
sns.factorplot(x='Survived', col='Pclass', kind='count', data=df_train);Được hỗ trợ bởi
Kết luận: Hành khách đi hạng nhất có khả năng sống sót cao hơn. Ngược lại, hành khách đi hạng ba ít có khả năng sống sót.
Dùng seaborn để vẽ các biểu đồ cột của đặc trưng 'Survived' được chia (facet) theo đặc trưng 'Embarked'.
sns.factorplot(x='Survived', col='Embarked', kind='count', data=df_train);Được hỗ trợ bởi
Kết luận: Hành khách lên tàu tại Southampton ít có khả năng sống sót hơn.
EDA với các biến số
Dùng seaborn để vẽ biểu đồ tần suất cho cột 'Fare' của df_train.
Dùng seaborn để vẽ biểu đồ scatter giữa 'Age' và 'Fare', tô màu theo 'Survived'.
sns.lmplot(x='Age', y='Fare', hue='Survived', data=df_train, fit_reg=False, scatter_kws={'alpha':0.5});Được hỗ trợ bởi
Kết luận: Có vẻ những người sống sót hoặc là trả khá nhiều tiền cho vé hoặc là còn trẻ.
Dùng seaborn để tạo pairplot của df_train, tô màu theo 'Survived'. Pairplot là cách tuyệt vời để hiển thị hầu hết thông tin bạn đã phát hiện trong một lưới biểu đồ duy nhất.
khám phá trực quan biến mục tiêu và đưa ra dự đoán đầu tiên.
khám phá trực quan một số biến đặc trưng và đưa ra nhiều dự đoán tốt hơn dựa trên EDA.
thực hiện EDA chuyên sâu với các biến đặc trưng, cả phân loại và số.
Trong bài tiếp theo, bạn sẽ dành thời gian xây dựng một số mô hình Machine Learning, dựa trên những gì bạn đã học từ EDA ở đây. Chúng ta sẽ làm điều này trong bài tiếp theo của dự án (ra mắt vào ngày 27 tháng 12).
Đầu tháng này, tôi đã thực hiện một buổi Facebook Live Code Along, trong đó tôi (và mọi người cùng lập trình theo) xây dựng một số thuật toán với độ phức tạp tăng dần để dự đoán liệu một hành khách bất kỳ trên tàu Titanic có sống sót hay không, dựa trên dữ liệu như giá vé họ đã trả, nơi họ lên tàu và tuổi của họ.
Trong bài viết này, bạn sẽ xem lại một số nội dung chúng ta đã đề cập trong buổi đó. Nếu muốn xem lại hoặc theo dõi bài viết này cùng với video, bạn có thể xem tại đây:
Đặc biệt, bạn có thể vẫn nhớ rằng chúng ta đã xây dựng các mô hình học có giám sát.
Học có giám sát là nhánh của Machine Learning (ML) liên quan đến việc dự đoán nhãn, chẳng hạn như "Sống sót" hoặc "Không". Những mô hình này học từ dữ liệu đã gắn nhãn, tức là dữ liệu bao gồm việc hành khách có sống sót hay không (gọi là "huấn luyện mô hình"), rồi sau đó dự đoán trên dữ liệu chưa gắn nhãn.
Trên Kaggle, một nền tảng cho các cuộc thi mô hình dự đoán và phân tích, chúng được gọi là tập huấn luyện và tập kiểm tra vì
Sau đó Kaggle cho bạn biết tỷ lệ bạn dự đoán đúng: đây được gọi là độ chính xác (accuracy) của mô hình.
Bắt đầu với Học có Giám sát như thế nào
Như bạn có thể đã biết, một cách tiếp cận tốt cho học có giám sát là như sau:
Trong buổi code along này, bạn đã hoặc sẽ làm tất cả các bước trên!
Lưu ý chúng tôi cũng có các khóa học giúp bạn bắt đầu với machine learning cho bộ dữ liệu Titanic bằng Python và R.
Nhập Dữ liệu và Khám phá Nhanh
Bước đầu tiên luôn là nhập dữ liệu để nhanh chóng xem qua dữ liệu bạn sẽ làm việc. Trong trường hợp này, bạn sẽ nhập gói
pandasvà dùng hàmread_csv()để đọc dữ liệu:Lưu ý rằng trong các khối mã bên dưới, những gói và module khác như
matplotlib,sklearnvàseabornđã được nhập sẵn. Bạn sẽ dùng chúng nhiều hơn sau này cho việc trực quan hóa dữ liệu (thống kê) và mục đích machine learning!Bạn cũng sử dụng lệnh magic của IPython
%matplotlib inlineđể các biểu đồ hiển thị ngay trong notebook. Bạn thêmsns.set()để đổi phong cách trực quan hóa về phong cách Seaborn cơ bản:Không chần chừ nữa, hãy nhập dữ liệu và thực hiện bước đầu tiên trong việc kiểm tra dữ liệu:
Nếu bạn muốn xem tất cả các đặc trưng này là gì, hãy tham khảo tài liệu dữ liệu Kaggle tại đây.
Trước khi tiếp tục, sẽ hữu ích nếu lưu ý một số thuật ngữ sau:
Với điều này trong đầu, bạn có thể tiếp tục khám phá dữ liệu với, chẳng hạn, hàm
head(), dùng để lấy ra năm hàng đầu tiên của bộ dữ liệu:Lưu ý rằng DataFrame
df_testkhông có cột'Survived'vì đây chính là thứ bạn sẽ cố gắng dự đoán!.info()để xem kiểu dữ liệu, giá trị khuyết và hơn thế nữa (củadf_train).Trong trường hợp này, bạn thấy chỉ có 714 giá trị không null cho cột 'Age' trong một DataFrame có 891 hàng. Điều này có nghĩa là có 177 giá trị null hoặc bị thiếu.
.describe()để xem thống kê tóm tắt của các cột số (củadf_train).EDA trực quan và Mô hình đầu tiên của bạn
Bây giờ bạn đã có hình dung về dữ liệu và đã xem qua một số thống kê, đã đến lúc trực quan hóa dữ liệu với gói
seaborn:seabornđể vẽ biểu đồ cột về sống sót trên Titanic, đây là biến mục tiêu của bạn.Kết luận: trong tập huấn luyện, số người sống sót ít hơn số người không sống sót. Vậy hãy xây dựng mô hình đầu tiên dự đoán rằng không ai sống sót.
Đây là một mô hình tệ vì bạn biết là có người sống sót. Nhưng nó cho ta một mốc chuẩn: bất kỳ mô hình nào xây sau này cần làm tốt hơn mô hình này.
Bạn có thể làm như sau:
'Survived'chodf_testmã hóa "không sống sót" cho tất cả các hàng;'PassengerId'và'Survived'củadf_testra .csv và nộp lên Kaggle.Độ chính xác mô hình này cho bạn là bao nhiêu? Độ chính xác trên Kaggle là 62.7.
Không quá tệ!
Lưu ý quan trọng! Bạn cũng sẽ muốn dùng các độ đo khác ngoài accuracy!
EDA trên các biến đặc trưng
Sau khi đã có một mô hình nhanh-gọn, đã đến lúc lặp lại: hãy làm EDA thêm và sớm xây dựng một mô hình khác!
seabornđể vẽ biểu đồ cột cho đặc trưng'Sex'của bộ dữ liệu Titanic (củadf_train).seabornđể vẽ các biểu đồ cột của đặc trưng'Survived'được chia (facet) theo đặc trưng'Sex'.Kết luận: Phụ nữ có khả năng sống sót cao hơn nam giới.
pandasđể xem có bao nhiêu phụ nữ và bao nhiêu đàn ông đã sống sót:pandasđể tính tỷ lệ phụ nữ sống sót và tỷ lệ đàn ông sống sót:74% phụ nữ sống sót, trong khi 19% nam giới sống sót.
Giờ hãy xây dựng mô hình thứ hai và dự đoán rằng tất cả phụ nữ đều sống sót còn tất cả đàn ông thì không. Một lần nữa, đây là mô hình thiếu thực tế, nhưng nó sẽ cung cấp mốc chuẩn để so sánh với các mô hình sau.
'Survived'chodf_testmã hóa dự đoán trên.'PassengerId'và'Survived'củadf_testra .csv và nộp lên Kaggle.Vậy, khi bạn nộp mô hình này lên Kaggle thì độ chính xác là bao nhiêu?
Độ chính xác trên Kaggle là 76.6%:
Với lần nộp này, bạn đã tăng khoảng 2.000 bậc trên bảng xếp hạng! Đồng thời, bạn đã cải thiện điểm số, vậy là làm rất tốt!
Khám phá Dữ liệu thêm nữa!
seabornđể vẽ các biểu đồ cột của đặc trưng'Survived'được chia (facet) theo đặc trưng'Pclass'của bộ dữ liệu Titanic.Kết luận: Hành khách đi hạng nhất có khả năng sống sót cao hơn. Ngược lại, hành khách đi hạng ba ít có khả năng sống sót.
seabornđể vẽ các biểu đồ cột của đặc trưng'Survived'được chia (facet) theo đặc trưng'Embarked'.Kết luận: Hành khách lên tàu tại Southampton ít có khả năng sống sót hơn.
EDA với các biến số
seabornđể vẽ biểu đồ tần suất cho cột'Fare'củadf_train.Kết luận: Phần lớn hành khách trả dưới 100 cho chuyến đi trên Titanic.
pandasđể vẽ cột'Fare'cho từng giá trị của'Survived'trên cùng một biểu đồ.Kết luận: Có vẻ như những người trả nhiều tiền hơn có cơ hội sống sót cao hơn.
seabornđể vẽ biểu đồ tần suất của cột'Age'trongdf_train. Bạn cần loại bỏ giá trị null trước khi vẽ.'Fare'với'Survived'trên trục x.Kết luận: Giá vé rõ ràng có tương quan với khả năng sống sót trên Titanic.
.describe()để xem thống kê tóm tắt của'Fare'theo tình trạng sống sót.seabornđể vẽ biểu đồ scatter giữa'Age'và'Fare', tô màu theo'Survived'.Kết luận: Có vẻ những người sống sót hoặc là trả khá nhiều tiền cho vé hoặc là còn trẻ.
seabornđể tạo pairplot củadf_train, tô màu theo'Survived'. Pairplot là cách tuyệt vời để hiển thị hầu hết thông tin bạn đã phát hiện trong một lưới biểu đồ duy nhất.Từ EDA đến Mô hình Machine Learning
Trong hướng dẫn này, bạn đã thành công:
Trong bài tiếp theo, bạn sẽ dành thời gian xây dựng một số mô hình Machine Learning, dựa trên những gì bạn đã học từ EDA ở đây. Chúng ta sẽ làm điều này trong bài tiếp theo của dự án (ra mắt vào ngày 27 tháng 12).