Menu
CoddyTech

Isolation Forest

Thuộc phần Học không giám sát trong hành trình Machine Learning của Coddy. Bài học 35 trên 51.

Các điểm bất thường rất dễ bị tách riêng. Hãy chia dữ liệu ngẫu nhiên, lặp đi lặp lại, cho đến khi chỉ còn một điểm đứng riêng:

Cùng một biểu đồ phân tán được chia hai lần bằng các đường cắt ngẫu nhiên màu xám. Bên trái: một điểm xa ở góc trên đứng riêng sau 2 lần cắt. Bên phải: một điểm ở giữa đám đông cần 8 lần cắt

Điểm ở xa cần 2 lần cắt, điểm đông đúc cần 8 lần. Rừng cô lập lấy trung bình số lần cắt qua 100 cây ngẫu nhiên:

from sklearn.ensemble import IsolationForest
forest = IsolationForest(contamination=0.02, random_state=0)
flags = forest.fit_predict(X)

fit_predict trả về -1 cho các hàng bất thường, 1 cho các hàng còn lại. contamination là tỷ lệ hàng mà bạn dự đoán sẽ bất thường.

challenge icon

Thử thách

Trung bình

Một cảng ghi nhận 160 ca làm việc của cần cẩu: số lượt di chuyển mỗi giờ và mức năng lượng cho mỗi lượt di chuyển. Những ca nào có vẻ bất thường?

  1. Đánh dấu các ca bằng Isolation Forest, contamination=0.03, random_state=0. In số lượng như bên dưới.
  2. Biểu diễn các ca bình thường bằng dấu chấm có nhãn normal.
  3. Khoanh tròn các ca được đánh dấu: s=150, facecolors="none", edgecolors="red", với nhãn flagged. Thêm chú giải rồi hiển thị biểu đồ.

Với một cảng khác, có 200 ca làm việc:

Flagged: 6 of 200 shifts

Các ca làm việc của cần cẩu được biểu diễn bằng những dấu chấm tạo thành đám mây đi xuống, cần cẩu chạy nhanh hơn dùng ít năng lượng hơn cho mỗi lượt di chuyển, và sáu ca riêng lẻ được khoanh đỏ xung quanh, kèm chú giải

Sau đó, Coddy mô tả biểu đồ của bạn.

Tự làm thử

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# Mỗi hàng tương ứng với một ca làm việc của cần cẩu tại cảng, gồm tốc độ và mức tiêu thụ năng lượng
shifts = pd.read_csv("cranes.csv")
X = shifts[["moves_per_hour", "kwh_per_move"]]

# Đừng thay đổi các dòng bên dưới
fig, ax = plt.subplots()
ax.set_title("Crane Shifts")
ax.set_xlabel("Moves per hour")
ax.set_ylabel("Energy per move (kWh)")

# 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 không giám sát

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