Xử lý ngây thơ giá trị thiếu và giá trị phân loại
Random Forest Regression đủ mạnh để cho phép bạn bỏ qua nhiều bước chuẩn bị dữ liệu tốn thời gian và nhàm chán. Mặc dù một số triển khai Random Forest xử lý tự động giá trị thiếu và giá trị phân loại, PySpark thì không. Tuy vậy phần toán học vẫn như nhau, nên chúng ta có thể thay thế giá trị theo cách đơn giản.
Với giá trị thiếu, vì dữ liệu của chúng ta hoàn toàn dương, ta sẽ gán -1. Random forest sẽ tách (split) trên giá trị này và xử lý nó khác với các giá trị còn lại trong cùng một đặc trưng.
Với giá trị phân loại, bạn có thể ánh xạ (map) các giá trị văn bản sang số và một lần nữa random forest sẽ xử lý phù hợp bằng cách tách theo các giá trị đó. Trong ví dụ này, chúng ta sẽ “phủi bụi” pipelines từ phần Introduction to PySpark để viết mã ngắn gọn hơn. Lưu ý: bài tập sẽ bắt đầu bằng cách hiển thị dtypes của các cột trong dataframe; hãy so sánh chúng với kết quả ở cuối bài tập này.
LƯU Ý: Pipeline và StringIndexer đã được nhập sẵn cho bạn. Danh sách categorical_cols cũng đã có sẵn.
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
- Thay thế các giá trị trong
WALKSCOREvàBIKESCOREbằng -1 bằng cách dùngfillna()với tham sốsubset. - Tạo danh sách các
StringIndexerbằng list comprehension để lặp qua từng cột trongcategorical_cols. - Áp dụng
fit()vàtransform()cho pipelineindexer_pipeline. - Xóa các
categorical_colsbằngdrop()vì chúng không còn cần thiết. Kiểm tra kiểu dữ liệu kết quả bằngdtypes.
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.
# Replace missing values
df = df.____(____, ____=[____, ____])
# Create list of StringIndexers using list comprehension
indexers = [____(inputCol=____, outputCol=____+"_IDX")\
.setHandleInvalid("keep") for ____ in ____]
# Create pipeline of indexers
indexer_pipeline = Pipeline(stages=indexers)
# Fit and Transform the pipeline to the original data
df_indexed = ____.____(df).____(df)
# Clean up redundant columns
df_indexed = df_indexed.____(*____)
# Inspect data transformations
print(df_indexed.dtypes)