Menu
CoddyTech

Điền giá trị thiếu trong quy trình

Thuộc phần Học có giám sát trong hành trình Machine Learning của Coddy. Bài học 47 trên 58.

Bản ghi thực tế có những chỗ khuyết, và hầu hết mô hình không xử lý được chúng. SimpleImputer lấp đầy từng chỗ khuyết bằng giá trị trung bình, trung vị hoặc phổ biến nhất của cột đó.

Điền giá trị trước khi chia tập, rồi dùng các hàng kiểm tra để chọn giá trị đó: đây là một sự rò rỉ dữ liệu. Có 7 độ sâu lặn và một ô trống:

Hai bản sao của một cột gồm 8 độ sâu lặn, hai hàng cuối được đánh dấu là hàng kiểm tra và một ô bị trống. Bên trái, điền giá trị rồi chia tập: ô trống nhận giá trị 21.3, trung bình của cả 7 độ sâu đã biết, có tính cả các hàng kiểm tra, gây rò rỉ dữ liệu. Bên phải, chia tập rồi tạo pipeline: ô trống nhận giá trị 18.0, trung bình chỉ tính các hàng huấn luyện

Trong một pipeline, fit chỉ học các giá trị điền từ những hàng huấn luyện:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # các giá trị dùng để điền dữ liệu thiếu ở bước đầu tiên

Với nhật ký lặn (độ sâu, số phút, nhiệt độ nước), đoạn code này in ra:

[19. 44. 21.]

Với dữ liệu dạng từ, các bước xử lý số cũng trở thành một nhánh của ColumnTransformer:

lane = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
("numbers", lane, ["depth_m", "minutes"])
challenge icon

Thử thách

Trung bình

Dịch vụ lâm nghiệp dự đoán những cú sét nào gây ra cháy rừng, nhưng một số số liệu bị thiếu. Phần mã khởi đầu chia wildfire.csv và đọc chiến lược mean hoặc median.

  1. Khớp một quy trình gồm bộ điền giá trị thiếu với chiến lược đó, bộ chuẩn hóa và hồi quy logistic. In độ chính xác trên tập kiểm tra.
  2. Với mỗi cột, in giá trị điền của quy trình và giá trị tính từ tất cả các hàng của X, làm tròn đến 1 chữ số thập phân.

Một khu rừng khác, với median:

Test accuracy: 0.840
humidity_pct: fill 46.0, all rows would give 46.0
wind_kmh: fill 29.0, all rows would give 32.0
temp_c: fill 25.0, all rows would give 26.0
days_without_rain: fill 23.0, all rows would give 23.0

Ở những cột có hai giá trị khác nhau, điền giá trị thiếu trước khi chia tập dữ liệu sẽ khiến các hàng kiểm tra ảnh hưởng đến dữ liệu huấn luyện.

Tự làm thử

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

# Sét đánh trong khu rừng khô: tia sét có gây cháy (1) hay không (0)?
# Thiếu một số số liệu thời tiết.
strikes = pd.read_csv("wildfire.csv")
columns = ["humidity_pct", "wind_kmh", "temp_c", "days_without_rain"]
X = strikes[columns]
y = strikes["fire"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
strategy = input()

# Viết code bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học có giám sát

Tự luyện tập: Trình biên dịch Python online