Python for Machine Learning
Python cho ML — NumPy & Pandas trong 45 phút
Python chậm. Nhưng người ta vẫn dùng nó cho ML. Vì sao?
Python không phảingôn ngữ nhanh nhất — chạy một vòng lặp bằng Python thuần chậm hơn C khoảng 100 lần. Nhưng nó có hai thư viện biến nó thành ngôn ngữ chung của ML: NumPy (mảng số tốc độ C) và Pandas (bảng dữ liệu như Excel có siêu năng lực). Mỗi khi bạn đọc một đoạn code ML trên GitHub, 80% là NumPy + Pandas. Hiểu hai cái này, bạn đọc được hầu hết mọi repo ML.
Bạn có mảng 1 triệu số. Cần tính tổng bình phương. Đồng nghiệp A viết for-loop Python thuần đi từng phần tử. Đồng nghiệp B viết `(arr ** 2).sum()` bằng NumPy. Lý do chính khiến B chạy nhanh hơn A cỡ 100 lần là gì?
Hình minh họa
Chọn một thư viện ở tab, rồi chọn một thao tác. Code bên trái, kết quả mong đợi bên phải — không cần cài Python để học.
NumPy cung cấp ndarray— mảng N chiều chứa số, lưu liên tiếp trong bộ nhớ, tính toán bằng C. Nền tảng của PyTorch, TensorFlow, scikit-learn.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.zeros(5)
c = np.ones(3)
d = np.arange(0, 10, 2)
e = np.linspace(0, 1, 5)
print(a) # [1 2 3 4 5]
print(d) # [0 2 4 6 8]
print(e) # [0. 0.25 0.5 0.75 1. ]Bốn cách tạo phổ biến nhất. arange như range() của Python, linspace chia đều khoảng thành n điểm.
Phân tích thực tế — 3 bước, 12 dòng code
Mỗi bước dưới đây là một câu hỏi kinh doanh + code + kết quả trực quan. Bấm Tiếp tụcđể lần lượt mở ra từng bước — giống như bạn đang viết code trong Jupyter notebook.
Nạp CSV vào DataFrame
pd.read_csv biến file phẳng thành bảng có cấu trúc.
import pandas as pd
df = pd.read_csv("diem_hoc_sinh.csv")
print(df.head())
# (500 hàng, 5 cột)| stt | ten | lop | toan | van |
|---|---|---|---|---|
| 1 | An | 10A | 8.5 | 8 |
| 2 | Bình | 10A | 7 | 8.5 |
| 3 | Chi | 10B | 9 | 8 |
| 4 | Dung | 10B | 6.5 | 9 |
| 5 | Em | 10C | 7.5 | 7 |
500 hàng, 5 cột — head() chỉ hiển thị 5 hàng đầu.
Mảng trong câu hỏi
NumPy broadcasting: a = np.array([1, 2, 3]) có shape (3,). M = np.array([[10,10,10],[20,20,20]]) có shape (2, 3). a + M sẽ cho shape gì và giá trị ra sao?
ValueError.Đọc một đoạn code ML không phải là đọc từng dòng một. Bạn nhận ra những miếng nhỏ quen thuộc: “À, đây là tạo array”, “À, đây là groupby”, “À, đây là vẽ biểu đồ” — rồi ghép lại.
Cả bộ sinh thái ML hiện đại chỉ là NumPy + Pandas + Matplotlib, đi kèm một vài thư viện model (scikit-learn, PyTorch...). Mỗi thư viện model đều nhận NumPy array làm đầu vào và trả NumPy array ra đầu ra. Bạn không cần biết hết — bạn chỉ cần biết đủ để đọc.
Giải thích
Phần này tổng hợp 4 mẹo thực hành và bảng cheat sheet của ba thư viện. Lưu lại (bookmark) để tra khi cần, chứ không cần nhớ ngay.
4 thói quen của một người viết code ML tốt
Nếu bạn đang viết for-loop để cộng/nhân/tính array, 99% trường hợp có cách NumPy làm ngắn gọn và nhanh hơn 100 lần.
Ba dòng này luôn chạy trước khi bạn làm bất cứ thứ gì khác. Nó cho bạn biết kiểu dữ liệu, số hàng, missing values.
df2 = df[df['diem'] >= 8] đôi khi là 'view' — sửa df2 cũng sửa df gốc. Thêm .copy() để tránh bug thầm lặng.
np.random.seed(42) để kết quả lặp lại được. Không có seed, mỗi lần chạy ra một con số khác — không debug được.
Vectorization — “phép màu” dưới lòng NumPy
Khi bạn viết a + b với hai array NumPy có shape (n,), NumPy sẽ chạy một vòng lặp C:
Nghĩa là: lấy phần tử thứ i của a cộng phần tử thứ i của b, lưu vào c. Công việc giống y hệt for-loop Python, nhưngcode C đã biên dịch trước, không có overhead của Python interpreter — nhanh hơn khoảng 100 lần. Tương tự với np.sqrt(a), a * 2, a @ b (nhân ma trận):
Tất cả vòng lặp bên trong đều chạy bằng C, không phải Python. Bạn chỉ cần viết 1 dòng; NumPy lo phần còn lại.
Cheat sheet — 15 lệnh dùng nhiều nhất
| Thư viện | Lệnh | Dùng khi nào |
|---|---|---|
| NumPy | np.array(list) | Biến list Python thành array |
| NumPy | np.arange(n) / np.linspace(a,b,n) | Tạo dãy số đều |
| NumPy | a.reshape(r, c) | Đổi shape không đổi dữ liệu |
| NumPy | a.mean() / .std() / .sum() | Thống kê nhanh |
| NumPy | a[a > 5] | Lọc bằng boolean mask |
| Pandas | pd.read_csv('file.csv') | Nạp file CSV vào DataFrame |
| Pandas | df.head() / .info() / .describe() | Ba lệnh đầu tiên với dataset mới |
| Pandas | df['col'] | Chọn 1 cột (ra Series) |
| Pandas | df[df['x'] > 5] | Lọc hàng theo điều kiện |
| Pandas | df.groupby('x').agg(...) | Tổng hợp theo nhóm (PivotTable) |
| Pandas | a.merge(b, on='key') | Nối 2 bảng theo cột chung |
| Pandas | df.dropna() | Xóa hàng có giá trị thiếu |
| Matplotlib | plt.plot(x, y) | Đường line (loss, accuracy) |
| Matplotlib | plt.hist(a, bins=20) | Phân phối của một biến |
| Matplotlib | plt.scatter(x, y) | Quan hệ giữa hai biến |
Sau khi nắm ba thư viện này, hai bước tiếp theo là Tiền xử lý dữ liệu (xử lý missing values, encoding, scaling) và Kỹ thuật đặc trưng (tạo features có ý nghĩa cho model). Nếu bạn chưa dựng môi trường chạy Python, xem Jupyter & Colab workflow.
- NumPy = mảng số tốc độ C. Thay vì for-loop, viết a + b, a * 2, a.mean() — nhanh hơn ~100 lần.
- Broadcasting = NumPy tự phát mảng nhỏ ra khớp mảng lớn. Quy tắc: so shape từ phải, mỗi chiều bằng nhau hoặc bằng 1.
- Pandas = bảng dữ liệu. Ba lệnh đầu tiên với dataset mới: head(), info(), describe().
- Combo thông dụng nhất: read_csv → filter bằng boolean mask → groupby → visualize.
- Mọi cột DataFrame là một NumPy array. Hiểu NumPy = hiểu nền tảng Pandas và mọi thư viện ML xây bên trên.
Kiểm tra hiểu biết
numpy.array([1, 2, 3, 4, 5, 6]).reshape(2, 3).shape trả về giá trị gì?