🚢 Ứng dụng Titanic: Dự đoán khả năng sống sót với Machine Learning
Chào mừng các bạn đến với bài viết của tôi! Hôm nay, tôi rất vui mừng chia sẻ về dự án mới nhất của mình: một ứng dụng web tương tác được xây dựng bằng Streamlit để khám phá bộ dữ liệu Titanic nổi tiếng. Ứng dụng này không chỉ cho phép bạn trực quan hóa các thống kê quan trọng về hành khách mà còn bao gồm một mô hình Machine Learning (Random Forest) để dự đoán khả năng sống sót dựa trên các đặc điểm bạn chọn.
✨ Demo & Mã nguồn
Hãy thử nghiệm ứng dụng trực tiếp: Dự đoán khả năng sống sót Titanic
Khám phá mã nguồn trên GitHub
⭐ Nếu bạn thích dự án này, hãy để lại một sao cho repo nhé!
💡 Mẹo: Tạo một GIF ngắn về ứng dụng của bạn đang hoạt động và lưu trữ nó trên một trang như Imgur để nhúng vào đây. Nó rất hiệu quả!
🛠️ Công nghệ sử dụng
Dưới đây là những công nghệ tôi đã sử dụng:
- Streamlit: Để xây dựng giao diện web nhanh chóng (chỉ cần Python, không cần HTML/CSS/JS)
- Pandas: Để thao tác và làm sạch dữ liệu
- Scikit-Learn: Huấn luyện RandomForestClassifier, hoạt động tốt ngay từ đầu
- Plotly & Seaborn: Để tạo trực quan hóa tương tác và tĩnh
🔬 Cách thức hoạt động
Dự án được chia thành ba bước chính:
1. Khám phá & Trực quan hóa dữ liệu (EDA)
Phần đầu tiên của ứng dụng dành cho phân tích khám phá. Tôi đã sử dụng Plotly và Seaborn để xây dựng các trực quan hóa trả lời các câu hỏi như:
- Giới tính có ảnh hưởng đến khả năng sống sót không?
- Hạng vé có vai trò gì không?
- Độ tuổi được phân bố giữa những người sống sót và không sống sót như thế nào?
Dưới đây là một đoạn mã nhỏ cho thấy cách tôi hiển thị biểu đồ tròn về sự sống sót theo giới tính:
python
import plotly.express as px
# Tạo DataFrame cho biểu đồ
gender_survival = df.groupby('Sex')['Survived'].value_counts(normalize=True).unstack().fillna(0)
gender_survival = (gender_survival * 100).round(2)
# Hiển thị với Plotly
fig = px.pie( names=['Không sống sót', 'Sống sót'],
values=gender_survival.loc[selected_gender],
title=f"Tỷ lệ sống sót theo giới tính: {selected_gender}"
)
st.plotly_chart(fig)
2. Huấn luyện mô hình Machine Learning
Tôi đã chọn RandomForestClassifier do tính mạnh mẽ và hiệu suất tốt ngay từ đầu. Quy trình làm việc khá tiêu chuẩn:
- Làm sạch dữ liệu: Thay thế các giá trị thiếu (ví dụ, điền độ tuổi thiếu bằng độ tuổi trung bình).
- Kỹ thuật đặc trưng: Chuyển đổi các biến phân loại (như giới tính hoặc cảng xuất phát) thành giá trị số.
- Huấn luyện: Chia dữ liệu thành tập huấn luyện và tập kiểm tra, sau đó huấn luyện mô hình trên dữ liệu huấn luyện.
python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# Định nghĩa các đặc trưng (X) và mục tiêu (y)
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']
X = df[features]
y = df['Survived']
# Mã hóa các biến phân loại
X = pd.get_dummies(X, columns=['Sex'], drop_first=True)
# Chia dữ liệu và huấn luyện
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
3. Tạo giao diện dự đoán
Đây là nơi mà ma thuật của Streamlit xảy ra. Tôi đã sử dụng thanh bên (st.sidebar) để tạo một biểu mẫu nơi người dùng có thể nhập dữ liệu của riêng mình (hạng, giới tính, độ tuổi, v.v.).
python
# Thanh bên để nhập liệu của người dùng
st.sidebar.header("Hãy dự đoán khả năng sống sót của bạn:")
pclass = st.sidebar.selectbox('Hạng vé', [1, 2, 3])
sex = st.sidebar.selectbox('Giới tính', ['nam', 'nữ'])
age = st.sidebar.slider('Độ tuổi', 0, 100, 25)
# ... các đầu vào khác
# Dự đoán ngay lập tức
if st.sidebar.button("Dự đoán khả năng sống sót của tôi"):
# Tạo DataFrame với các đầu vào của người dùng
user_input = pd.DataFrame(...)
# Thực hiện dự đoán
prediction = model.predict(user_input)
# Hiển thị kết quả
if prediction[0] == 1:
st.sidebar.success("Chúc mừng! Bạn có thể sống sót!")
else:
st.sidebar.error("Xin lỗi... Bạn có thể không sống sót.")
🏁 Kết luận
Dự án này là một cơ hội tuyệt vời để kết hợp phân tích dữ liệu, machine learning và phát triển web một cách rất dễ tiếp cận. Streamlit luôn khiến tôi ấn tượng với cách nó giúp xây dựng các ứng dụng dữ liệu tương tác dễ dàng như vậy.
Tôi rất muốn nghe ý kiến phản hồi từ bạn! Bạn nghĩ sao về ứng dụng này? Có bất kỳ trực quan hóa hoặc tính năng nào bạn muốn thấy thêm không? Cảm ơn bạn đã đọc bài viết!
Các thực hành tốt nhất
- Kiểm tra mô hình: Đảm bảo rằng bạn kiểm tra mô hình trên dữ liệu không thấy trước.
- Tối ưu hóa mô hình: Thực hiện tinh chỉnh hyperparameter để cải thiện độ chính xác.
Những cạm bẫy thường gặp
- Dữ liệu thiếu: Không xử lý đúng cách các dữ liệu thiếu có thể làm sai lệch kết quả.
- Quá khớp: Đảm bảo không để mô hình quá khớp với dữ liệu huấn luyện.
Mẹo hiệu suất
- Tối ưu hóa mã: Sử dụng các thư viện như Numba để tăng tốc độ xử lý.
- Chia nhỏ dữ liệu: Nếu dữ liệu quá lớn, hãy chia nhỏ để xử lý từng phần.
Giải quyết sự cố
- Lỗi không tìm thấy dữ liệu: Nếu không tìm thấy dữ liệu, hãy kiểm tra lại đường dẫn.
- Dự đoán không chính xác: Kiểm tra lại các bước tiền xử lý dữ liệu của bạn.
Câu hỏi thường gặp (FAQ)
- Tôi cần kiến thức gì để bắt đầu với dự án này?
Bạn nên có kiến thức cơ bản về Python, Pandas và Scikit-Learn. - Làm thế nào để triển khai ứng dụng?
Bạn có thể triển khai ứng dụng của mình lên Heroku hoặc Streamlit Sharing.
Hy vọng bài viết này sẽ giúp ích cho bạn trong việc phát triển ứng dụng của mình!