Chương 1·Bài 1.1

Bài toán học máy

Bài 1Pha màu

Xưởng pha màu trộn ba loại bột. Cột sun và moon là tỉ lệ của hai loại bột đầu trong hỗn hợp, còn cột label là độ đỏ của màu sau khi trộn. Hãy học từ các mẻ cũ để đoán độ đỏ của các mẻ mới.

Làm theo đúng quy trình của bài học. Học mô hình trên train.csv, chẳng hạn LinearRegression, với feature là các cột ghi trong feature_columns của input.json. Đo MAE trên valid.csv và so với cách đoán mọi mẻ bằng trung bình label của train. Mô hình tốt thì phải hơn hẳn cách đoán ấy. Cuối cùng dự đoán cho test.csv, giữ đúng thứ tự hàng.

Dữ liệu vào

Mỗi thư mục test có train.csv (8080 hàng) và valid.csv (2020 hàng) với các cột id, sun, moon, label, và test.csv (2020 hàng) chưa có label.

Kết quả

Một đối tượng JSON {"predictions": [...]} gồm 2020 dự đoán theo thứ tự hàng của test.csv.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Một test được điểm khi MAE trên test không quá 1.51.5.

Bài 2Iris

Bộ dữ liệu Iris ghi bốn số đo của mỗi bông hoa, tính bằng cm, gồm chiều dài và chiều rộng của đài hoa và của cánh hoa. Mỗi bông thuộc một trong ba loài, mã hóa thành 00 (setosa), 11 (versicolor) và 22 (virginica). Mã 0,1,20, 1, 2 chỉ là tên lớp, nên đây là bài classification.

Hãy học từ train.csv, kiểm trên valid.csv, rồi đoán loài của các hoa trong test.csv. Chưa cần hiểu thuật toán bên trong. KNeighborsClassifier(n_neighbors=5) của scikit-learn dùng như một hộp đen là đủ, chỉ cần fit và predict. Thước đo là accuracy, tức tỉ lệ hoa đoán đúng loài.

Dữ liệu vào

Mỗi thư mục test có train.csv và valid.csv gồm id, bốn feature f0 đến f3 và label, cùng test.csv chưa có label. Mỗi test chia 150150 bông hoa theo một cách khác.

Kết quả

Một đối tượng JSON {"predictions": [...]}, mỗi hàng của test.csv một số 00, 11 hoặc 22.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Một test được điểm khi accuracy trên test từ 0.80.8 trở lên.

Bài 3Chữ số

Mỗi ảnh là một chữ số viết tay, thu nhỏ thành lưới 8×88\times8 ô, mỗi ô có độ đậm từ 00 đến 1616. Lưới được trải thành một hàng 6464 số f0, …, f63, đọc lần lượt từng hàng của lưới. Nhãn là chữ số từ 00 đến 99.

Hãy học từ train.csv, kiểm trên valid.csv, rồi đoán chữ số cho các ảnh trong test.csv. SVC(gamma=0.001) của scikit-learn dùng như hộp đen là đủ, thuật toán này sẽ học ở bài 2.8.

Muốn xem một ảnh, lấy 6464 số của hàng ấy, reshape(8, 8) rồi vẽ bằng plt.imshow. Thử xem vài ảnh bị đoán sai trên validation, nhiều khi chính mắt người cũng phân vân.

Dữ liệu vào

Mỗi thư mục test có train.csv và valid.csv gồm id, 6464 feature và label, cùng test.csv chưa có label. Mỗi test chia 17971797 ảnh theo một cách khác.

Kết quả

Một đối tượng JSON {"predictions": [...]}, mỗi hàng của test.csv một chữ số.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Một test được điểm khi accuracy trên test từ 0.90.9 trở lên.

Bài 4Hằng số

Baseline đơn giản nhất là đoán cùng một số cc cho mọi mẫu. Nhưng nên chọn cc bằng bao nhiêu? Câu trả lời tùy vào thước đo ta dùng để học.

Cho các nhãn train y1,…,yny_1, \dots, y_n. Hãy tìm hai hằng số:

  • c_square: số cc làm tổng bình phương sai số ∑i(yi−c)2\sum_i (y_i-c)^2 nhỏ nhất.
  • c_abs: số cc làm tổng trị tuyệt đối sai số ∑i∣yi−c∣\sum_i |y_i-c| nhỏ nhất. Nếu có nhiều số cùng đạt nhỏ nhất, lấy số nhỏ nhất trong chúng.

Rồi chấm cả hai trên tập validation bằng MAE, được valid_mae_square và valid_mae_abs.

Gợi ý: thử vẽ hai tổng trên như hàm số của cc với vài nhãn nhỏ, chẳng hạn 1,2,101, 2, 10. Một tổng là parabol, tổng kia là đường gấp khúc.

Dữ liệu vào

Một đối tượng JSON gồm hai list số nguyên train và valid.

Kết quả

Một đối tượng JSON gồm c_square, c_abs, valid_mae_square, valid_mae_abs.

Giới hạn

  • Mỗi list có từ 11 đến 10001000 phần tử, mỗi nhãn từ 00 đến 10410^4.

Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{"train": [20, 30, 40, 100], "valid": [25, 35]}

Output mẫu

{
  "c_square": 47.5,
  "c_abs": 30,
  "valid_mae_square": 17.5,
  "valid_mae_abs": 5.0
}

Bài 5Đặt ghế

Trở lại chuyện đặt ghế của câu lạc bộ trong bài học. Phòng được thuê theo số ghế, mỗi ghế tốn α\alpha đồng, dù có người ngồi hay không. Mỗi người đến mà hết ghế phải ra về, câu lạc bộ mất β\beta đồng. Thiếu ghế đắt hơn thừa ghế, tức α<β\alpha<\beta.

Thuê gg ghế cho một buổi có aa người đến thì tốn

L(g,a)=αg+βmax⁡(0, a−g).L(g,a)=\alpha g+\beta\max(0,\,a-g).

Câu lạc bộ biết số người đến của nn buổi trước, a1,…,ana_1, \dots, a_n. Hãy chọn một số ghế nguyên g≥0g\ge0 dùng cho mọi buổi, sao cho chi phí trung bình trên các buổi ấy nhỏ nhất:

Lˉ(g)=1n∑i=1nL(g,ai).\bar L(g)=\frac1n\sum_{i=1}^{n}L(g,a_i).

Nếu nhiều gg cùng cho chi phí nhỏ nhất, chọn gg nhỏ nhất.

Dữ liệu vào

Một đối tượng JSON gồm attendance (số người đến của các buổi trước), seat_cost là α\alpha và turn_away_cost là β\beta.

Kết quả

Một đối tượng JSON gồm seats là số ghế gg và average_cost là Lˉ(g)\bar L(g).

Giới hạn

  • Từ 11 đến 10001000 buổi, mỗi buổi từ 00 đến 10001000 người.
  • α\alpha, β\beta là số nguyên, 1≤α<β≤1001\le\alpha<\beta\le100.

Chấm điểm

Có 20 test, mỗi test 5 điểm. average_cost được chấm với sai số khoảng 10−710^{-7}.

Ví dụ

Input mẫu

{
  "attendance": [20, 22, 25, 30, 48],
  "seat_cost": 1,
  "turn_away_cost": 4
}

Output mẫu

{"seats": 30, "average_cost": 44.4}