Menu
CoddyTech

Xử lý giá trị ngoại lệ

Thuộc phần Thống kê cho machine learning trong hành trình Machine Learning của Coddy. Bài học 27 trên 64.

Mười căn hộ dùng khoảng 10 m³ nước mỗi căn, nhưng một chỗ rò rỉ khiến mức dùng tăng lên 64. Bạn có thể loại bỏ giá trị đó hoặc giới hạn nó ở hàng rào gần nhất:

Lượng nước sử dụng của 10 căn hộ, được trình bày thành ba hàng. Giữ lại: chín chấm gần mức 10 và chỗ rò rỉ ở mức 64, giá trị trung bình là 15.2. Loại bỏ: bỏ chỗ rò rỉ, giá trị trung bình là 9.8. Giới hạn: kéo chỗ rò rỉ về hàng rào ở mức 14, giá trị trung bình là 10.2

np.clip(a, low, high) giới hạn toàn bộ một mảng:

water = np.array([8, 11, 9, 10, 12, 9, 64, 10, 11, 8])
low, high = 6.0, 14.0  # các ngưỡng IQR
dropped = water[(water >= low) & (water <= high)]
capped = np.clip(water, low, high)
print(len(dropped), len(capped))
print(capped)

Kết quả in ra:

9 10
[ 8. 11.  9. 10. 12.  9. 14. 10. 11.  8.]

Mô hình (model) sẽ cố khớp với giá trị phẳng duy nhất đó, vì vậy hãy quyết định trước khi huấn luyện. Sửa hoặc loại bỏ lỗi chính tả; giữ lại hoặc giới hạn các giá trị cực đoan có thật. Đừng âm thầm xóa dữ liệu: hãy cho biết bạn đã thay đổi bao nhiêu giá trị.

challenge icon

Thử thách

Trung bình

Ứng dụng đạp xe ghi lại tốc độ trung bình của 15 chuyến đi trong speeds; có hai giá trị trông bất thường. Phần code ban đầu đã lưu hai ngưỡng IQR vào low và high.

  1. Tạo dropped gồm các tốc độ nằm trong hai ngưỡng, tính cả hai ngưỡng, và tạo capped.
  2. In mỗi lựa chọn keep, drop và cap trên một dòng: số chuyến đi, tốc độ trung bình và .std() của chúng, làm tròn đến 2 chữ số thập phân.
  3. In số chuyến đi đã thay đổi khi giới hạn tốc độ.

Với 10 chuyến đi của một người đạp xe khác:

Keep: 10 rides, mean 21.38, std 6.58
Drop: 9 rides, mean 19.2, std 0.77
Cap: 10 rides, mean 19.45, std 1.04
Capping changed 1 of 10 rides

Tự làm thử

import numpy as np


# Trả về ngưỡng IQR dưới và trên của một mảng (array)
def iqr_fences(a):
    q1 = np.percentile(a, 25)
    q3 = np.percentile(a, 75)
    iqr = q3 - q1
    return q1 - 1.5 * iqr, q3 + 1.5 * iqr


speeds = np.array([24.5, 22.8, 26.1, 23.9, 3.1, 25.4, 21.7, 24.2, 27.3, 78.4, 23.1, 25.8, 22.4, 24.9, 26.6])
low, high = iqr_fences(speeds)

# Viết code của bạn 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 Thống kê cho machine learning

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