R2 Score
R2 Score, или коэффициент детерминации, показывает, насколько модель лучше простого прогноза средним значением.
Сначала сравним модель не с идеалом, а с очень простой базовой стратегией. Эта стратегия вообще не смотрит на признаки и всегда отвечает одним числом — средним значением целевой переменной.
Прогноз средним значением
Заголовок раздела «Прогноз средним значением»Пусть мы предсказываем цену квартиры по площади. Самый простой прогноз — всегда отвечать средней ценой по всем известным квартирам.
uses MLABC, PlotML;
begin var df := DataFrame.FromCsvText(''' Площадь,Цена 35,4.8 42,5.7 50,7.9 58,7.9 65,8.2 72,10.4 80,10.5 90,12.5 ''');
var X := df.ToMatrix(['Площадь']); var y := df.ToVector('Цена');
var yMean := y.Mean;
Plot.Title := 'Прогноз средним значением'; Plot.XLabel := 'Площадь'; Plot.YLabel := 'Цена';
Plot.Points(X.Col(0), y);
// Горизонтальная линия: y = среднее значение цены Plot.Line(0.0, yMean, Colors.Gray);
var totalError := 0.0; var n := X.RowCount;
for var i := 0 to n - 1 do begin var x1 := X[i, 0];
Plot.LineGraph( [x1, x1], [y[i], yMean], Colors.Gray, thickness := 1.5);
totalError += (y[i] - yMean)**2; end;
Println('Среднее значение:', yMean:0:2); Println('Общая ошибка среднего:', totalError:0:2);end.Вывод:
Среднее значение: 8.49Общая ошибка среднего: 45.95На графике синие точки — настоящие значения. Серая горизонтальная линия — прогноз средним значением.
Вертикальные серые отрезки показывают ошибки прогноза средним. Для R2 важны не сами длины этих отрезков, а сумма их квадратов:
В нашем примере:
Это знаменатель в формуле R²: он показывает, насколько сильно настоящие значения отличаются от своего среднего. В классической литературе его часто обозначают SStot, а здесь мы используем более понятное имя .
Формула R2
Заголовок раздела «Формула R2»После обучения модели мы получаем её предсказания:
Для модели считается сумма квадратов её ошибок:
Тогда:
Или полностью:
Ошибка обученной модели
Заголовок раздела «Ошибка обученной модели»Теперь обучим линейную регрессию. Красная линия на графике — предсказания модели.
uses MLABC, PlotML;
begin var df := DataFrame.FromCsvText(''' Площадь,Цена 35,4.8 42,5.7 50,7.9 58,7.9 65,8.2 72,10.4 80,10.5 90,12.5 ''');
var X := df.ToMatrix(['Площадь']); var y := df.ToVector('Цена');
var model := new LinearRegression; model.Fit(X, y);
Plot.Title := 'Линейная регрессия'; Plot.XLabel := 'Площадь'; Plot.YLabel := 'Цена';
Plot.Points(X.Col(0), y);
var line := model.RegressionLine; Plot.Line(line.K, line.B, Colors.Red);
var yPred := model.Predict(X); var yMean := y.Mean;
var modelError := 0.0; var totalError := 0.0; var n := X.RowCount;
for var i := 0 to n - 1 do begin var x1 := X[i, 0];
Plot.LineGraph( [x1, x1], [y[i], yPred[i]], Colors.Gray, thickness := 1.5);
modelError += (y[i] - yPred[i])**2; totalError += (y[i] - yMean)**2; end;
Plot.Points(X.Col(0), yPred, Plot.PaletteColor(0), size := 5);
var r2 := 1 - modelError / totalError;
Println('Ошибка модели:', modelError:0:2); Println('R2:', r2:0:3);end.Вывод:
Ошибка модели: 2.05R2: 0.955
Теперь вертикальные отрезки показывают ошибки уже не до среднего значения, а до линии модели. Их сумма квадратов называется ошибкой модели. В классической литературе её часто обозначают SSres, а здесь мы используем более понятное имя .
Подставим оба значения в формулу:
Это означает, что линейная модель объясняет примерно 95.5% разброса цен в этих данных.
Как читать R2
Заголовок раздела «Как читать R2»R² близко к 1 модель хорошо объясняет данныеR² около 0 модель примерно как прогноз среднимR² меньше 0 модель хуже прогноза среднимЕсли ошибки модели намного меньше ошибок прогноза средним, дробь в формуле маленькая, и R² близко к 1.
Если модель ошибается примерно так же, как прогноз средним, дробь близка к 1, и R² около 0.
R² отвечает на вопрос:
Насколько наша модель уменьшила сумму квадратов ошибок по сравнению с самым простым прогнозом — всегда отвечать средним значением?