Menu
CoddyTech

Насколько хороша аппроксимация?

Часть раздела Статистика для машинного обучения путешествия по Machine Learning на Coddy. Урок 39 из 64.

Для любого облака точек можно провести линию, поэтому качество подгонки нужно оценивать. Моряк записывал скорость ветра и лодки: сравним сумму квадратов ошибок линии с суммой квадратов ошибок среднего — самого ленивого прогноза:

Две панели с шестью точками: скорость лодки в зависимости от скорости ветра. Слева: горизонтальная линия на уровне среднего с длинными красными отрезками до точек, сумма квадратов ошибок — 16.23. Справа: подобранная линия с крошечными красными отрезками, сумма квадратов ошибок — 0.35

Коэффициент детерминации R² — это доля разброса, которую объясняет линия:

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()  # аппроксимация: 0.35
ss_tot = ((boat - boat.mean()) ** 2).sum()  # среднее: 16.23
print(np.round(1 - ss_res / ss_tot, 3))

Это выводит 0.979: линия объясняет 98% разброса скорости. 1 — идеальная линия, 0 — не лучше среднего.

Это стандартная оценка модели, которая предсказывает числа. Для аппроксимированной прямой она равна r squared.

challenge icon

Задание

Средне

На грибной ферме зарегистрировали 16 грядок для выращивания в mushrooms.csv. Программа считывает название столбца, а начальный код подбирает прямую, которая предсказывает harvest_kg по этому столбцу. В отчёте должно быть значение r_squared, которое пока не вычисляется.

  1. Дополните r_squared(y, predicted), чтобы она возвращала коэффициент детерминации R².
  2. В конце выведите проверочное значение: корреляцию между x и y, возведённую в квадрат, умноженную на 100 и округлённую до 1 знака после запятой.

Для другой фермы и входных данных humidity:

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

Попробуйте сами

import numpy as np
import pandas as pd


# Возвращает коэффициент детерминации R² для предсказаний y
def r_squared(y, predicted):
    # Напишите свой код здесь
    return 0


beds = pd.read_csv("mushrooms.csv")
column = input()
# Не изменяйте строки ниже
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")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Статистика для машинного обучения

Потренируйтесь самостоятельно: Онлайн-компилятор Python