Menu
CoddyTech

Đường khớp chính xác đến đâu?

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

Đám mây điểm nào cũng có thể kẻ một đường thẳng, nên cần chấm điểm độ khớp. Một thủy thủ ghi lại tốc độ gió và tốc độ thuyền: hãy so sánh tổng bình phương sai số của đường thẳng với tổng bình phương sai số của giá trị trung bình, cách dự đoán đơn giản nhất:

Hai biểu đồ, mỗi biểu đồ có sáu điểm, thể hiện tốc độ thuyền theo tốc độ gió. Bên trái: đường thẳng nằm ngang tại giá trị trung bình, với các khoảng cách màu đỏ dài đến các điểm, tổng bình phương sai số là 16.23. Bên phải: đường thẳng khớp với dữ liệu, với các khoảng cách màu đỏ rất nhỏ, tổng bình phương sai số là 0.35

R bình phương là tỷ lệ độ phân tán mà đường thẳng giải thích:

wind = np.array([6, 8, 10, 12, 15, 18])
boat = np.array([3.1, 4.4, 4.9, 6.2, 6.8, 8.1])
slope, intercept = np.polyfit(wind, boat, 1)
predicted = slope * wind + intercept
ss_res = ((boat - predicted) ** 2).sum()  # giá trị khớp: 0.35
ss_tot = ((boat - boat.mean()) ** 2).sum()  # giá trị trung bình: 16.23
print(np.round(1 - ss_res / ss_tot, 3))

Lệnh này in ra 0.979: dòng này giải thích 98% độ phân tán của tốc độ. 1 là đường thẳng hoàn hảo, 0 không tốt hơn giá trị trung bình.

Đây là điểm số tiêu chuẩn của một mô hình dự đoán các con số. Với một đường thẳng đã khớp, giá trị này bằng r bình phương.

challenge icon

Thử thách

Trung bình

Một trang trại nấm ghi lại dữ liệu của 16 luống trồng trong mushrooms.csv. Chương trình đọc tên một cột, rồi phần code khởi đầu khớp đường thẳng dự đoán harvest_kg từ cột đó. Báo cáo cần r_squared, hiện vẫn chưa có.

  1. Hoàn thành r_squared(y, predicted) để hàm trả về hệ số R bình phương.
  2. Ở cuối chương trình, in kết quả kiểm tra: bình phương hệ số tương quan giữa x và y, nhân với 100, rồi làm tròn đến 1 chữ số thập phân.

Với một trang trại khác và đầu vào humidity:

humidity explains 27.0% of the harvest variation
Check with r squared: 27.0%

Tự làm thử

import numpy as np
import pandas as pd


# Trả về hệ số R bình phương của các giá trị dự đoán cho y
def r_squared(y, predicted):
    # Viết code của bạn ở đây
    return 0


beds = pd.read_csv("mushrooms.csv")
column = input()
# Không thay đổi các dòng bên dưới
x = beds[column]
y = beds["harvest_kg"]
slope, intercept = np.polyfit(x, y, 1)
predicted = slope * x + intercept
r2 = r_squared(y, predicted)
print(f"{column} explains {np.round(r2 * 100, 1)}% of the harvest variation")

# 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