Menu
CoddyTech

PCA trước khi xây dựng mô hình

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 32 trên 51.

Ít đặc trưng hơn giúp mô hình chạy nhanh hơn và giảm lượng nhiễu mà nó phải xử lý. PCA có thể nằm trong một pipeline, ngay trước mô hình:

for n in [2, 5, 10, 20, 40, 64]:
    model = make_pipeline(PCA(n_components=n), KNeighborsClassifier())
    print(n, f"{cross_val_score(model, X, y, cv=5).mean():.3f}")

Trên tập dữ liệu digits:

Đường biểu diễn độ chính xác của k-NN trên tập dữ liệu digits theo số thành phần được giữ lại: 0.595 với 2 thành phần, 0.884 với 5, 0.940 với 10, sau đó gần như đi ngang, 0.958 với 20 và tăng lên 0.963 khi giữ lại cả 64 thành phần

Độ chính xác gần như không đổi khi đạt mức 20: 44 hướng còn lại hầu như không đóng góp gì. Mỗi phần chia đều khớp PCA trên các hàng dữ liệu huấn luyện riêng, vì vậy không có dữ liệu nào bị rò rỉ.

Các đơn vị không đồng nhất? Như mọi khi, hãy đặt StandardScaler() lên trước.

challenge icon

Thử thách

Trung bình

Phòng thí nghiệm dầu ô liu phân loại dầu dựa trên mức độ hấp thụ ánh sáng ở 36 bước sóng, cùng với 4 xét nghiệm. Cần bao nhiêu đặc trưng (feature) là đủ? Chương trình đọc vào một mức chênh lệch cho phép.

  1. Với mỗi n trong sizes, hãy kiểm định chéo với 5 phần: một quy trình gồm bộ chuẩn hóa, PCA với n thành phần và LogisticRegression(max_iter=1000). In ra từng điểm số.
  2. In ra số thành phần ít nhất có điểm số nằm trong mức chênh lệch cho phép so với điểm số cao nhất.

Với một phòng thí nghiệm khác và 0.05:

2 components: 0.817
3 components: 0.833
4 components: 0.889
5 components: 0.928
10 components: 0.928
20 components: 0.917
40 components: 0.922
Fewest within 0.05 of the best: 4 components

Tự làm thử

import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 180 mẫu dầu ô liu: độ hấp thụ ánh sáng ở 36 bước sóng, 4 xét nghiệm trong phòng thí nghiệm và phân hạng
oils = pd.read_csv("oils.csv")
X = oils.drop(columns=["oil", "grade"])
y = oils["grade"]
sizes = [2, 3, 4, 5, 10, 20, 40]
slack = float(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 không giám sát

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