Главная » Error » Mean Squared Error or R-Squared – Which one to use?

Mean Squared Error or R-Squared – Which one to use?

What is Mean Squared Error (MSE)?

The Mean squared error (MSE) represents the error of the estimator or predictive model created based on the given set of observations in the sample. Intuitively, the MSE is used to measure the quality of the model based on the predictions made on the entire training dataset vis-a-vis the true label/output value. In other words, it can be used to represent the cost associated with the predictions or the loss incurred in the predictions. And, the squared loss (difference between true & predicted value) is advantageous because they exaggerate the difference between the true value and the predicted value. Two or more regression models created using a given sample of data can be compared based on their MSE. The lesser the MSE, the better the regression model is. When the linear regression model is trained using a given set of observations, the model with the least mean sum of squares error (MSE) is selected as the best model. The Python or R packages select the best-fit model as the model with the lowest MSE or lowest RMSE when training the linear regression models.

In 1805, the French mathematician Adrien-Marie Legendre, who first published the sum of squares method for gauging the quality of the model stated that squaring the error before summing all of the errors to find the total loss is convenient. The question that may be asked is why not calculate the error as the absolute value of loss (difference between y and y_hat in the following formula) and sum up all the errors to find the total loss. The absolute value of error is not convenient, because it doesn’t have a continuous derivative, which does not make the function smooth. And, the functions that are not smooth are difficult to work with when trying to find closed-form solutions to the optimization problems by employing linear algebra concepts.

Mathematically, the MSE can be calculated as the average sum of the squared difference between the actual value and the predicted or estimated value represented by the regression model (line or plane). It is also termed as mean squared deviation (MSD). This is how it is represented mathematically:

Mean squared error
Fig 1. Mean Squared Error

The value of MSE is always positive. A value close to zero will represent better quality of the estimator/predictor (regression model).

An MSE of zero (0) represents the fact that the predictor is a perfect predictor.

When you take a square root of MSE value, it becomes root mean squared error (RMSE). RMSE has also been termed root mean square deviation (RMSD). In the above equation, Y represents the actual value and the Y_hat represents the predicted value that could be found on the regression line or plane. Here is the diagrammatic representation of MSE for a simple linear or univariate regression model:

Mean Squared Error Representation
Fig 2. Mean Squared Error Representation

Практическое занятие с Housing Dataset

Применим полученные навыки для анализа данных о ценах на недвижимость в Бостоне, опубликованных в статье 1978 г.

Ещё данные можно подгрузить из втроенной в sklearn коллекции:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
%config InlineBackend.figure_format =’svg’from sklearn.datasets import load_boston
boston = load_boston()print(boston.DESCR)
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_df[‘MEDV’]= boston.target
boston_df.head().. _boston_dataset:

Boston house prices dataset


**Data Set Characteristics:**

:Number of Instances: 506

:Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

:Attribute Information (in order):

– CRIM per capita crime rate by town

– ZN proportion of residential land zoned for lots over 25,000 sq.ft.

– INDUS proportion of non-retail business acres per town

– CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)

– NOX nitric oxides concentration (parts per 10 million)

– RM average number of rooms per dwelling

– AGE proportion of owner-occupied units built prior to 1940

– DIS weighted distances to five Boston employment centres

– RAD index of accessibility to radial highways

– TAX full-value property-tax rate per $10,000

– PTRATIO pupil-teacher ratio by town

– B 1000(Bk – 0.63)^2 where Bk is the proportion of blacks by town

– LSTAT % lower status of the population

– MEDV Median value of owner-occupied homes in $1000’s

:Missing Attribute Values: None

:Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

The Boston house-price data of Harrison, D. and Rubinfeld, D.L. ‘Hedonic

prices and the demand for clean air’, J. Environ. Economics & Management,

vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, ‘Regression diagnostics

…’, Wiley, 1980. N.B. Various transformations are used in the table on

pages 244-261 of the latter.

The Boston house-price data has been used in many machine learning papers that address regression


.. topic:: References

– Belsley, Kuh & Welsch, ‘Regression diagnostics: Identifying Influential Data and Sources of Collinearity’, Wiley, 1980. 244-261.

– Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.







Разведывательный анализ

Как всегда начинаем изучение нового набора данных с разглядывания графиков. Визуализируем матрицу корреляций и ввиде тепловой карты:

cols =[‘LSTAT’,’INDUS’,’NOX’,’RM’,’MEDV’] hm = sns.heatmap(boston_df[cols].corr(),

Регрессионный анализ

Приступим к построению регрессионной модели. Определим зависимые и независимые переменные:

X = boston_df[[‘LSTAT’]].values
y = boston_df[‘MEDV’].valuesfrom sklearn.linear_model import LinearRegression
slr = LinearRegression()
slr.fit(X, y)
y_pred = slr.predict(X)print(‘Slope: {:.2f}’.format(slr.coef_[0]))print(‘Intercept: {:.2f}’.format(slr.intercept_))Slope: -0.95

Intercept: 34.55

PS: эти непонятные символы в фигурных скобках задают вид форматирования строки. В данном случае мы говорим, что хотим вывести число с плавающей точкой с точностью до двух знаков. Подробнее в Format Specification Mini-Language.

plt.scatter(X, y)
plt.plot(X, slr.predict(X), color=’red’, linewidth=2);

Для быстрой визуализации линейной зависимости можно также использовать функцию regplot из seaborn.

sns.regplot(x=”LSTAT”, y=”MEDV”, data=boston_df)

Посчитайте линейную регрессионную модель самостоятельно, используя описанные ранее формулу и библиотеку numpy. Проверьте, совпадают ли коэффициенты с результатами sklearn.


  • «Склеить» два столбца можно при помощи np.hstack.
  • Для получения обратной матрицы можно использовать np.linalg.inv.
  • Матричное умножение осуществляет np.dot.
  • w⃗=(XTX)−1XTy⃗vec{w} = left(X^T Xright)^{-1} X^T vec{y}w=(XTX)−1XTy​

Проверить решение

Xb = np.hstack((np.ones((X.shape[0], 1)), X))
w = np.zeros(X.shape[1])
z = np.linalg.inv(np.dot(Xb.T, Xb))
w = np.dot(z, np.dot(Xb.T, y))

print(‘Slope: {0:.2f}’.format(w[1]))

print(‘Intercept: {0:.2f}’.format(w[0]))

Проверка качество модели: практика

Возможные метрики для проверки качества модели в sklearn можно посмотреть в документации, а можно посчитать самим по формулам. Выберем простой путь.

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=0)slr = LinearRegression()

slr.fit(X_train, y_train)
y_train_pred = slr.predict(X_train)
y_test_pred = slr.predict(X_test)

Поскольку в нашей модели несколько независимых переменных, мы не можем отобразить их зависимость на двумерном пространстве, но можем нанести на график связь между остатками модели и предсказанными значениями, что также поможет нам диагностировать качество модели. Это называется Residuals plot. C его помощью мы можем увидет нелинейность и выбросы, проверить случайность распределения ошибки.

from sklearn.metrics import mean_absolute_error, mean_squared_error, median_absolute_error, r2_score

print(‘MSE train: {:.3f}, test: {:.3f}’.format(
mean_squared_error(y_train, y_train_pred),
mean_squared_error(y_test, y_test_pred)))print(‘R^2 train: {:.3f}, test: {:.3f}’.format(
r2_score(y_train, y_train_pred),
r2_score(y_test, y_test_pred)))MSE train: 37.934, test: 39.817

R^2 train: 0.552, test: 0.522
plt.scatter(y_train_pred, y_train_pred – y_train,
c=’blue’, marker=’o’, label=’Training data’)
plt.scatter(y_test_pred, y_test_pred – y_test,
c=’lightgreen’, marker=’s’, label=’Test data’)
plt.xlabel(‘Predicted values’)
plt.legend(loc=’upper left’)
plt.hlines(y=0, xmin=-10, xmax=50, lw=2, color=’red’)

Другой взгляд на построение статистических моделей — statsmodels

Statsmodels — ещё одна библиотека для построения статистических данных в Python, но выполненная в лучших традийиях R. Посмотрим, сравним реализацию линейных моделей в sklearn и statsmodels.

from sklearn.linear_model import LinearRegression

slr = LinearRegression()
slr.fit(X, y)
y_pred = slr.predict(X)print(‘Slope: {:.2f}’.format(slr.coef_[0]))print(‘Intercept: {:.2f}’.format(slr.intercept_))Slope: -0.95

Intercept: 34.55
import statsmodels.api as sm
import statsmodels.formula.api as smf

results = smf.ols(‘MEDV ~ LSTAT’, data=df).fit()

OLS Regression Results

Dep. Variable:



Adj. R-squared:




Prob (F-statistic):



No. Observations:


Df Residuals:


Df Model:

Covariance Type:

MEDV 0.544
OLS 0.543
Least Squares 601.6
Sat, 23 Mar 20195.08e-88
09:14:53 -1641.5
506 3287.
504 3295.

coefstd errtP>|t|[0.0250.975]



34.5538 0.563 61.415 0.000 33.448 35.659
-0.9500 0.039 -24.528 0.000 -1.026 -0.874



Jarque-Bera (JB):




Cond. No.

137.043 0.892
0.000 291.373
5.319 29.7

[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Регуляризация линейных моделей

Ограничения линейной регрессии

  • Линейность: зависимая переменная может линейно аппроксимировать независимые переменные
  • Нормальность распределения Y и ε
  • Отсутствие избытка влиятельных наблюдений
  • Гомоскадастичность распределения остатков
  • Отсутсвие мультиколлинеарности

Не все эти ограничения должны соблюдаться на 100%, особенно, если Вы занимаетес машинным обучением.

Обучение линейной регрессии

Метод наименьших квадратов

Чаще всего линейная регрессия обучается с использованием среднеквадратичной ошибки. В этом случае получаем задачу оптимизации функции стоимости (эмпирического риска) (считаем, что среди признаков есть константный, и поэтому свободный коэффициент не нужен):
L(X,y⃗,w⃗)=12n∑i=1n(yi−x⃗iTw⃗i)2=12n∣y⃗−Xw⃗∣22=12n(y⃗−Xw⃗)T(y⃗−Xw⃗)Large begin{array}{rcl}mathcal{L}left(X, vec{y}, vec{w} right) = frac{1}{2n} sum_{i=1}^n left(y_i – vec{x}_i^T vec{w}_iright)^2 \ = frac{1}{2n} left| vec{y} – X vec{w} right|_2^2 = frac{1}{2n} left(vec{y} – X vec{w}right)^T left(vec{y} – X vec{w}right) end{array}L(X,y​,w)=2n1​∑i=1n​(yi​−xiT​wi​)2=2n1​∣∣​y​−Xw∣∣​22​=2n1​(y​−Xw)T(y​−Xw)​

Если продифференцировать данный функционал по вектору www, приравнять к нулю и решить уравнение, то получим явную формулу для решения:

w⃗=(XTX)−1XTy⃗Large vec{w} = left(X^T Xright)^{-1} X^T vec{y}w=(XTX)−1XTy​

Полный вывод формулы, для рассчёта коэффициентов
Шпаргалка по матричным производным:
∂∂xxTa=a∂∂xxTAx=(A+AT)x∂∂AxTAy=xyT∂∂xA−1=−A−1∂A∂xA−1large begin{array}{rcl} frac{partial}{partial x} x^T a = a \\ frac{partial}{partial x} x^T A x = left(A + A^Tright)x \\ frac{partial}{partial A} x^T A y = xy^T\\ frac{partial}{partial x} A^{-1} = -A^{-1} frac{partial A}{partial x} A^{-1} end{array}∂x∂​xTa=a∂x∂​xTAx=(A+AT)x∂A∂​xTAy=xyT∂x∂​A−1=−A−1∂x∂A​A−1​

Вычислим производную функции стоимости:
∂L∂w⃗=∂∂w⃗12n(y⃗Ty⃗−2y⃗TXw⃗+w⃗TXTXw⃗)=12n(−2XTy⃗+2XTXw⃗)large begin{array}{rcl} frac{partial mathcal{L}}{partial vec{w}} = frac{partial}{partial vec{w}} frac{1}{2n} left( vec{y}^T vec{y} -2vec{y}^T X vec{w} + vec{w}^T X^T X vec{w}right) \ = frac{1}{2n} left(-2 X^T vec{y} + 2X^T X vec{w}right) end{array}∂w∂L​=∂w∂​2n1​(y​Ty​−2y​TXw+wTXTXw)=2n1​(−2XTy​+2XTXw)​

Приравняем к нулю и найдем решение в явном виде:

∂L∂w⃗=0amp;⇔amp;12n(−2XTy⃗+2XTXw⃗)=0amp;⇔amp;−XTy⃗+XTXw⃗=0amp;⇔amp;XTXw⃗=XTy⃗amp;⇔amp;w⃗=(XTX)−1XTy⃗Large begin{array}{rcl} frac{partial mathcal{L}}{partial vec{w}} = 0 &Leftrightarrow& frac{1}{2n} left(-2 X^T vec{y} + 2X^T X vec{w}right) = 0 \ &Leftrightarrow& -X^T vec{y} + X^T X vec{w} = 0 \ &Leftrightarrow& X^T X vec{w} = X^T vec{y} \ &Leftrightarrow& vec{w} = left(X^T Xright)^{-1} X^T vec{y} end{array}∂w∂L​=0​amp;⇔amp;⇔amp;⇔amp;⇔​amp;2n1​(−2XTy​+2XTXw)=0amp;−XTy​+XTXw=0amp;XTXw=XTy​amp;w=(XTX)−1XTy​​

Оценка МНК является лучшей оценкой параметров модели, среди всех линейных и несмещенных оценок, то есть обладающей наименьшей дисперсией (из теоремы Гаусса — Маркова).

Недостатки метода наименьших квадратов
Наличие явной формулы для оптимального вектора весов — это большое преимущество линейной регрессии. Но аналитическое решение не всегда возможно по ряду причин:

  • Обращение матрицы — сложная операция с кубической сложностью от количества признаков. Если в выборке тысячи признаков, то вычисления могут стать слишком трудоёмкими. Решить эту проблему можно путём использования численных методов оптимизации.
  • Матрица XTXX^T XXTX может быть вырожденной (определитель равено 0 → нет обратной матрицы) или плохо обусловленной. В этом случае обращение либо невозможно, либо может привести к неустойчивым результатам. Проблема решается с помощью регуляризации.

  • https://vitalflux.com/mean-square-error-r-squared-which-one-to-use/
  • https://nagornyy.me/it/regressionnye-modeli-v-python/
Решите Вашу проблему!