Mở đầu
Trong feature engineering, kỹ năng xử lý và kết hợp các đặc trưng nhanh chóng bằng Python rất quan trọng. Thư viện chuẩn itertools cung cấp nhiều công cụ mạnh mẽ để tạo tổ hợp, hoán vị, tích Descartes, và thao tác trên luồng dữ liệu — hỗ trợ trực tiếp cho việc tạo tương tác đặc trưng, cửa sổ trượt hay tập hợp đặc trưng mở rộng. Bài viết này giới thiệu 7 hàm itertools thiết yếu và ví dụ thực tế giúp bạn áp dụng ngay vào quy trình feature engineering.
Tại sao chọn itertools cho Feature Engineering
- itertools xử lý lazy (không tạo danh sách lớn cùng lúc), phù hợp với dữ liệu lớn.
- Các hàm hỗ trợ tạo tổ hợp/hoán vị/phép nhân Descartes để tạo tính năng tương tác hoặc kiểm thử mô hình.
- Kết hợp với pandas hoặc numpy, itertools giúp xây dựng pipeline feature nhanh và hiệu quả.
1. product — tạo các tổ hợp Cartesian (tích Descartes)
product dùng để lấy mọi kết hợp giữa các tập giá trị — rất hữu ích khi tạo tương tác bậc cao hoặc kiểm thử các kết hợp hyperparameter.
Ví dụ:
from itertools import product
colors = [‘red’, ‘green’]
sizes = [‘S’, ‘M’, ‘L’]
combos = list(product(colors, sizes))
[(‘red’,’S’), (‘red’,’M’), (‘red’,’L’), (‘green’,’S’), …]
Ứng dụng feature engineering:
- Tạo đặc trưng kết hợp màu_sắc_x_kích_thước.
- Mở rộng categorical bằng cách kết hợp nhiều cột phân loại.
2. combinations — chọn k phần tử không quan tâm thứ tự
combinations(iterable, k) trả về các tổ hợp không lặp và không phân biệt thứ tự. Dùng để tạo các cặp tương tác hoặc lựa chọn các tập con đặc trưng.
Ví dụ:
from itertools import combinations
features = [‘age’, ‘income’, ‘education’]
pairs = list(combinations(features, 2))
[(‘age’, ‘income’), (‘age’, ‘education’), (‘income’, ‘education’)]
Ứng dụng:
- Tạo cặp đặc trưng để sinh thêm tương tác (ví dụ age * income).
- Khám phá tập con biến tốt cho mô hình.
3. combinations_with_replacement — tổ hợp có lặp
combinations_with_replacement(iterable, k) cho phép lặp phần tử trong tổ hợp. Hữu ích khi muốn xem tương tác giữa cùng một đặc trưng (ví dụ bình phương).
Ví dụ:
from itertools import combinations_with_replacement
feats = [‘x1’, ‘x2’]
combos = list(combinations_with_replacement(feats, 2))
[(‘x1′,’x1’), (‘x1′,’x2’), (‘x2′,’x2’)]
Ứng dụng:
- Sinh feature x1^2, x1*x2, x2^2 bằng cách tự động hóa quá trình tạo đa thức.
4. permutations — hoán vị (thứ tự quan trọng)
permutations(iterable, k) trả về các hoán vị, dùng khi thứ tự giữa các phần tử có ý nghĩa (ví dụ chuỗi sự kiện, thứ tự thao tác).
Ví dụ:
from itertools import permutations
steps = [‘A’, ‘B’, ‘C’]
perms = list(permutations(steps, 2))
[(‘A’,’B’), (‘A’,’C’), (‘B’,’A’), …]
Ứng dụng:
- Mã hóa chuỗi sự kiện thành features biểu diễn thứ tự xảy ra.
- Tạo các trình tự thử nghiệm cho pipeline xử lý.
5. chain — nối nhiều iterator thành một luồng
*chain(iterables)** nối nhiều iterator thành một iterator duy nhất. Tiết kiệm bộ nhớ khi ghép các nguồn đặc trưng khác nhau.
Ví dụ:
from itertools import chain
a = [1,2]
b = [3,4]
merged = list(chain(a,b))
[1,2,3,4]
Ứng dụng:
- Kết hợp chuỗi đặc trưng từ nhiều cột hoặc nhiều nguồn dữ liệu trước khi chuyển đổi.
- Dùng khi streaming dữ liệu và muốn áp dụng cùng một pipeline chuyển đổi.
6. islice — cắt phần tử theo chỉ số như slicing nhưng cho iterator
islice(iterable, start, stop, step) cho phép cắt iterator mà không cần biến nó thành danh sách. Hữu ích cho cửa sổ trượt hoặc lấy mẫu nhanh từ luồng lớn.
Ví dụ:
from itertools import islice
data = range(1000000)
sample = list(islice(data, 0, 100, 2)) # 0,2,4,…,98
Ứng dụng:
- Tạo các cửa sổ cố định trên chuỗi để sinh feature thời gian (sliding windows).
- Lấy mẫu nhanh phục vụ kiểm thử hoặc xử lý batch.
7. groupby — gom nhóm tuần tự theo key
groupby(iterable, key=…) gom các phần tử liền kề có cùng key. Khác với pandas.groupby, itertools.groupby yêu cầu dữ liệu phải được sắp xếp theo key trước.
Ví dụ:
from itertools import groupby
data = sorted([(1,’a’), (2,’b’), (1,’c’)], key=lambda x: x[0])
for k, group in groupby(data, key=lambda x: x[0]):
items = list(group)
k là key, items là danh sách phần tử cùng key
Ứng dụng:
- Tính các thống kê (count, mean) trên chuỗi thời gian đã sắp xếp theo id hoặc ngày.
- Gom các event liền kề để tạo features như số lần lặp liên tiếp, thời lượng nhóm.
Một số mẹo kết hợp itertools trong workflow thực tế
- Kết hợp với pandas:
- Sử dụng itertools để tạo danh sách tên cột mới (ví dụ tương tác), rồi gán vào DataFrame.
- Tránh chuyển đổi iterator lớn thành list nếu không cần: lợi dụng tính lazy để tiết kiệm bộ nhớ.
- Khi dùng groupby, luôn sắp xếp theo key trước để kết quả chính xác.
- Dùng combinations_with_replacement để tự động sinh đa thức bậc 2 thay vì viết vòng lặp thủ công.
Ví dụ thực tế: tạo các cặp tương tác numeric
import pandas as pd
from itertools import combinations
df = pd.DataFrame({‘age’:[20,30], ‘income’:[100,200], ‘score’:[0.5,0.7]})
for a,b in combinations([‘age’,’income’,’score’], 2):
df[f'{a}x{b}’] = df[a] * df[b]
Kết quả: thêm các cột age_x_income, age_x_score, income_x_score — sẵn sàng đưa vào mô hình.
Kết luận
Thành thạo 7 hàm itertools trên sẽ giúp bạn nhanh chóng mở rộng và biến đổi đặc trưng cho các bài toán machine learning. Những công cụ này đặc biệt phù hợp khi xử lý dữ liệu lớn nhờ tính lazy và khả năng kết hợp linh hoạt. Hãy thử áp dụng từng hàm vào pipeline hiện có và quan sát cải thiện trong khả năng mô hình hóa.
Nếu bạn muốn, mình có thể:
- Viết code mẫu chi tiết hơn cho dataset cụ thể.
- Gợi ý cách kết hợp itertools với scikit-learn Pipeline hoặc pandas.
Nguồn: machinelearningmastery.com
Đăng ngày: 2026-03-30 18:00:00 • Tác giả: Bala Priya C



