Tạo các mốc tách theo thời gian
Trong video, bạn đã thấy vì sao việc chia dữ liệu ngẫu nhiên có thể nguy hiểm với chuỗi thời gian: dữ liệu từ tương lai có thể khiến mô hình bị overfitting. Với chuỗi thời gian, bạn thường nhận thêm dữ liệu mới khi chúng xuất hiện và muốn huấn luyện lại mô hình với dữ liệu mới nhất. Trong video, chúng ta đã minh họa cách tách theo tỷ lệ cho tập huấn luyện và kiểm tra, nhưng giả sử bạn muốn huấn luyện trên toàn bộ dữ liệu sẵn có, ngoại trừ 45 ngày cuối cùng để làm tập kiểm tra.
Trong bài tập này, bạn sẽ tạo một hàm để tìm ngày tách nhằm dùng 45 ngày cuối làm kiểm tra và phần còn lại làm huấn luyện. Lưu ý rằng timedelta() đã được nhập sẵn cho bạn từ thư viện chuẩn python là datetime.
Bài tập này là một phần của khóa học
Feature Engineering với PySpark
Hướng dẫn bài tập
- Tạo hàm
train_test_split_date()nhận vào một dataframedf, cột ngày dùng để táchsplit_colvà số ngày dùng cho tập kiểm tratest_daysvới giá trị mặc định là 45. - Tìm ngày
minvàmaxchosplit_colbằng,(). - Tìm ngày để tách tập kiểm tra và huấn luyện bằng cách lấy
max_daterồi trừ đitest_daysvớitimedelta()(nhận tham sốdays), ở đây truyền vàotest_days. - Dùng
OFFMKTDATElàmsplit_col, tìmsplit_datevà dùng nó để lọc dataframe thành hai dataframe mới,train_dfvàtest_df, trong đótest_dfchỉ gồm 45 ngày cuối của dữ liệu. Ngoài ra, đảm bảotest_dfchỉ chứa các căn nhà đã được đăng tính đến ngày tách bằng cách lọcdf['LISTDATE']nhỏ hơn hoặc bằngsplit_date.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
def train_test_split_date(df, split_col, test_days=____):
"""Calculate the date to split test and training sets"""
# Find how many days our data spans
max_date = df.____({____: ____}).collect()[0][0]
min_date = df.____({____: ____}).collect()[0][0]
# Subtract an integer number of days from the last date in dataset
split_date = ____ - timedelta(days=____)
return split_date
# Find the date to use in spitting test and train
split_date = train_test_split_date(df, ____)
# Create Sequential Test and Training Sets
____ = df.where(df[____] < split_date)
____ = df.where(df[____] >= split_date).where(df[____] <= split_date)