
Xây dựng dự án danh mục đầu tư khoa học dữ liệu từ đầu đến cuối
Hầu hết các hồ sơ chỉ dừng lại ở một cuốn sổ tay. Hãy đưa hồ sơ của bạn đi xa hơn.
Các dự án thực sự giúp ứng viên được tuyển dụng có điểm khác biệt. Chúng bắt đầu bằng một vấn đề kinh doanh và kết thúc bằng một khuyến nghị, đồng thời thể hiện mọi giai đoạn ở giữa. Việc trình bày mọi giai đoạn, từ dữ liệu thô đến ứng dụng đã triển khai, là điều mà sơ yếu lý lịch không thể chứng minh và một notebook không thể làm giả.
Để cụ thể hóa, chúng ta sẽ sử dụng một dự án thực tế xuyên suốt: dự án dữ liệu Dự đoán Thời gian Giao hàng của DoorDash. Đây là một dự án miễn phí, vì vậy độc giả có thể làm theo và tự xây dựng.
Chúng ta sẽ thực hiện dự án này trong môi trường notebook tích hợp của StrataScratch, một notebook Marimo tích hợp mà độc giả có thể mở bằng cách nhấp vào "Start Solving" trên trang dự án, do đó không cần cài đặt gì trước khi bắt đầu.
Vì vậy, đây là những gì chúng ta sẽ làm. Chúng ta sẽ lấy một dự án đó và thực hiện qua chín giai đoạn của một dự án khoa học dữ liệu thực tế: xác định vấn đề kinh doanh, lấy dữ liệu bằng SQL, làm sạch dữ liệu trong Python, khám phá dữ liệu, thiết kế tính năng, xây dựng và đánh giá mô hình, và cuối cùng là triển khai kết quả dưới dạng API và một bảng điều khiển (dashboard) kết thúc bằng một khuyến nghị.
Mỗi giai đoạn là một chương của cùng một câu chuyện, và mỗi giai đoạn là điều mà nhà tuyển dụng có thể tự mình xem xét. Đến cuối cùng, độc giả sẽ có một mẫu mà có thể áp dụng cho hầu hết mọi dự án.
# Bắt đầu với một vấn đề kinh doanh
Trước khi viết bất kỳ đoạn mã nào, hãy quyết định vấn đề thực sự cần giải quyết.
Dự án DoorDash đưa ra một câu hỏi kinh doanh rõ ràng: với một đơn hàng, thời gian giao hàng sẽ là bao lâu? Cách đặt vấn đề này rất quan trọng. Nó xoay quanh những gì doanh nghiệp quan tâm, không phải thuật toán.
Đây là điểm đầu tiên mà hầu hết các danh mục dự án thường mắc lỗi.
Một dự án có tiêu đề "Dự đoán Thời gian Giao hàng" cho nhà tuyển dụng biết những gì bạn đã làm cho công ty. Một dự án có tiêu đề "XGBoost Regression Demo" cho họ biết bạn đã làm theo một hướng dẫn.
Hãy đặt vấn đề xoay quanh kết quả, và chọn một vấn đề có ý nghĩa thực sự: tỷ lệ khách hàng rời bỏ (churn), dự báo, gian lận, hoặc, trong trường hợp của chúng ta, hiệu quả hoạt động.
# Trích xuất dữ liệu bằng SQL
Dự án DoorDash cung cấp cho chúng ta một tệp CSV, historical_data.csv:
Nhưng đó không phải là nơi dữ liệu tồn tại trong thế giới thực. Trong một công ty, tập dữ liệu này sẽ đến từ một cơ sở dữ liệu, và bạn sẽ là người viết SQL để xây dựng nó.
Chúng ta mô phỏng điều này bằng cách sử dụng notebook tích hợp đã đề cập trước đó, vì tập dữ liệu đã được nhập (dưới dạng df). Chúng ta truy vấn trực tiếp bằng SQL. (Nếu đó là một cơ sở dữ liệu thực tế, bạn sẽ truy vấn nó với FROM historical_data.)
SELECT
market_id,
created_at,
actual_delivery_time,
store_id,
store_primary_category,
order_protocol,
total_items,
subtotal,
total_onshift_dashers,
total_busy_dashers,
total_outstanding_orders
FROM df
WHERE actual_delivery_time IS NOT NULL
AND actual_delivery_time > created_at;
Đầu ra:
market_id
created_at
actual_delivery_time
...
total_outstanding_orders
1
2015-02-06 22:24:17
2015-02-06 23:27:16
...
21
2
2015-02-10 21:49:25
2015-02-10 22:56:29
...
2
3
2015-01-22 20:39:28
2015-01-22 21:09:09
...
0
3
2015-02-03 21:21:45
2015-02-03 22:13:00
...
2
3
2015-02-15 02:40:36
2015-02-15 03:20:26
...
9
...
...
...
...
...
1
2015-02-08 19:24:33
2015-02-08 20:01:41
...
23
Đây là một điểm đáng thể hiện trong hồ sơ năng lực.
Thay vì chỉ tải một tệp tin, cần mô tả truy vấn sẽ tạo ra tập dữ liệu: các phép nối (join) giữa các bảng order, dasher và store, các bộ lọc WHERE loại bỏ các hàng không hợp lệ, và các mệnh đề GROUP BY thực hiện việc lọc và nối dữ liệu chuyên sâu trong SQL – sau đó kéo một bảng sẵn sàng để phân tích vào Python, thay vì một bản sao thô.
# Làm sạch dữ liệu trong Python
Hiện tại, dữ liệu được đưa vào Python. Đây là giai đoạn ít được chú ý nhưng chiếm 60 đến 80% công việc khoa học dữ liệu thực tế, và việc bỏ qua giai đoạn này là một trong những dấu hiệu rõ ràng nhất của sự thiếu kinh nghiệm.
Đối với dữ liệu của DoorDash, việc làm sạch có nghĩa là tính toán mục tiêu của chúng ta (thời lượng giao hàng thực tế là dấu thời gian giao hàng trừ đi dấu thời gian tạo đơn hàng), sửa các kiểu dữ liệu và xử lý các giá trị bị thiếu hoặc không hợp lệ.
Chúng ta sử dụng pandas cho công việc này, đây là lựa chọn mặc định phù hợp ở quy mô hồ sơ năng lực.
df["created_at"] = pd.to_datetime(df["created_at"])
df["actual_delivery_time"] = pd.to_datetime(df["actual_delivery_time"])
# Mục tiêu của chúng ta: thời gian giao hàng thực tế, tính bằng giây
df["delivery_duration_seconds"] = (
df["actual_delivery_time"] - df["created_at"]
).dt.total_seconds()
# Loại bỏ các giá trị bị thiếu và không hợp lệ
# Một lần giao hàng thực tế thường kéo dài từ 6 phút đến vài giờ
df2 = df[df["delivery_duration_seconds"].between(60, 3 * 3600)]
df3 = df2.dropna(subset=["delivery_duration_seconds"])
df3
Đầu ra:
market_id
created_at
actual_delivery_time
delivery_duration_seconds
1
2015-02-06 22:24:17
2015-02-06 23:27:16
3779.0
2
2015-02-10 21:49:25
2015-02-10 22:56:29
4024.0
3
2015-01-22 20:39:28
2015-01-22 21:09:09
1781.0
3
2015-02-03 21:21:45
2015-02-03 22:13:00
3075.0
…
...
...
...
3
2015-02-15 02:40:36
2015-02-15 03:20:26
2390.0
Nếu tập dữ liệu đủ lớn để gây quá tải bộ nhớ, Polars sẽ là một lựa chọn thay thế nhanh hơn, đa lõi, nhưng đối với một dự án như thế này, pandas là đủ.
import polars as pl
df = pl.read_csv(
"historical_data.csv",
null_values=["NA"],
try_parse_dates=True
)
df = df.with_columns(
(pl.col("actual_delivery_time") - pl.col("created
Nguồn tin: KDnuggets — Tác giả: Nate Rosidi. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.