Mean squared error pandas

How to Calculate Mean Squared Error in Python The mean squared error is a common way to measure the prediction accuracy of a model. In this tutorial, you’ll learn how to calculate the mean squared error in Python. You’ll start off by learning what the mean squared error represents. Then you’ll learn how to […]

Содержание

  1. How to Calculate Mean Squared Error in Python
  2. What is the Mean Squared Error
  3. Interpreting the Mean Squared Error
  4. Loading a Sample Pandas DataFrame
  5. Calculating the Mean Squared Error with Scikit-Learn
  6. Calculating the Mean Squared Error from Scratch using Numpy
  7. Conclusion
  8. Additional Resources
  9. Python | Mean Squared Error
  10. How To Calculate Mean Squared Error In Python
  11. Formula to calculate mean squared error
  12. Derivation of Mean Squared Error
  13. Line regression graph
  14. To get the Mean Squared Error in Python using NumPy
  15. To get the MSE using sklearn
  16. Syntax
  17. Parameters
  18. Returns
  19. Calculating Mean Squared Error Without Using any Modules
  20. Calculate Mean Squared Error Using Negative Values
  21. Bonus: Gradient Descent
  22. 3.3. Метрики и оценки: количественная оценка качества прогнозов ¶
  23. 3.3.1. В scoring параметрах: определение правил оценки моделей
  24. 3.3.1.1. Общие случаи: предопределенные значения
  25. 3.3.1.2. Определение стратегии выигрыша от метрических функций
  26. 3.3.1.3. Реализация собственного скорингового объекта
  27. 3.3.1.4. Использование множественной метрической оценки
  28. 3.3.2. Метрики классификации
  29. 3.3.2.1. От бинарного до мультиклассового и многозначного
  30. 3.3.2.2. Оценка точности
  31. 3.3.2.3. Рейтинг точности Top-k
  32. 3.3.2.4. Сбалансированный показатель точности
  33. 3.3.2.5. Каппа Коэна
  34. 3.3.2.6. Матрица неточностей ¶
  35. 3.3.2.7. Отчет о классификации
  36. 3.3.2.8. Потеря Хэмминга
  37. 3.3.2.9. Точность, отзыв и F-меры
  38. 3.3.2.9.1. Бинарная классификация
  39. 3.3.2.9.2. Мультиклассовая и многозначная классификация
  40. 3.3.2.10. Оценка коэффициента сходства Жаккара
  41. 3.3.2.11. Петля лосс
  42. 3.3.2.12. Лог лосс
  43. 3.3.2.13. Коэффициент корреляции Мэтьюза
  44. 3.3.2.14. Матрица путаницы с несколькими метками
  45. 3.3.2.15. Рабочая характеристика приемника (ROC)
  46. 3.3.2.15.1. Двоичный регистр
  47. 3.3.2.15.2. Мультиклассовый кейс
  48. 3.3.2.15.3. Кейс с несколькими метками
  49. 3.3.2.16. Компромисс при обнаружении ошибок (DET)
  50. 3.3.2.17. Нулевой проигрыш
  51. 3.3.2.18. Потеря очков по Брайеру
  52. 3.3.3. Метрики ранжирования с несколькими ярлыками
  53. 3.3.3.1. Ошибка покрытия
  54. 3.3.3.2. Средняя точность ранжирования метки
  55. 3.3.3.3. Потеря рейтинга
  56. 3.3.3.4. Нормализованная дисконтированная совокупная прибыль
  57. 3.3.4. Метрики регрессии
  58. 3.3.4.1. Оценка объясненной дисперсии
  59. 3.3.4.2. Максимальная ошибка
  60. 3.3.4.3. Средняя абсолютная ошибка
  61. 3.3.4.4. Среднеквадратичная ошибка
  62. 3.3.4.5. Среднеквадратичная логарифмическая ошибка
  63. 3.3.4.6. Средняя абсолютная ошибка в процентах
  64. 3.3.4.7. Средняя абсолютная ошибка
  65. 3.3.4.8. R² балл, коэффициент детерминации
  66. 3.3.4.9. Средние отклонения Пуассона, Гаммы и Твиди
  67. 3.3.5. Метрики кластеризации
  68. 3.3.6. Фиктивные оценки

How to Calculate Mean Squared Error in Python

The mean squared error is a common way to measure the prediction accuracy of a model. In this tutorial, you’ll learn how to calculate the mean squared error in Python. You’ll start off by learning what the mean squared error represents. Then you’ll learn how to do this using Scikit-Learn (sklean), Numpy, as well as from scratch.

Table of Contents

What is the Mean Squared Error

The mean squared error measures the average of the squares of the errors. What this means, is that it returns the average of the sums of the square of each difference between the estimated value and the true value.

The MSE is always positive, though it can be 0 if the predictions are completely accurate. It incorporates the variance of the estimator (how widely spread the estimates are) and its bias (how different the estimated values are from their true values).

The formula looks like below:

Now that you have an understanding of how to calculate the MSE, let’s take a look at how it can be calculated using Python.

Interpreting the Mean Squared Error

The mean squared error is always 0 or positive. When a MSE is larger, this is an indication that the linear regression model doesn’t accurately predict the model.

An important piece to note is that the MSE is sensitive to outliers. This is because it calculates the average of every data point’s error. Because of this, a larger error on outliers will amplify the MSE.

There is no “target” value for the MSE. The MSE can, however, be a good indicator of how well a model fits your data. It can also give you an indicator of choosing one model over another.

Loading a Sample Pandas DataFrame

Let’s start off by loading a sample Pandas DataFrame. If you want to follow along with this tutorial line-by-line, simply copy the code below and paste it into your favorite code editor.

You can see that the editor has loaded a DataFrame containing values for variables x and y . We can plot this data out, including the line of best fit using Seaborn’s .regplot() function:

This returns the following visualization:

Plotting a line of best fit to help visualize mean squared error in Python

The mean squared error calculates the average of the sum of the squared differences between a data point and the line of best fit. By virtue of this, the lower a mean sqared error, the more better the line represents the relationship.

We can calculate this line of best using Scikit-Learn. You can learn about this in this in-depth tutorial on linear regression in sklearn. The code below predicts values for each x value using the linear model:

Calculating the Mean Squared Error with Scikit-Learn

The simplest way to calculate a mean squared error is to use Scikit-Learn (sklearn). The metrics module comes with a function, mean_squared_error() which allows you to pass in true and predicted values.

Let’s see how to calculate the MSE with sklearn:

This approach works very well when you’re already importing Scikit-Learn. That said, the function works easily on a Pandas DataFrame, as shown above.

In the next section, you’ll learn how to calculate the MSE with Numpy using a custom function.

Calculating the Mean Squared Error from Scratch using Numpy

Numpy itself doesn’t come with a function to calculate the mean squared error, but you can easily define a custom function to do this. We can make use of the subtract() function to subtract arrays element-wise.

The code above is a bit verbose, but it shows how the function operates. We can cut down the code significantly, as shown below:

Conclusion

In this tutorial, you learned what the mean squared error is and how it can be calculated using Python. First, you learned how to use Scikit-Learn’s mean_squared_error() function and then you built a custom function using Numpy.

The MSE is an important metric to use in evaluating the performance of your machine learning models. While Scikit-Learn abstracts the way in which the metric is calculated, understanding how it can be implemented from scratch can be a helpful tool.

Additional Resources

To learn more about related topics, check out the tutorials below:

Источник

Python | Mean Squared Error

The Mean Squared Error (MSE) or Mean Squared Deviation (MSD) of an estimator measures the average of error squares i.e. the average squared difference between the estimated values and true value. It is a risk function, corresponding to the expected value of the squared error loss. It is always non – negative and values close to zero are better. The MSE is the second moment of the error (about the origin) and thus incorporates both the variance of the estimator and its bias.

Steps to find the MSE

  1. Find the equation for the regression line.

(1)

Insert X values in the equation found in step 1 in order to get the respective Y values i.e.

(2)

(3)

Square the errors found in step 3.

(4)

Sum up all the squares.

(5)

(6)

Example:
Consider the given data points: (1,1), (2,1), (3,2), (4,2), (5,4)
You can use this online calculator to find the regression equation / line.

Regression line equation: Y = 0.7X – 0.1

X Y
1 1 0.6
2 1 1.29
3 2 1.99
4 2 2.69
5 4 3.4

Now, using formula found for MSE in step 6 above, we can get MSE = 0.21606

Источник

How To Calculate Mean Squared Error In Python

In this article, we are going to learn how to calculate the mean squared error in python? We are using two python libraries to calculate the mean squared error. NumPy and sklearn are the libraries we are going to use here. Also, we will learn how to calculate without using any module.

MSE is also useful for regression problems that are normally distributed. It is the mean squared error. So the squared error between the predicted values and the actual values. The summation of all the data points of the square difference between the predicted and actual values is divided by the no. of data points.

Formula to calculate mean squared error

Where Yi and Ŷi represent the actual values and the predicted values, the difference between them is squared.

Derivation of Mean Squared Error

First to find the regression line for the values (1,3), (2,2), (3,6), (4,1), (5,5). The regression value for the value is y=1.6+0.4x. Next to find the new Y values. The new values for y are tabulated below.

Given x value Calculating y value New y value
1 1.6+0.4(1) 2
2 1.6+0.4(2) 2.4
3 1.6+0.4(3) 2.8
4 1.6+0.4(4) 3.2
5 1.6+0.4(5) 3.6

Now to find the error ( Yi – Ŷi )

We have to square all the errors

By adding all the errors we will get the MSE

Line regression graph

Let us consider the values (1,3), (2,2), (3,6), (4,1), (5,5) to plot the graph.

The straight line represents the predicted value in this graph, and the points represent the actual data. The difference between this line and the points is squared, known as mean squared error.

To get the Mean Squared Error in Python using NumPy

Importing numpy library as np. Creating two variables. true_value_of_y holds an original value. predicted_value_of_y holds a calculated value. Next, giving the formula to calculate the mean squared error.

Output

To get the MSE using sklearn

sklearn is a library that is used for many mathematical calculations in python. Here we are going to use this library to calculate the MSE

Syntax

Parameters

  • y_true – true value of y
  • y_pred – predicted value of y
  • sample_weight
  • multioutput
  • raw_values
  • uniform_average
  • squared

Returns

Mean squared error.

From sklearn.metrices library importing mean_squared_error. Creating two variables. true_value_of_y holds an original value. predicted_value_of_y holds a calculated value. Next, giving the formula to calculate the mean squared error.

Output

Calculating Mean Squared Error Without Using any Modules

Declaring the true values and the predicted values to two different variables. Initializing the variable summation_of_value is zero to store the values. len() function is useful to check the number of values in true_value_of_y. Creating for loop to iterate. Calculating the difference between true_value and the predicted_value. Next getting the square of the difference. Adding all the squared differences, we will get the MSE.

Output

Calculate Mean Squared Error Using Negative Values

Now let us consider some negative values to calculate MSE. The values are (1,2), (3,-1), (5,0.6), (4,-0.7), (2,-0.2). The regression line equation is y=1.13-0.33x

The line regression graph for this value is:

New y values for this will be:

Given x value Calculating y value New y value
1 1.13-033(1) 0.9
3 1.13-033(3) 0.1
5 1.13-033(5) -0.4
4 1.13-033(4) -0.1
2 1.13-033(2) 0.6

First, importing a module. Declaring values to the variables. Here we are using negative value to calculate. Using the mean_squared_error module, we are calculating the MSE.

Output

Bonus: Gradient Descent

Gradient Descent is used to find the local minimum of the functions. In this case, the functions need to be differentiable. The basic idea is to move in the direction opposite from the derivate at any point.

The following code works on a set of values that are available on the Github repository.

Источник

3.3. Метрики и оценки: количественная оценка качества прогнозов ¶

Есть 3 различных API для оценки качества прогнозов модели:

  • Метод оценки оценщика : у оценщиков есть score метод, обеспечивающий критерий оценки по умолчанию для проблемы, для решения которой они предназначены. Это обсуждается не на этой странице, а в документации каждого оценщика.
  • Параметр оценки: инструменты оценки модели с использованием перекрестной проверки (например, model_selection.cross_val_score и model_selection.GridSearchCV ) полагаются на внутреннюю стратегию оценки . Это обсуждается в разделе Параметр оценки: определение правил оценки модели .
  • Метрические функции : В sklearn.metrics модуле реализованы функции оценки ошибки прогноза для конкретных целей. Эти показатели подробно описаны в разделах по метрикам классификации , MultiLabel ранжирования показателей , показателей регрессии и показателей кластеризации .

Наконец, фиктивные оценки полезны для получения базового значения этих показателей для случайных прогнозов.

«Парные» метрики между выборками, а не оценками или прогнозами, см. В разделе « Парные метрики, сходства и ядра ».

3.3.1. В scoring параметрах: определение правил оценки моделей

Выбор и оценка модели с использованием таких инструментов, как model_selection.GridSearchCV и model_selection.cross_val_score , принимают scoring параметр, который контролирует, какую метрику они применяют к оцениваемым оценщикам.

3.3.1.1. Общие случаи: предопределенные значения

Для наиболее распространенных случаев использования вы можете назначить объект подсчета с помощью scoring параметра; в таблице ниже показаны все возможные значения. Все объекты счетчика следуют соглашению о том, что более высокие возвращаемые значения лучше, чем более низкие возвращаемые значения . Таким образом, метрики, которые измеряют расстояние между моделью и данными, например metrics.mean_squared_error , доступны как neg_mean_squared_error, которые возвращают инвертированное значение метрики.

Подсчет очков Функция Комментарий
Классификация
‘accuracy’ metrics.accuracy_score
‘balanced_accuracy’ metrics.balanced_accuracy_score
‘top_k_accuracy’ metrics.top_k_accuracy_score
‘average_precision’ metrics.average_precision_score
‘neg_brier_score’ metrics.brier_score_loss
‘f1’ metrics.f1_score для двоичных целей
‘f1_micro’ metrics.f1_score микро-усредненный
‘f1_macro’ metrics.f1_score микро-усредненный
‘f1_weighted’ metrics.f1_score средневзвешенное
‘f1_samples’ metrics.f1_score по многопозиционному образцу
‘neg_log_loss’ metrics.log_loss требуется
predict_proba поддержка
‘precision’ etc. metrics.precision_score суффиксы применяются как с ‘f1’
‘recall’ etc. metrics.recall_score суффиксы применяются как с ‘f1’
‘jaccard’ etc. metrics.jaccard_score суффиксы применяются как с ‘f1’
‘roc_auc’ metrics.roc_auc_score
‘roc_auc_ovr’ metrics.roc_auc_score
‘roc_auc_ovo’ metrics.roc_auc_score
‘roc_auc_ovr_weighted’ metrics.roc_auc_score
‘roc_auc_ovo_weighted’ metrics.roc_auc_score
Кластеризация
‘adjusted_mutual_info_score’ metrics.adjusted_mutual_info_score
‘adjusted_rand_score’ metrics.adjusted_rand_score
‘completeness_score’ metrics.completeness_score
‘fowlkes_mallows_score’ metrics.fowlkes_mallows_score
‘homogeneity_score’ metrics.homogeneity_score
‘mutual_info_score’ metrics.mutual_info_score
‘normalized_mutual_info_score’ metrics.normalized_mutual_info_score
‘rand_score’ metrics.rand_score
‘v_measure_score’ metrics.v_measure_score
Регрессия
‘explained_variance’ metrics.explained_variance_score
‘max_error’ metrics.max_error
‘neg_mean_absolute_error’ metrics.mean_absolute_error
‘neg_mean_squared_error’ metrics.mean_squared_error
‘neg_root_mean_squared_error’ metrics.mean_squared_error
‘neg_mean_squared_log_error’ metrics.mean_squared_log_error
‘neg_median_absolute_error’ metrics.median_absolute_error
‘r2’ metrics.r2_score
‘neg_mean_poisson_deviance’ metrics.mean_poisson_deviance
‘neg_mean_gamma_deviance’ metrics.mean_gamma_deviance
‘neg_mean_absolute_percentage_error’ metrics.mean_absolute_percentage_error

Значения, перечисленные в виде ValueError исключения, соответствуют функциям измерения точности прогнозирования, описанным в следующих разделах. Объекты счетчика для этих функций хранятся в словаре sklearn.metrics.SCORERS .

3.3.1.2. Определение стратегии выигрыша от метрических функций

Модуль sklearn.metrics также предоставляет набор простых функций, измеряющих ошибку предсказания с учетом истинности и предсказания:

  • функции, заканчивающиеся на, _score возвращают значение для максимизации, чем выше, тем лучше.
  • функции, заканчивающиеся на _error или _loss возвращающие значение, которое нужно минимизировать, чем ниже, тем лучше. При преобразовании в объект счетчика с использованием make_scorer установите для greater_is_better параметра значение False ( True по умолчанию; см. Описание параметра ниже).

Метрики, доступные для различных задач машинного обучения, подробно описаны в разделах ниже.

Многим метрикам не даются имена для использования в качестве scoring значений, иногда потому, что они требуют дополнительных параметров, например fbeta_score . В таких случаях вам необходимо создать соответствующий объект оценки. Самый простой способ создать вызываемый объект для оценки — использовать make_scorer . Эта функция преобразует метрики в вызываемые объекты, которые можно использовать для оценки модели.

Один из типичных вариантов использования — обернуть существующую метрическую функцию из библиотеки значениями, отличными от значений по умолчанию для ее параметров, такими как beta параметр для fbeta_score функции:

Второй вариант использования — создание полностью настраиваемого объекта скоринга из простой функции Python с использованием make_scorer , которая может принимать несколько параметров:

  • функция Python, которую вы хотите использовать ( my_custom_loss_func в примере ниже)
  • возвращает ли функция Python оценку ( greater_is_better=True , по умолчанию) или потерю ( greater_is_better=False ). В случае потери результат функции python аннулируется объектом скоринга в соответствии с соглашением о перекрестной проверке, согласно которому скоринтеры возвращают более высокие значения для лучших моделей.
  • только для показателей классификации: требуется ли для предоставленной вами функции Python постоянная уверенность в принятии решений ( needs_threshold=True ). Значение по умолчанию неверно.
  • любые дополнительные параметры, такие как beta или labels в f1_score .

Вот пример создания пользовательских счетчиков очков и использования greater_is_better параметра:

3.3.1.3. Реализация собственного скорингового объекта

Вы можете сгенерировать еще более гибкие модели скоринга, создав свой собственный скоринговый объект с нуля, без использования make_scorer фабрики. Чтобы вызываемый может быть бомбардиром, он должен соответствовать протоколу, указанному в следующих двух правилах:

  • Его можно вызвать с параметрами (estimator, X, y), где estimator это модель, которая должна быть оценена, X это данные проверки и y основная истинная цель для (в контролируемом случае) или None (в неконтролируемом случае).
  • Он возвращает число с плавающей запятой, которое количественно определяет estimator качество прогнозирования X со ссылкой на y . Опять же, по соглашению более высокие числа лучше, поэтому, если ваш секретарь сообщает о проигрыше, это значение следует отменить.

Примечание Использование пользовательских счетчиков в функциях, где n_jobs> 1

Хотя определение пользовательской функции оценки вместе с вызывающей функцией должно работать из коробки с бэкэндом joblib по умолчанию (loky), его импорт из другого модуля будет более надежным подходом и будет работать независимо от бэкэнда joblib.

Например, чтобы использовать n_jobs больше 1 в примере ниже, custom_scoring_function функция сохраняется в созданном пользователем модуле ( custom_scorer_module.py ) и импортируется:

3.3.1.4. Использование множественной метрической оценки

Scikit-learn также позволяет оценивать несколько показателей в GridSearchCV , RandomizedSearchCV и cross_validate .

Есть три способа указать несколько показателей оценки для scoring параметра:

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

Обратите внимание, что значения dict могут быть либо функциями счетчика, либо одной из предварительно определенных строк показателей.

  • Как вызываемый объект, возвращающий словарь оценок:

3.3.2. Метрики классификации

В sklearn.metrics модуле реализованы несколько функций потерь, оценки и полезности для измерения эффективности классификации. Некоторые метрики могут потребовать оценок вероятности положительного класса, значений достоверности или значений двоичных решений. Большинство реализаций позволяют каждой выборке вносить взвешенный вклад в общую оценку с помощью sample_weight параметра.

Некоторые из них ограничены случаем двоичной классификации:

precision_recall_curve (y_true, probas_pred, *) Вычислите пары точности-отзыва для разных пороговых значений вероятности.
roc_curve (y_true, y_score, *[, pos_label, …]) Вычислить рабочую характеристику приемника (ROC).
det_curve (y_true, y_score[, pos_label, …]) Вычислите частоту ошибок для различных пороговых значений вероятности.

Другие также работают в случае мультикласса:

balanced_accuracy_score (y_true, y_pred, *[, …]) Вычислите сбалансированную точность.
cohen_kappa_score (y1, y2, *[, labels, …]) Каппа Коэна: статистика, измеряющая согласованность аннотаторов.
confusion_matrix (y_true, y_pred, *[, …]) Вычислите матрицу неточностей, чтобы оценить точность классификации.
hinge_loss (y_true, pred_decision, *[, …]) Средняя потеря петель (нерегулируемая).
matthews_corrcoef (y_true, y_pred, *[, …]) Вычислите коэффициент корреляции Мэтьюза (MCC).
roc_auc_score (y_true, y_score, *[, average, …]) Вычислить площадь под кривой рабочих характеристик приемника (ROC AUC) по оценкам прогнозов.
top_k_accuracy_score (y_true, y_score, *[, …]) Top-k Рейтинг по классификации точности.

Некоторые также работают в многоярусном регистре:

accuracy_score (y_true, y_pred, *[, …]) Классификационная оценка точности.
classification_report (y_true, y_pred, *[, …]) Создайте текстовый отчет, показывающий основные показатели классификации.
f1_score (y_true, y_pred, *[, labels, …]) Вычислите оценку F1, также известную как сбалансированная оценка F или F-мера.
fbeta_score (y_true, y_pred, *, beta[, …]) Вычислите оценку F-beta.
hamming_loss (y_true, y_pred, *[, sample_weight]) Вычислите среднюю потерю Хэмминга.
jaccard_score (y_true, y_pred, *[, labels, …]) Оценка коэффициента сходства Жаккара.
log_loss (y_true, y_pred, *[, eps, …]) Потеря журнала, также известная как потеря логистики или потеря кросс-энтропии.
multilabel_confusion_matrix (y_true, y_pred, *) Вычислите матрицу неточностей для каждого класса или образца.
precision_recall_fscore_support (y_true, …) Точность вычислений, отзыв, F-мера и поддержка для каждого класса.
precision_score (y_true, y_pred, *[, labels, …]) Вычислите точность.
recall_score (y_true, y_pred, *[, labels, …]) Вычислите отзыв.
roc_auc_score (y_true, y_score, *[, average, …]) Вычислить площадь под кривой рабочих характеристик приемника (ROC AUC) по оценкам прогнозов.
zero_one_loss (y_true, y_pred, *[, …]) Потеря классификации нулевая единица.

А некоторые работают с двоичными и многозначными (но не мультиклассовыми) проблемами:

average_precision_score (y_true, y_score, *) Вычислить среднюю точность (AP) из оценок прогнозов.

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

3.3.2.1. От бинарного до мультиклассового и многозначного

Некоторые метрики по существу определены для задач двоичной классификации (например f1_score , roc_auc_score ). В этих случаях по умолчанию оценивается только положительная метка, предполагая по умолчанию, что положительный класс помечен 1 (хотя это можно настроить с помощью pos_label параметра).

При расширении двоичной метрики на задачи с несколькими классами или метками данные обрабатываются как набор двоичных задач, по одной для каждого класса. Затем есть несколько способов усреднить вычисления двоичных показателей по набору классов, каждый из которых может быть полезен в некотором сценарии. Если возможно, вы должны выбрать одно из них с помощью average параметра.

  • «macro» просто вычисляет среднее значение двоичных показателей, придавая каждому классу одинаковый вес. В задачах, где редкие занятия тем не менее важны, макро-усреднение может быть средством выделения их производительности. С другой стороны, предположение, что все классы одинаково важны, часто неверно, так что макро-усреднение будет чрезмерно подчеркивать обычно низкую производительность для нечастого класса.
  • «weighted» учитывает дисбаланс классов, вычисляя среднее значение двоичных показателей, в которых оценка каждого класса взвешивается по его присутствию в истинной выборке данных.
  • «micro» дает каждой паре выборка-класс равный вклад в общую метрику (за исключением результата взвешивания выборки). Вместо того, чтобы суммировать метрику для каждого класса, это суммирует дивиденды и делители, составляющие метрики для каждого класса, для расчета общего частного. Микро-усреднение может быть предпочтительным в настройках с несколькими ярлыками, включая многоклассовую классификацию, когда класс большинства следует игнорировать.
  • «samples» применяется только к задачам с несколькими ярлыками. Он не вычисляет меру для каждого класса, вместо этого вычисляет метрику по истинным и прогнозируемым классам для каждой выборки в данных оценки и возвращает их ( sample_weight — взвешенное) среднее значение.
  • Выбор average=None вернет массив с оценкой для каждого класса.

В то время как данные мультикласса предоставляются метрике, как двоичные цели, в виде массива меток классов, данные с несколькими метками указываются как индикаторная матрица, в которой ячейка [i, j] имеет значение 1, если у образца i есть метка j, и значение 0 в противном случае.

3.3.2.2. Оценка точности

Функция accuracy_score вычисляет точность , либо фракции ( по умолчанию) или количество (нормализует = False) правильных предсказаний.

В классификации с несколькими ярлыками функция возвращает точность подмножества. Если весь набор предсказанных меток для выборки строго соответствует истинному набору меток, то точность подмножества равна 1,0; в противном случае — 0, 0.

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда доля правильных прогнозов по сравнению с $n_$ определяется как
$$texttt(y, hat) = frac<1>> sum_^-1> 1(hat_i = y_i)$$

В многопозиционном корпусе с бинарными индикаторами меток:

  • См. В разделе Проверка с перестановками значимости классификационной оценки пример использования показателя точности с использованием перестановок набора данных.

3.3.2.3. Рейтинг точности Top-k

Функция top_k_accuracy_score представляет собой обобщение accuracy_score . Разница в том, что прогноз считается правильным, если истинная метка связана с одним из k наивысших прогнозируемых баллов. accuracy_score является частным случаем k = 1 .

Функция охватывает случаи двоичной и многоклассовой классификации, но не случай многозначной классификации.

Если $hat_$ прогнозируемый класс для $i$-й образец, соответствующий $j$-й по величине прогнозируемый результат и $y_i$ — соответствующее истинное значение, тогда доля правильных прогнозов по сравнению с $n_$ определяется как
$$texttt(y, hat) = frac<1>> sum_^-1> sum_^ 1(hat_ = y_i)$$

где k допустимое количество предположений и 1(x)- индикаторная функция.

3.3.2.4. Сбалансированный показатель точности

Функция balanced_accuracy_score вычисляет взвешенную точность , что позволяет избежать завышенных оценок производительности на несбалансированных данных. Это макросреднее количество оценок отзыва по классу или, что то же самое, грубая точность, где каждая выборка взвешивается в соответствии с обратной распространенностью ее истинного класса. Таким образом, для сбалансированных наборов данных оценка равна точности.

В двоичном случае сбалансированная точность равна среднему арифметическому чувствительности (истинно положительный показатель) и специфичности (истинно отрицательный показатель) или площади под кривой ROC с двоичными прогнозами, а не баллами:
$$texttt = frac<1><2>left( frac + fracright )$$

Если классификатор одинаково хорошо работает в любом классе, этот термин сокращается до обычной точности (т. е. Количества правильных прогнозов, деленного на общее количество прогнозов).

Напротив, если обычная точность выше вероятности только потому, что классификатор использует несбалансированный набор тестов, тогда сбалансированная точность, при необходимости, упадет до $frac<1>$.

Оценка варьируется от 0 до 1 или, когда adjusted=True используется, масштабируется до диапазона $frac<1><1 — n_classes>$ до 1 включительно, с произвольной оценкой 0.

Если yi истинная ценность $i$-й образец, и $w_i$ — соответствующий вес образца, затем мы настраиваем вес образца на:
$$hat_i = frac<sum_j<1(y_j = y_i) w_j>>$$

где $1(x)$- индикаторная функция . Учитывая предсказанный $hat_i$ для образца $i$, сбалансированная точность определяется как:
$$texttt(y, hat, w) = frac<1><sum<hat_i>> sum_i 1(hat_i = y_i) hat_i$$

С adjusted=True сбалансированной точностью сообщает об относительном увеличении от $texttt(y, mathbf<0>, w) =frac<1>$. В двоичном случае это также известно как * статистика Юдена * , или информированность .

Определение мультикласса здесь кажется наиболее разумным расширением метрики, используемой в бинарной классификации, хотя в литературе нет определенного консенсуса:

  • Наше определение: [Mosley2013] , [Kelleher2015] и [Guyon2015] , где [Guyon2015] принимает скорректированную версию, чтобы гарантировать, что случайные предсказания имеют оценку а точные предсказания имеют оценку 1..
  • Точность балансировки классов, как описано в [Mosley2013] : вычисляется минимум между точностью и отзывом для каждого класса. Затем эти значения усредняются по общему количеству классов для получения сбалансированной точности.
  • Сбалансированная точность, как описано в [Urbanowicz2015] : среднее значение чувствительности и специфичности вычисляется для каждого класса, а затем усредняется по общему количеству классов.

3.3.2.5. Каппа Коэна

Функция cohen_kappa_score вычисляет каппа-Коэна статистику. Эта мера предназначена для сравнения меток, сделанных разными людьми-аннотаторами, а не классификатором с достоверной информацией.

Показатель каппа (см. Строку документации) представляет собой число от -1 до 1. Баллы выше 0,8 обычно считаются хорошим совпадением; ноль или ниже означает отсутствие согласия (практически случайные метки).

Оценка Каппа может быть вычислена для двоичных или многоклассовых задач, но не для задач с несколькими метками (за исключением ручного вычисления оценки для каждой метки) и не более чем для двух аннотаторов.

3.3.2.6. Матрица неточностей ¶

Точность функции confusion_matrix вычисляет классификацию пути вычисления матрицы путаницы с каждой строкой , соответствующей истинный классом (Википедия и другие ссылки могут использовать различные конвенции для осей).

По определению запись i,j в матрице неточностей — количество наблюдений в группе i, но предполагается, что он будет в группе j. Вот пример:

plot_confusion_matrix может использоваться для визуального представления матрицы неточностей, как показано в примере матрицы неточностей, который создает следующий рисунок:

Параметр normalize позволяет сообщать коэффициенты вместо подсчетов. Матрица путаница может быть нормализована в 3 различными способами: ‘pred’ , ‘true’ и ‘all’ которые будут делить счетчики на сумму каждого столбца, строки или всей матрицы, соответственно.

Для двоичных задач мы можем получить подсчет истинно отрицательных, ложноположительных, ложноотрицательных и истинно положительных результатов следующим образом:

  • См. В разделе Матрица неточностей пример использования матрицы неточностей для оценки качества выходных данных классификатора.
  • См. В разделе Распознавание рукописных цифр пример использования матрицы неточностей для классификации рукописных цифр.
  • См. Раздел Классификация текстовых документов с использованием разреженных функций для примера использования матрицы неточностей для классификации текстовых документов.

3.3.2.7. Отчет о классификации

Функция classification_report создает текстовый отчет , показывающий основные показатели классификации. Вот небольшой пример с настраиваемыми target_names и предполагаемыми ярлыками:

  • См. В разделе Распознавание рукописных цифр пример использования отчета о классификации рукописных цифр.
  • См. Раздел Классификация текстовых документов с использованием разреженных функций, где приведен пример использования отчета о классификации для текстовых документов.
  • См. Раздел « Оценка параметров с использованием поиска по сетке с перекрестной проверкой», где приведен пример использования отчета о классификации для поиска по сетке с вложенной перекрестной проверкой.

3.3.2.8. Потеря Хэмминга

hamming_loss вычисляет среднюю потерю Хэмминга или расстояние Хемминга между двумя наборами образцов.

Если $hat_j$ прогнозируемое значение для $j$-я этикетка данного образца, $y_j$ — соответствующее истинное значение, а $n_$ — количество классов или меток, то потеря Хэмминга $L_$ между двумя образцами определяется как:
$$L_(y, hat) = frac<1>> sum_^ — 1> 1(hat_j not= y_j)$$

В многопозиционном корпусе с бинарными индикаторами меток:

В мультиклассовой классификации потери Хэмминга соответствуют расстоянию Хэмминга между y_true и, y_pred что аналогично функции потерь нуля или единицы . Однако, в то время как потеря нуля или единицы наказывает наборы предсказаний, которые не строго соответствуют истинным наборам, потеря Хэмминга наказывает отдельные метки. Таким образом, потеря Хэмминга, ограниченная сверху потерей нуля или единицы, всегда находится между нулем и единицей включительно; и прогнозирование надлежащего подмножества или надмножества истинных меток даст исключительную потерю Хэмминга от нуля до единицы.

3.3.2.9. Точность, отзыв и F-меры

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

F-мера ($F_beta$ а также $F_1$ меры) можно интерпретировать как взвешенное гармоническое среднее значение точности и полноты. А $F_beta$ мера достигает своего лучшего значения на уровне 1 и худшего результата на уровне 0. С $beta = 1$, $F_beta$ а также $F_1$ эквивалентны, а отзыв и точность одинаково важны.

precision_recall_curve вычисляет кривую точности-отзыва на основе наземной метки истинности и оценки, полученной классификатором путем изменения порога принятия решения.

Функция average_precision_score вычисляет среднюю точность (AP) от оценки прогнозирования. Значение от 0 до 1 и выше — лучше. AP определяется как
$$text = sum_n (R_n — R_) P_n$$

где $P_n$ а также $R_n$- точность и отзыв на n-м пороге. При случайных прогнозах AP — это доля положительных образцов.

Ссылки [Manning2008] и [Everingham2010] представляют альтернативные варианты AP, которые интерполируют кривую точности-отзыва. В настоящее время average_precision_score не реализован какой-либо вариант с интерполяцией. Ссылки [Davis2006] и [Flach2015] описывают, почему линейная интерполяция точек на кривой точности-отзыва обеспечивает чрезмерно оптимистичный показатель эффективности классификатора. Эта линейная интерполяция используется при вычислении площади под кривой с помощью правила трапеции в auc .

Несколько функций позволяют анализировать точность, отзыв и оценку F-мер:

average_precision_score (y_true, y_score, *) Вычислить среднюю точность (AP) из оценок прогнозов.
f1_score (y_true, y_pred, *[, labels, …]) Вычислите оценку F1, также известную как сбалансированная оценка F или F-мера.
fbeta_score (y_true, y_pred, *, beta[, …]) Вычислите оценку F-beta.
precision_recall_curve (y_true, probas_pred, *) Вычислите пары точности-отзыва для разных пороговых значений вероятности.
precision_recall_fscore_support (y_true, …) Точность вычислений, отзыв, F-мера и поддержка для каждого класса.
precision_score (y_true, y_pred, *[, labels, …]) Вычислите точность.
recall_score (y_true, y_pred, *[, labels, …]) Вычислите рекол.

Обратите внимание, что функция precision_recall_curve ограничена двоичным регистром. Функция average_precision_score работает только в двоичном формате классификации и MultiLabel индикатора. В функции plot_precision_recall_curve графики точности вспомнить следующим образом .

  • См. Раздел Классификация текстовых документов с использованием разреженных функций для примера использования f1_score для классификации текстовых документов.
  • См. Раздел « Оценка параметров с использованием поиска по сетке с перекрестной проверкой», где приведен пример precision_score и recall_score использование для оценки параметров с помощью поиска по сетке с вложенной перекрестной проверкой.
  • См. В разделе Precision-Recall пример использования precision_recall_curve для оценки качества вывода классификатора.

3.3.2.9.1. Бинарная классификация

В задаче бинарной классификации термины «положительный» и «отрицательный» относятся к предсказанию классификатора, а термины «истинный» и «ложный» относятся к тому, соответствует ли этот прогноз внешнему суждению ( иногда известное как «наблюдение»). Учитывая эти определения, мы можем сформулировать следующую таблицу:

Фактический класс (наблюдение)
Прогнозируемый класс (ожидание) tp (истинно положительный результат) Правильный результат fp (ложное срабатывание) Неожиданный результат
Прогнозируемый класс (ожидание) fn (ложноотрицательный) Отсутствует результат tn (истинно отрицательное) Правильное отсутствие результата

Вот несколько небольших примеров бинарной классификации:

3.3.2.9.2. Мультиклассовая и многозначная классификация

В задаче классификации по нескольким классам и меткам понятия точности, отзыва и F-меры могут применяться к каждой метке независимо. Есть несколько способов , чтобы объединить результаты по этикеткам, указанных в average аргументе к average_precision_score (MultiLabel только) f1_score , fbeta_score , precision_recall_fscore_support , precision_score и recall_score функция, как описано выше . Обратите внимание, что если включены все метки, «микро» -усреднение в настройке мультикласса обеспечит точность, отзыв и $F$ все они идентичны по точности. Также обратите внимание, что «взвешенное» усреднение может дать оценку F, которая не находится между точностью и отзывом.

Чтобы сделать это более явным, рассмотрим следующие обозначения:

  • $y$ набор предсказанных ($sample$, $label$) пары
  • $hat$ набор истинных ($sample$, $label$) пары
  • $L$ набор лейблов
  • $S$ набор образцов
  • $y_s$ подмножество $y$ с образцом $s$, т.е $y_s := left<(s’, l) in y | s’ = sright>$.
  • $y_l$ подмножество $y$ с этикеткой $l$
  • по аналогии, $hat_s$ а также $hat_l$ являются подмножествами $hat$
  • $P(A, B) := frac<left| A cap B right|><left|Aright|>$ для некоторых наборов $A$ и $B$
  • $R(A, B) := frac<left| A cap B right|><left|Bright|>$ (Условные обозначения различаются в зависимости от обращения $B = emptyset$; эта реализация использует $R(A, B):=0$, и аналогичные для $P$.)
  • $$F_beta(A, B) := left(1 + beta^2right) frac<beta^2 P(A, B) + R(A, B)>$$

Тогда показатели определяются как:

average Точность Отзывать F_beta
«micro» $P(y, hat)$ $R(y, hat)$ $F_beta(y, hat)$
«samples» $frac<1> <left|Sright|>sum_ P(y_s, hat_s)$ $frac<1> <left|Sright|>sum_ R(y_s, hat_s)$ $frac<1> <left|Sright|>sum_ F_beta(y_s, hat_s)$
«macro» $frac<1> <left|Lright|>sum_ P(y_l, hat_l)$ $frac<1> <left|Lright|>sum_ R(y_l, hat_l)$ $frac<1> <left|Lright|>sum_ F_beta(y_l, hat_l)$
«weighted» $frac<1> <sum_left|hatlright|> sum left|hat_lright| P(y_l, hat_l)$ $frac<1> <sum_left|hatlright|> sum left|hat_lright| R(y_l, hat_l)$ $frac<1> <sum_left|hatlright|> sum left|hatlright| Fbeta(y_l, hat_l)$
None $langle P(y_l, hat_l) | l in L rangle$ $langle R(y_l, hat_l) | l in L rangle$ $langle F_beta(y_l, hat_l) | l in L rangle$

Для мультиклассовой классификации с «отрицательным классом» можно исключить некоторые метки:

Точно так же метки, отсутствующие в выборке данных, могут учитываться при макро-усреднении.

3.3.2.10. Оценка коэффициента сходства Жаккара

Функция jaccard_score вычисляет среднее значение коэффициентов сходства Jaccard , также называемый индексом Jaccard, между парами множеств меток.

Коэффициент подобия Жаккара i-ые образцы, с набором меток наземной достоверности yi и прогнозируемый набор меток y^i, определяется как
$$J(y_i, hat_i) = frac<|y_i cap hat_i|><|y_i cup hat_i|>.$$

jaccard_score работает как precision_recall_fscore_support наивно установленная мера, применяемая изначально к бинарным целям, и расширена для применения к множественным меткам и мультиклассам за счет использования average (см. выше ).

В двоичном случае:

В многопозиционном корпусе с бинарными индикаторами меток:

Задачи с несколькими классами преобразуются в двоичную форму и обрабатываются как соответствующая задача с несколькими метками:

3.3.2.11. Петля лосс

Функция hinge_loss вычисляет среднее расстояние между моделью и данными с использованием петля лосс, односторонний показателем , который учитывает только ошибки прогнозирования. (Потери на шарнирах используются в классификаторах максимальной маржи, таких как опорные векторные машины.)

Если метки закодированы с помощью +1 и -1, $y$: истинное значение, а $w$ — прогнозируемые решения на выходе decision_function , тогда потери на шарнирах определяются как:
$$L_text(y, w) = maxleft <1 — wy, 0right>= left|1 — wyright|_+$$

Если имеется более двух ярлыков, hinge_loss используется мультиклассовый вариант, разработанный Crammer & Singer. Вот статья, описывающая это.

Если $y_w$ прогнозируемое решение для истинного лейбла и $y_t$ — это максимум предсказанных решений для всех других меток, где предсказанные решения выводятся функцией принятия решений, тогда потеря шарнира в нескольких классах определяется следующим образом:
$$L_text(y_w, y_t) = maxleft<1 + y_t — y_w, 0right>$$

Вот небольшой пример, демонстрирующий использование hinge_loss функции с классификатором svm в задаче двоичного класса:

Вот пример, демонстрирующий использование hinge_loss функции с классификатором svm в мультиклассовой задаче:

3.3.2.12. Лог лосс

Лог лосс, также называемые потерями логистической регрессии или кросс-энтропийными потерями, определяются на основе оценок вероятности. Он обычно используется в (полиномиальной) логистической регрессии и нейронных сетях, а также в некоторых вариантах максимизации ожидания и может использоваться для оценки выходов вероятности ( predict_proba ) классификатора вместо его дискретных прогнозов.

Для двоичной классификации с истинной меткой $y in <0,1>$ и оценка вероятности $p = operatorname(y = 1)$, логарифмическая потеря на выборку представляет собой отрицательную логарифмическую вероятность классификатора с истинной меткой:
$$L_<log>(y, p) = -log operatorname(y|p) = -(y log (p) + (1 — y) log (1 — p))$$

Это распространяется на случай мультикласса следующим образом. Пусть истинные метки для набора выборок будут закодированы размером 1 из K как двоичная индикаторная матрица $Y$, т.е. $y_=1$ если образец $i$ есть ярлык $k$ взят из набора $K$ этикетки. Пусть $P$ — матрица оценок вероятностей, с $p_ = operatorname(y_ = 1)$. Тогда потеря журнала всего набора равна
$$L_<log>(Y, P) = -log operatorname(Y|P) = — frac<1> sum_^ sum_^ y_ log p_$$

Чтобы увидеть, как это обобщает приведенную выше потерю двоичного журнала, обратите внимание, что в двоичном случае $p_ = 1 — p_$ и $y_ = 1 — y_$, поэтому разложив внутреннюю сумму на $y_ in <0,1>$ дает двоичную потерю журнала.

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

Первое [.9, .1] в y_pred означает 90% вероятность того, что первая выборка будет иметь метку 0. Лог лос неотрицательны.

3.3.2.13. Коэффициент корреляции Мэтьюза

Функция matthews_corrcoef вычисляет коэффициент корреляции Матфея (MCC) для двоичных классов. Цитата из Википедии:

«Коэффициент корреляции Мэтьюза используется в машинном обучении как мера качества двоичных (двухклассных) классификаций. Он учитывает истинные и ложные положительные и отрицательные результаты и обычно рассматривается как сбалансированная мера, которую можно использовать, даже если классы очень разных размеров. MCC — это, по сути, значение коэффициента корреляции между -1 и +1. Коэффициент +1 представляет собой идеальное предсказание, 0 — среднее случайное предсказание и -1 — обратное предсказание. Статистика также известна как коэффициент фи ».

В бинарном (двухклассовом) случае $tp$, $tn$, $fp$ а также $fn$ являются соответственно количеством истинно положительных, истинно отрицательных, ложноположительных и ложноотрицательных результатов, MCC определяется как
$$MCC = frac<sqrt<(tp + fp)(tp + fn)(tn + fp)(tn + fn)>>.$$

В случае мультикласса коэффициент корреляции Мэтьюза может быть определен в терминах confusion_matrix C для Kклассы. Чтобы упростить определение, рассмотрим следующие промежуточные переменные:

  • $t_k=sum_^ C_$ количество занятий k действительно произошло,
  • $p_k=sum_^ C_$ количество занятий k был предсказан,
  • $c=sum_^ C_$ общее количество правильно спрогнозированных образцов,
  • $s=sum_^ sum_^ C_$ общее количество образцов.

Тогда мультиклассовый MCC определяется как:
$$MCC = frac< c times s — sum_^ p_k times t_k ><sqrt< (s^2 — sum_^ p_k^2) times (s^2 — sum_^ t_k^2) >>$$

Когда имеется более двух меток, значение MCC больше не будет находиться в диапазоне от -1 до +1. Вместо этого минимальное значение будет где-то между -1 и 0 в зависимости от количества и распределения наземных истинных меток. Максимальное значение всегда +1.

Вот небольшой пример, иллюстрирующий использование matthews_corrcoef функции:

3.3.2.14. Матрица путаницы с несколькими метками

Функция multilabel_confusion_matrix вычисляет класс-накрест ( по умолчанию) или samplewise (samplewise = True) MultiLabel матрицы спутанности для оценки точности классификации. Multilabel_confusion_matrix также обрабатывает данные мультикласса, как если бы они были многоклассовыми, поскольку это преобразование, обычно применяемое для оценки проблем мультикласса с метриками двоичной классификации (такими как точность, отзыв и т. д.).

При вычислении классовой матрицы путаницы с несколькими метками $C$, количество истинных негативов для класса i является $C_$, ложноотрицательные $C_$, истинные положительные стороны $C_$ а ложные срабатывания $C_$.

Или можно построить матрицу неточностей для каждой метки образца:

Вот пример, демонстрирующий использование multilabel_confusion_matrix функции с многоклассовым вводом:

Вот несколько примеров, демонстрирующих использование multilabel_confusion_matrix функции для расчета отзыва (или чувствительности), специфичности, количества выпадений и пропусков для каждого класса в задаче с вводом многозначной индикаторной матрицы.

Расчет отзыва (также называемого истинно положительным коэффициентом или чувствительностью) для каждого класса:

Расчет специфичности (также называемой истинно отрицательной ставкой) для каждого класса:

Расчет количества выпадений (также называемый частотой ложных срабатываний) для каждого класса:

Расчет процента промахов (также называемого ложноотрицательным показателем) для каждого класса:

3.3.2.15. Рабочая характеристика приемника (ROC)

«Рабочая характеристика приемника (ROC), или просто кривая ROC, представляет собой графический график, который иллюстрирует работу системы двоичного классификатора при изменении ее порога дискриминации. Он создается путем построения графика доли истинных положительных результатов из положительных (TPR = частота истинных положительных результатов) по сравнению с долей ложных положительных результатов из отрицательных (FPR = частота ложных положительных результатов) при различных настройках пороговых значений. TPR также известен как чувствительность, а FPR — это единица минус специфичность или истинно отрицательный показатель ».

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

На этом рисунке показан пример такой кривой ROC:

Функция roc_auc_score вычисляет площадь под операционной приемника характеристика (ROC) кривой, которая также обозначается через ППК или AUROC. При вычислении площади под кривой roc информация о кривой суммируется в одном номере. Для получения дополнительной информации см. Статью в Википедии о AUC.

По сравнению с такими показателями, как точность подмножества, потеря Хэмминга или оценка F1, ROC не требует оптимизации порога для каждой метки.

3.3.2.15.1. Двоичный регистр

В двоичном случае вы можете либо предоставить оценки вероятности, используя classifier.predict_proba() метод, либо значения решения без пороговых значений, заданные classifier.decision_function() методом. В случае предоставления оценок вероятности следует указать вероятность класса с «большей меткой». «Большая метка» соответствует classifier.classes_[1] и, следовательно classifier.predict_proba(X) [:, 1]. Следовательно, параметр y_score имеет размер (n_samples,).

Мы можем использовать оценки вероятностей, соответствующие clf.classes_[1] .

В противном случае мы можем использовать значения решения без порога.

3.3.2.15.2. Мультиклассовый кейс

Функция roc_auc_score также может быть использована в нескольких классах классификации . В настоящее время поддерживаются две стратегии усреднения: алгоритм «один против одного» вычисляет среднее попарных оценок AUC ROC, а алгоритм «один против остальных» вычисляет среднее значение оценок ROC AUC для каждого класса по сравнению со всеми другими классами. В обоих случаях предсказанные метки предоставляются в виде массива со значениями от 0 до n_classes , а оценки соответствуют оценкам вероятности того, что выборка принадлежит определенному классу. Алгоритмы OvO и OvR поддерживают равномерное взвешивание ( average=’macro’ ) и по распространенности ( average=’weighted’ ).

Алгоритм «один против одного» : вычисляет средний AUC всех возможных попарных комбинаций классов. [HT2001] определяет метрику AUC мультикласса, взвешенную равномерно:
$$frac<1>sum_^sum_ j>^c (text(j | k) + text(k | j))$$

где $c$ количество классов и $text(j | k)$ AUC с классом $j$ как положительный класс и класс $k$ как отрицательный класс. В общем, $text(j | k) neq text(k | j))$ в случае мультикласса. Этот алгоритм используется, установив аргумент ключевого слова , multiclass чтобы ‘ovo’ и average в ‘macro’ .

[HT2001] мультиклассируют AUC метрика может быть расширена , чтобы быть взвешены по распространенности:
$$frac<1>sum_^sum_ j>^c p(j cup k)( text(j | k) + text(k | j))$$

где cколичество классов. Этот алгоритм используется, установив аргумент ключевого слова , multiclass чтобы ‘ovo’ и average в ‘weighted’ . В ‘weighted’ опции возвращает распространенность усредненные , как описано в [FC2009] .

Алгоритм «один против остальных» : вычисляет AUC каждого класса относительно остальных [PD2000] . Алгоритм функционально такой же, как и в случае с несколькими этикетками. Чтобы включить этот алгоритм, установите для аргумента ключевого слова multiclass значение ‘ovr’ . Как и OvO, OvR поддерживает два типа усреднения: ‘macro’ [F2006] и ‘weighted’ [F2001] .

В приложениях , где высокий процент ложных срабатываний не терпимый параметр max_fpr из roc_auc_score может быть использовано , чтобы суммировать кривую ROC до заданного предела.

3.3.2.15.3. Кейс с несколькими метками

В классификации несколько меток, функция roc_auc_score распространяются путем усреднения меток , как выше . В этом случае вы должны указать y_score форму . Таким образом, при использовании оценок вероятности необходимо выбрать вероятность класса с большей меткой для каждого выхода. (n_samples, n_classes)

И значения решений не требуют такой обработки.

  • См. В разделе « Рабочие характеристики приемника» (ROC) пример использования ROC для оценки качества выходных данных классификатора.
  • См. В разделе « Рабочие характеристики приемника» (ROC) с перекрестной проверкой пример использования ROC для оценки качества выходных данных классификатора с помощью перекрестной проверки.
  • См. В разделе Моделирование распределения видов пример использования ROC для моделирования распределения видов.
  • HT2001 ( 1 , 2 ) Рука, DJ и Тилль, RJ, (2001). Простое обобщение области под кривой ROC для задач классификации нескольких классов. Машинное обучение, 45 (2), стр. 171-186.
  • FC2009 Ферри, Сезар и Эрнандес-Оралло, Хосе и Модройу, Р. (2009). Экспериментальное сравнение показателей эффективности для классификации. Письма о распознавании образов. 30. 27-38.
  • PD2000 Провост Ф., Домингос П. (2000). Хорошо обученные ПЭТ: Улучшение деревьев оценки вероятностей (Раздел 6.2), Рабочий документ CeDER № IS-00-04, Школа бизнеса Стерна, Нью-Йоркский университет.
  • F2006 Фосетт, Т., 2006. Введение в анализ ROC. Письма о распознавании образов, 27 (8), стр. 861-874.
  • F2001Фосетт, Т., 2001. Использование наборов правил для максимизации производительности ROC в интеллектуальном анализе данных, 2001. Труды Международной конференции IEEE, стр. 131-138.

3.3.2.16. Компромисс при обнаружении ошибок (DET)

Функция det_curve вычисляет кривую компенсации ошибок обнаружения (DET) [WikipediaDET2017] . Цитата из Википедии:

«График компромисса ошибок обнаружения (DET) — это графическая диаграмма частоты ошибок для систем двоичной классификации, отображающая частоту ложных отклонений по сравнению с частотой ложных приемов. Оси x и y масштабируются нелинейно по их стандартным нормальным отклонениям (или просто с помощью логарифмического преобразования), в результате получаются более линейные кривые компромисса, чем кривые ROC, и большая часть области изображения используется для выделения важных различий в критический рабочий регион ».

Кривые DET представляют собой вариацию кривых рабочих характеристик приемника (ROC), где ложная отрицательная скорость нанесена на ось y вместо истинной положительной скорости. Кривые DET обычно строятся в масштабе нормального отклонения путем преобразования $phi^<-1>$ (с участием $phi$ — кумулятивная функция распределения). Полученные кривые производительности явно визуализируют компромисс типов ошибок для заданных алгоритмов классификации. См. [Martin1997], где приведены примеры и мотивация.

На этом рисунке сравниваются кривые ROC и DET двух примеров классификаторов для одной и той же задачи классификации:

Характеристики:

  • Кривые DET образуют линейную кривую по шкале нормального отклонения, если оценки обнаружения нормально (или близки к нормальному) распределены. В [Navratil2007] было показано, что обратное не обязательно верно, и даже более общие распределения могут давать линейные кривые DET.
  • При обычном преобразовании масштаба с отклонением точки распределяются таким образом, что занимает сравнительно большее пространство графика. Следовательно, кривые с аналогичными характеристиками классификации легче различить на графике DET.
  • С ложноотрицательной скоростью, «обратной» истинной положительной скорости, точкой совершенства для кривых DET является начало координат (в отличие от верхнего левого угла для кривых ROC).

Приложения и ограничения:

Кривые DET интуитивно понятны для чтения и, следовательно, позволяют быстро визуально оценить работу классификатора. Кроме того, кривые DET можно использовать для анализа пороговых значений и выбора рабочей точки. Это особенно полезно, если требуется сравнение типов ошибок.

С другой стороны, кривые DET не представляют свою метрику в виде единого числа. Поэтому для автоматической оценки или сравнения с другими задачами классификации лучше подходят такие показатели, как производная площадь под кривой ROC.

  • См. Кривую компенсации ошибок обнаружения (DET) для примера сравнения кривых рабочих характеристик приемника (ROC) и кривых компенсации ошибок обнаружения (DET).
  • ВикипедияDET2017 Авторы Википедии. Компромисс ошибки обнаружения. Википедия, свободная энциклопедия. 4 сентября 2017 г., 23:33 UTC. Доступно по адресу: https://en.wikipedia.org/w/index.php?title=Detection_error_tradeoff&oldid=798982054 . По состоянию на 19 февраля 2018 г.
  • Мартин 1997 А. Мартин, Дж. Доддингтон, Т. Камм, М. Ордовски и М. Пшибоцки, Кривая DET в оценке эффективности задач обнаружения , NIST 1997.
  • Навратил2007 Дж. Наврактил и Д. Клусачек, « О линейных DET », 2007 г. Международная конференция IEEE по акустике, обработке речи и сигналов — ICASSP ’07, Гонолулу, Гавайи, 2007 г., стр. IV-229-IV-232.

3.3.2.17. Нулевой проигрыш

Функция zero_one_loss вычисляет сумму или среднее значение потери 0-1 классификации ($L_<0−1>$) над $n_$. По умолчанию функция нормализуется по выборке. Чтобы получить сумму $L_<0−1>$, установите normalize значение False .

В классификации по zero_one_loss нескольким меткам подмножество оценивается как единое целое, если его метки строго соответствуют прогнозам, и как ноль, если есть какие-либо ошибки. По умолчанию функция возвращает процент неправильно спрогнозированных подмножеств. Чтобы вместо этого получить количество таких подмножеств, установите normalize значение False

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда потеря 0-1 $L_<0−1>$ определяется как:
$$L_<0-1>(y_i, hat_i) = 1(hat_i not= y_i)$$

В случае с несколькими метками с двоичными индикаторами меток, где первый набор меток [0,1] содержит ошибку:

  • См. В разделе « Рекурсивное исключение функции с перекрестной проверкой» пример использования нулевой потери для выполнения рекурсивного исключения функции с перекрестной проверкой.

3.3.2.18. Потеря очков по Брайеру

Функция brier_score_loss вычисляет оценку Шиповник для бинарных классов [Brier1950] . Цитата из Википедии:

«Оценка Бриера — это правильная функция оценки, которая измеряет точность вероятностных прогнозов. Это применимо к задачам, в которых прогнозы должны назначать вероятности набору взаимоисключающих дискретных результатов ».

Эта функция возвращает среднеквадратичную ошибку фактического результата. y∈ <0,1>и прогнозируемая оценка вероятности $p=Pr⁡(y=1)$ ( pred_proba ) как выведено :
$$BS = frac<1>>> sum_^> — 1>(y_i — p_i)^2$$

Потеря по шкале Бриера также составляет от 0 до 1, и чем ниже значение (средняя квадратичная разница меньше), тем точнее прогноз.

Вот небольшой пример использования этой функции:

Балл Бриера можно использовать для оценки того, насколько хорошо откалиброван классификатор. Однако меньшая потеря по шкале Бриера не всегда означает лучшую калибровку. Это связано с тем, что по аналогии с разложением среднеквадратичной ошибки на дисперсию смещения потеря оценки по Бриеру может быть разложена как сумма потерь калибровки и потерь при уточнении [Bella2012]. Потеря калибровки определяется как среднеквадратическое отклонение от эмпирических вероятностей, полученных из наклона ROC-сегментов. Потери при переработке можно определить как ожидаемые оптимальные потери, измеренные по площади под кривой оптимальных затрат. Потери при уточнении могут изменяться независимо от потерь при калибровке, таким образом, более низкие потери по шкале Бриера не обязательно означают более качественную калибровку модели. «Только когда потеря точности остается неизменной, более низкая потеря по шкале Бриера всегда означает лучшую калибровку» [Bella2012] , [Flach2008] .

  • См. Раздел « Калибровка вероятности классификаторов», где приведен пример использования потерь по шкале Бриера для выполнения калибровки вероятности классификаторов.
  • Brier1950 Дж. Брайер, Проверка прогнозов, выраженных в терминах вероятности , Ежемесячный обзор погоды 78.1 (1950)
  • Bella2012 ( 1 , 2 ) Белла, Ферри, Эрнандес-Оралло и Рамирес-Кинтана «Калибровка моделей машинного обучения» в Хосров-Пур, М. «Машинное обучение: концепции, методологии, инструменты и приложения». Херши, Пенсильвания: Справочник по информационным наукам (2012).
  • Flach2008 Флак, Питер и Эдсон Мацубара. «О классификации, ранжировании и оценке вероятности». Дагштульский семинар. Schloss Dagstuhl-Leibniz-Zentrum от Informatik (2008).

3.3.3. Метрики ранжирования с несколькими ярлыками

В многоэлементном обучении с каждой выборкой может быть связано любое количество меток истинности. Цель состоит в том, чтобы дать высокие оценки и более высокий рейтинг наземным лейблам.

3.3.3.1. Ошибка покрытия

Функция coverage_error вычисляет среднее число меток , которые должны быть включены в окончательном предсказании таким образом, что все истинные метки предсказанные. Это полезно, если вы хотите знать, сколько меток с наивысшими баллами вам нужно предсказать в среднем, не пропуская ни одной истинной. Таким образом, наилучшее значение этого показателя — среднее количество истинных ярлыков.

Оценка нашей реализации на 1 больше, чем оценка, приведенная в Tsoumakas et al., 2010. Это расширяет ее для обработки вырожденного случая, когда экземпляр имеет 0 истинных меток.

Формально, учитывая двоичную индикаторную матрицу наземных меток истинности $y in left<0, 1right>^ times n_text>$ и оценка, связанная с каждой меткой $hat in mathbb^ times n_text>$ покрытие определяется как
$$coverage(y, hat) = frac<1>>> sum_^> — 1> max_ = 1> text_$$

с участием $text = left|left geq hat_ right>right|$. Учитывая определение ранга, связи y_scores разрываются путем присвоения максимального ранга, который был бы присвоен всем связанным значениям.

Вот небольшой пример использования этой функции:

3.3.3.2. Средняя точность ранжирования метки

В label_ranking_average_precision_score функции реализует маркировать ранжирование средней точности (LRAP). Этот показатель связан с average_precision_score функцией, но основан на понятии ранжирования меток, а не на точности и отзыве.

Средняя точность ранжирования меток (LRAP) усредняет по выборкам ответ на следующий вопрос: для каждой основной метки истинности какая доля меток с более высоким рейтингом была истинной? Этот показатель эффективности будет выше, если вы сможете лучше ранжировать метки, связанные с каждым образцом. Полученная оценка всегда строго больше 0, а наилучшее значение равно 1. Если имеется ровно одна релевантная метка для каждой выборки, средняя точность ранжирования меток эквивалентна среднему обратному рангу .

Формально, учитывая двоичную индикаторную матрицу наземных меток истинности $y in left<0, 1right>^ times n_text>$ и оценка, связанная с каждой меткой $hat in mathbb^ times n_text>$, средняя точность определяется как
$$LRAP(y, hat) = frac<1>>> sum_^> — 1> frac<1> <||y_i||0>sum = 1> frac<|mathcal|><text>$$

где $mathcal = left = 1, hat geq hat right>$, $text = left|left geq hat_ right>right|$, |cdot| вычисляет мощность набора (т. е. количество элементов в наборе), и $||cdot||_0$ это $ell_0$ «Norm» (который вычисляет количество ненулевых элементов в векторе).

Вот небольшой пример использования этой функции:

3.3.3.3. Потеря рейтинга

Функция label_ranking_loss вычисляет ранжирование потери , которые в среднем более образцы числа пар меток, которые неправильно упорядочены, т.е. истинные метки имеют более низкую оценку , чем ложные метки, взвешенную по обратной величине числа упорядоченных пар ложных и истинных меток. Наименьшая возможная потеря рейтинга равна нулю.

Формально, учитывая двоичную индикаторную матрицу наземных меток истинности $y in left<0, 1right>^ times n_text>$ и оценка, связанная с каждой меткой $hat in mathbb^ times n_text>$ потеря ранжирования определяется как
$$ranking_loss(y, hat) = frac<1>>> sum_^> — 1> frac<1> <||y_i||0(ntext— ||y_i||0)> left|left<(k, l): hat leq hat, y = 1, y_ = 0 right>right|$$

где $|cdot|$ вычисляет мощность набора (т. е. количество элементов в наборе) и $||cdot||_0$ это $ell_0$ «Norm» (который вычисляет количество ненулевых элементов в векторе).

Вот небольшой пример использования этой функции:

  • Цумакас, Г., Катакис, И., и Влахавас, И. (2010). Майнинг данных с несколькими метками. В справочнике по интеллектуальному анализу данных и открытию знаний (стр. 667-685). Springer США.

3.3.3.4. Нормализованная дисконтированная совокупная прибыль

Дисконтированный совокупный выигрыш (DCG) и Нормализованный дисконтированный совокупный выигрыш (NDCG) — это показатели ранжирования, реализованные в dcg_score и ndcg_score ; они сравнивают предсказанный порядок с оценками достоверности, такими как релевантность ответов на запрос.

Со страницы Википедии о дисконтированной совокупной прибыли:

«Дисконтированная совокупная прибыль (DCG) — это показатель качества ранжирования. При поиске информации он часто используется для измерения эффективности алгоритмов поисковой системы или связанных приложений. Используя шкалу градуированной релевантности документов в наборе результатов поисковой системы, DCG измеряет полезность или выгоду документа на основе его позиции в списке результатов. Прирост накапливается сверху вниз в списке результатов, причем прирост каждого результата дисконтируется на более низких уровнях »

DCG упорядочивает истинные цели (например, релевантность ответов на запросы) в предсказанном порядке, затем умножает их на логарифмическое убывание и суммирует результат. Сумма может быть усечена после первогоKрезультатов, и в этом случае мы называем это DCG @ K. NDCG или NDCG @ $K$ — это DCG, деленная на DCG, полученную с помощью точного прогноза, так что оно всегда находится между 0 и 1. Обычно NDCG предпочтительнее DCG.

По сравнению с потерей ранжирования, NDCG может принимать во внимание оценки релевантности, а не ранжирование на основе фактов. Таким образом, если основополагающая информация состоит только из упорядочивания, предпочтение следует отдавать потере ранжирования; если основополагающая информация состоит из фактических оценок полезности (например, 0 для нерелевантного, 1 для релевантного, 2 для очень актуального), можно использовать NDCG.

Для одного образца, учитывая вектор непрерывных значений истинности для каждой цели $y in R^M$, где $M$ это количество выходов, а прогноз $hat$, что индуцирует функцию ранжирования $f$, оценка DCG составляет
$$sum_^<min(K, M)>frac><log(1 + r)>$$

а оценка NDCG — это оценка DCG, деленная на оценку DCG, полученную для $y$.

  • Запись в Википедии о дисконтированной совокупной прибыли
  • Джарвелин, К., и Кекалайнен, Дж. (2002). Оценка IR методов на основе накопленного коэффициента усиления. Транзакции ACM в информационных системах (TOIS), 20 (4), 422-446.
  • Ван, Ю., Ван, Л., Ли, Ю., Хе, Д., Чен, В., и Лю, Т. Ю. (2013, май). Теоретический анализ показателей рейтинга NDCG. В материалах 26-й ежегодной конференции по теории обучения (COLT 2013)
  • МакШерри Ф. и Наджорк М. (2008, март). Эффективность вычислений при поиске информации измеряется эффективно при наличии связанных оценок. В Европейской конференции по поиску информации (стр. 414-421). Шпрингер, Берлин, Гейдельберг.

3.3.4. Метрики регрессии

В sklearn.metrics модуле реализованы несколько функций потерь, оценки и полезности для измерения эффективности регрессии. Некоторые из них были расширены , чтобы обработать случай multioutput: mean_squared_error , mean_absolute_error , explained_variance_score и r2_score .

У этих функций есть multioutput аргумент ключевого слова, который определяет способ усреднения результатов или проигрышей для каждой отдельной цели. По умолчанию используется значение ‘uniform_average’ , которое определяет равномерно взвешенное среднее значение по выходным данным. Если передается ndarray форма shape (n_outputs,) , то ее записи интерпретируются как веса, и возвращается соответствующее средневзвешенное значение. Если multioutput есть ‘raw_values’ указан, то все неизменные индивидуальные баллы или потери будут возвращены в массиве формы (n_outputs,) .

r2_score и explained_variance_score принять дополнительное значение ‘variance_weighted’ для multioutput параметра. Эта опция приводит к взвешиванию каждой индивидуальной оценки по дисперсии соответствующей целевой переменной. Этот параметр определяет количественно зафиксированную немасштабированную дисперсию на глобальном уровне. Если целевые переменные имеют разную шкалу, то этот балл придает большее значение хорошему объяснению переменных с более высокой дисперсией. multioutput=’variance_weighted’ — значение по умолчанию r2_score для обратной совместимости. В будущем это будет изменено на uniform_average .

3.3.4.1. Оценка объясненной дисперсии

Если $hat$ — расчетный целевой объем производства, y соответствующий (правильный) целевой результат, и $Var$- Дисперсия , квадрат стандартного отклонения, то объясненная дисперсия оценивается следующим образом:
$$explained_<>variance(y, hat) = 1 — frac>>>$$

Наилучшая возможная оценка — 1.0, более низкие значения — хуже.

Вот небольшой пример использования explained_variance_score функции:

3.3.4.2. Максимальная ошибка

Функция max_error вычисляет максимальную остаточную ошибку , показатель , который фиксирует худшую ошибку случае между предсказанным значением и истинным значением. В идеально подобранной модели регрессии с одним выходом он max_error будет находиться 0 в обучающем наборе, и хотя это маловероятно в реальном мире, этот показатель показывает степень ошибки, которую имела модель при подборе.

Если $hat_i$ прогнозируемое значение $i$-й образец, и $y_i$ — соответствующее истинное значение, тогда максимальная ошибка определяется как
$$text(y, hat) = max(| y_i — hat_i |)$$

Вот небольшой пример использования функции max_error :

max_error не поддерживает multioutput.

3.3.4.3. Средняя абсолютная ошибка

Функция mean_absolute_error вычисляет среднюю абсолютную погрешность , риск метрики , соответствующей ожидаемого значение абсолютной потери или ошибок $l1$-нормальная потеря.

Если $hat_i$ прогнозируемое значение $i$-й образец, и $y_i$ — соответствующее истинное значение, тогда средняя абсолютная ошибка (MAE), оцененная за $n_$ определяется как
$$text(y, hat) = frac<1>>> sum_^>-1> left| y_i — hat_i right|.$$

Вот небольшой пример использования функции mean_absolute_error :

3.3.4.4. Среднеквадратичная ошибка

Функция mean_squared_error вычисляет среднюю квадратическую ошибку , риск метрики , соответствующую ожидаемое значение квадрата (квадратичной) ошибки или потерю.

Если $hat_i$ прогнозируемое значение $i$-й образец, и $y_i$ — соответствующее истинное значение, тогда среднеквадратичная ошибка (MSE), оцененная на $n_$ определяется как
$$text(y, hat) = frac<1>> sum_^ — 1> (y_i — hat_i)^2.$$

Вот небольшой пример использования функции mean_squared_error :

  • См. В разделе Регрессия повышения градиента пример использования среднеквадратичной ошибки для оценки регрессии повышения градиента.

3.3.4.5. Среднеквадратичная логарифмическая ошибка

Функция mean_squared_log_error вычисляет риск метрики , соответствующий ожидаемому значению квадрата логарифмической (квадратичной) ошибки или потери.

Если $hat_i$ прогнозируемое значение $i$-й образец, и $y_i$ — соответствующее истинное значение, тогда среднеквадратичная логарифмическая ошибка (MSLE), оцененная на $n_$ определяется как
$$text(y, hat) = frac<1>> sum_^ — 1> (log_e (1 + y_i) — log_e (1 + hat_i) )^2.$$

Где $log_e (x)$ означает натуральный логарифм $x$. Эту метрику лучше всего использовать, когда цели имеют экспоненциальный рост, например, численность населения, средние продажи товара в течение нескольких лет и т. Д. Обратите внимание, что эта метрика штрафует за заниженную оценку больше, чем за завышенную оценку.

Вот небольшой пример использования функции mean_squared_log_error :

3.3.4.6. Средняя абсолютная ошибка в процентах

mean_absolute_percentage_error (MAPE), также известный как среднее абсолютное отклонение в процентах (МАПД), является метрикой для оценки проблем регрессии. Идея этой метрики — быть чувствительной к относительным ошибкам. Например, он не изменяется глобальным масштабированием целевой переменной.

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда средняя абсолютная процентная ошибка (MAPE), оцененная за $n_$ определяется как
$$text(y, hat) = frac<1>>> sum_^>-1> frac<<>left| y_i — hat_i right|>$$

где $epsilon$ — произвольное маленькое, но строго положительное число, чтобы избежать неопределенных результатов, когда y равно нулю.

Вот небольшой пример использования функции mean_absolute_percentage_error :

В приведенном выше примере, если бы мы использовали mean_absolute_error , он бы проигнорировал небольшие значения магнитуды и только отразил бы ошибку в предсказании максимального значения магнитуды. Но эта проблема решена в случае MAPE, потому что он вычисляет относительную процентную ошибку по отношению к фактическому выходу.

3.3.4.7. Средняя абсолютная ошибка

Это median_absolute_error особенно интересно, потому что оно устойчиво к выбросам. Убыток рассчитывается путем взятия медианы всех абсолютных различий между целью и прогнозом.

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда средняя абсолютная ошибка (MedAE), оцененная на $n_$ определяется как
$$text(y, hat) = text(mid y_1 — hat_1 mid, ldots, mid y_n — hat_n mid).$$

median_absolute_error Не поддерживает multioutput.

Вот небольшой пример использования функции median_absolute_error :

3.3.4.8. R² балл, коэффициент детерминации

Функция r2_score вычисляет коэффициент детерминации , как правило , обозначенный как R².

Он представляет собой долю дисперсии (y), которая была объяснена независимыми переменными в модели. Он обеспечивает показатель степени соответствия и, следовательно, меру того, насколько хорошо невидимые выборки могут быть предсказаны моделью через долю объясненной дисперсии.

Поскольку такая дисперсия зависит от набора данных, R² не может быть значимо сопоставимым для разных наборов данных. Наилучшая возможная оценка — 1,0, и она может быть отрицательной (потому что модель может быть произвольно хуже). Постоянная модель, которая всегда предсказывает ожидаемое значение y, игнорируя входные характеристики, получит оценку R² 0,0.

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ соответствующее истинное значение для общего n образцов, расчетный R² определяется как:
$$R^2(y, hat) = 1 — frac<sum_^ (y_i — hati)^2><sum^ (y_i — bar)^2>$$

где $bar = frac<1> sum_^ y_i$ и $sum_^ (y_i — hati)^2 = sum^ epsilon_i^2$.

Обратите внимание, что r2_score вычисляется нескорректированное R² без поправки на смещение выборочной дисперсии y.

Вот небольшой пример использования функции r2_score :

  • См. В разделе « Лассо и эластичная сеть для разреженных сигналов» приведен пример использования показателя R² для оценки лассо и эластичной сети для разреженных сигналов.

3.3.4.9. Средние отклонения Пуассона, Гаммы и Твиди

Функция mean_tweedie_deviance вычисляет среднюю ошибку Deviance Tweedie с power параметром ($p$). Это показатель, который выявляет прогнозируемые ожидаемые значения целей регрессии.

Существуют следующие особые случаи:

  • когда power=0 это эквивалентно mean_squared_error .
  • когда power=1 это эквивалентно mean_poisson_deviance .
  • когда power=2 это эквивалентно mean_gamma_deviance .

Если $hat_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда средняя ошибка отклонения Твиди (D) для мощности $p$, оценивается более $n_$ определяется как

Отклонение от твиди — однородная функция степени 2-power . Таким образом, гамма-распределение power=2 означает, что одновременно масштабируется y_true и y_pred не влияет на отклонение. Для распределения Пуассона power=1 отклонение масштабируется линейно, а для нормального распределения ( power=0 ) — квадратично. В общем, чем выше, power тем меньше веса придается крайним отклонениям между истинными и прогнозируемыми целевыми значениями.

Например, давайте сравним два прогноза 1.0 и 100, которые оба составляют 50% от их соответствующего истинного значения.

Среднеквадратичная ошибка ( power=0 ) очень чувствительна к разнице прогнозов второй точки:

Если увеличить power до 1:

разница в ошибках уменьшается. Наконец, установив power=2 :

мы получим идентичные ошибки. Таким образом, отклонение when power=2 чувствительно только к относительным ошибкам.

3.3.5. Метрики кластеризации

В модуле sklearn.metrics реализованы несколько функций потерь, оценки и полезности. Для получения дополнительной информации см. Раздел « Оценка производительности кластеризации » для кластеризации экземпляров и « Оценка бикластеризации» для бикластеризации.

3.3.6. Фиктивные оценки

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

  • stratified генерирует случайные прогнозы, соблюдая распределение классов обучающего набора.
  • most_frequent всегда предсказывает наиболее частую метку в обучающем наборе.
  • prior всегда предсказывает класс, который максимизирует предыдущий класс (как most_frequent ) и predict_proba возвращает предыдущий класс.
  • uniform генерирует предсказания равномерно в случайном порядке.
  • constant всегда предсказывает постоянную метку, предоставленную пользователем. Основная мотивация этого метода — оценка F1, когда положительный класс находится в меньшинстве.

Обратите внимание, что со всеми этими стратегиями predict метод полностью игнорирует входные данные!

Для иллюстрации DummyClassifier сначала создадим несбалансированный набор данных:

Далее сравним точность SVC и most_frequent :

Мы видим, что SVC это не намного лучше, чем фиктивный классификатор. Теперь давайте изменим ядро:

Мы видим, что точность увеличена почти до 100%. Для лучшей оценки точности рекомендуется стратегия перекрестной проверки, если она не требует слишком больших затрат на ЦП. Для получения дополнительной информации см. Раздел « Перекрестная проверка: оценка производительности оценщика ». Более того, если вы хотите оптимизировать пространство параметров, настоятельно рекомендуется использовать соответствующую методологию; подробности см. в разделе « Настройка гиперпараметров оценщика ».

В более общем плане, когда точность классификатора слишком близка к случайной, это, вероятно, означает, что что-то пошло не так: функции бесполезны, гиперпараметр настроен неправильно, классификатор страдает от дисбаланса классов и т. Д.

DummyRegressor также реализует четыре простых правила регрессии:

  • mean всегда предсказывает среднее значение тренировочных целей.
  • median всегда предсказывает медианное значение тренировочных целей.
  • quantile всегда предсказывает предоставленный пользователем квантиль учебных целей.
  • constant всегда предсказывает постоянное значение, предоставляемое пользователем.

Во всех этих стратегиях predict метод полностью игнорирует входные данные.

Источник

Mean Squared Error Representation

In this post, you will learn about the concepts of the mean-squared error (MSE) and R-squared, the difference between them, and which one to use when evaluating the linear regression models. You also learn Python examples to understand the concepts in a better manner

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

What is R-Squared?

R-Squared is the ratio of the sum of squares regression (SSR) and the sum of squares total (SST). Sum of Squares Regression (SSR) represents the total variation of all the predicted values found on the regression line or plane from the mean value of all the values of response variables. The sum of squares total (SST) represents the total variation of actual values from the mean value of all the values of response variables. R-squared value is used to measure the goodness of fit or best-fit line. The greater the value of R-Squared, the better is the regression model as most of the variation of actual values from the mean value get explained by the regression model. However, we need to take caution while relying on R-squared to assess the performance of the regression model. This is where the adjusted R-squared concept comes into the picture. This would be discussed in one of the later posts. R-Squared is also termed as the coefficient of determination. For the training dataset, the value of R-squared is bounded between 0 and 1, but it can become negative for the test dataset if the SSE is greater than SST. Greater the value of R-squared would also mean a smaller value of MSE. If the value of R-Squared becomes 1 (ideal world scenario), the model fits the data perfectly with a corresponding MSE = 0. As the value of R-squared increases and become close to 1, the value of MSE becomes close to 0.

Here is a visual representation to understand the concepts of R-Squared in a better manner.

Digrammatic representation for understanding R-Squared

Fig 4. Diagrammatic representation for understanding R-Squared
R-Squared as ration of SSR and SST

Pay attention to the diagram and note that the greater the value of SSR, the more is the variance covered by the regression / best fit line out of total variance (SST). R-Squared can also be represented using the following formula:

R-Squared = 1 – (SSE/SST)

Pay attention to the diagram and note that the smaller the value of SSE, the smaller is the value of (SSE/SST), and hence greater will be the value of R-Squared. Read further details on R-squared in this blog – R-squared/R2 in linear regression: Concepts, Examples

R-Squared can also be expressed as a function of mean squared error (MSE). The following equation represents the same. You may notice that as MSE increases, the value of R2 will decrease owing to the fact that the ratio of MSE and Var(y) will increase resulting in the decrease in the value of R2.

R-squared as function of MSE

Difference between Mean Square Error & R-Squared

The similarity between mean-squared error and R-Squared is that they both are a type of metrics that are used for evaluating the performance of the linear regression models.

The difference is that MSE gets pronounced based on whether the data is scaled or not. For example, if the response variable is housing price in the multiple of 10K, MSE will be different (lower) than when the response variable such as housing pricing is not scaled (actual values). This is where R-Squared comes to the rescue. R-Squared is also termed the standardized version of MSE. R-squared represents the fraction of variance of the actual value of the response variable captured by the regression model rather than the MSE which captures the residual error.

MSE or R-Squared – Which one to Use?

It is recommended to use R-Squared or rather adjusted R-Squared for evaluating the model performance of the regression models. This is primarily because R-Squared captures the fraction of variance of actual values captured by the regression model and tends to give a better picture of the quality of the regression model. Also, MSE values differ based on whether the values of the response variable are scaled or not. A better measure instead of MSE is the root mean squared error (RMSE) which takes care of the fact related to whether the values of the response variable are scaled or not.

One can alternatively use MSE or R-Squared based on what is appropriate and the need of the hour. However, the disadvantage of using MSE than R-squared is that it will be difficult to gauge the performance of the model using MSE as the value of MSE can vary from 0 to any larger number. However, in the case of R-squared, the value is bounded between 0 and 1. A value of R-squared closer to 1 would mean that the regression model covers most part of the variance of the values of the response variable and can be termed as a good model. However, with the MSE value, depending on the scale of values of the response variable, the value will be different and hence, it would be difficult to assess for certain whether the regression model is good or otherwise.

MSE or R-Squared Python Code Example

Here is the python code representing how to calculate mean squared error or R-Squared value while working with regression models. Pay attention to some of the following in the code given below:

  • Sklearn.metrics mean_squared_error and r2_score is used for measuring the MSE and R-Squared values. Input to this methods are actual values and predicted values.
  • Sklearn Boston housing dataset is used for training a multiple linear regression model using Sklearn.linear_model LinearRegression
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error, r2_score
from sklearn import datasets
#
# Load the Sklearn Boston Dataset
#
boston_ds = datasets.load_boston()
X = boston_ds.data
y = boston_ds.target
#
# Create a training and test split
#
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#
# Fit a pipeline using Training dataset and related labels
#
pipeline = make_pipeline(StandardScaler(), LinearRegression())
pipeline.fit(X_train, y_train)
#
# Calculate the predicted value for training and test dataset
#
y_train_pred = pipeline.predict(X_train)
y_test_pred = pipeline.predict(X_test)
#
# Mean Squared Error
#
print('MSE train: %.3f, test: %.3f' % (mean_squared_error(y_train, y_train_pred),
                mean_squared_error(y_test, y_test_pred)))
#
# R-Squared
#
print('R^2 train: %.3f, test: %.3f' % (r2_score(y_train, y_train_pred),
                r2_score(y_test, y_test_pred)))

Conclusions

Here is the summary of what you learned in this post regarding mean square error (MSE) and R-Squared and which one to use?

  • MSE represents the residual error which is nothing but sum of squared difference between actual values and the predicted / estimated values divided by total number of records.
  • R-Squared represents the fraction of variance captured by the regression model.
  • The disadvantage of using MSE is that the value of MSE varies based on whether the values of response variable is scaled or not. If scaled, MSE will be lower than the unscaled values.
  • Author
  • Recent Posts

Ajitesh Kumar

I have been recently working in the area of Data analytics including Data Science and Machine Learning / Deep Learning. I am also passionate about different technologies including programming languages such as Java/JEE, Javascript, Python, R, Julia, etc, and technologies such as Blockchain, mobile computing, cloud-native technologies, application security, cloud computing platforms, big data, etc. For latest updates and blogs, follow us on Twitter. I would love to connect with you on Linkedin.

Check out my latest book titled as First Principles Thinking: Building winning products using first principles thinking

Ajitesh Kumar

Ajitesh Kumar

I have been recently working in the area of Data analytics including Data Science and Machine Learning / Deep Learning. I am also passionate about different technologies including programming languages such as Java/JEE, Javascript, Python, R, Julia, etc, and technologies such as Blockchain, mobile computing, cloud-native technologies, application security, cloud computing platforms, big data, etc. For latest updates and blogs, follow us on Twitter. I would love to connect with you on Linkedin.

Check out my latest book titled as First Principles Thinking: Building winning products using first principles thinking

Все курсы > Оптимизация > Занятие 4 (часть 2)

Во второй части занятия перейдем к практике.

Продолжим работать в том же ноутбуке⧉

Сквозной пример

Данные и постановка задачи

Обратимся к хорошо знакомому нам датасету недвижимости в Бостоне.

boston = pd.read_csv(‘/content/boston.csv’)

При этом нам нужно будет решить две основные задачи:

Задача 1. Научиться оценивать качество модели не только с точки зрения метрики, но и исходя из рассмотренных ранее допущений модели. Эту задачу мы решим в три этапа.

  • Этап 1. Построим базовую (baseline) модель линейной регрессии с помощью класса LinearRegression библиотеки sklearn и оценим, насколько выполняются рассмотренные выше допущения.
  • Этап 2. Попробуем изменить данные таким образом, чтобы модель в большей степени соответствовала этим критериям.
  • Этап 3. Обучим еще одну модель и посмотрим, как изменится результат.

Задача 2. С нуля построить модель множественной линейной регрессии и сравнить прогноз с результатом, полученным при решении первой задачи. При этом обучение модели мы реализуем двумя способами, а именно, через:

  • Метод наименьших квадратов
  • Метод градиентного спуска

Разделение выборки

Мы уже не раз говорили про важность разделения выборки на обучаущую и тестовую части. Сегодня же, с учетом того, что нам предстоит изучить много нового материала, мы опустим этот этап и будем обучать и тестировать модель на одних и тех же данных.

Исследовательский анализ данных

Теперь давайте более внимательно посмотрим на имеющиеся у нас данные. Как вы вероятно заметили, все признаки в этом датасете количественные, за исключением переменной CHAS.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<class ‘pandas.core.frame.DataFrame’>

RangeIndex: 506 entries, 0 to 505

Data columns (total 14 columns):

#   Column   Non-Null Count  Dtype  

—  ——   —————  ——  

0   CRIM     506 non-null    float64

1   ZN       506 non-null    float64

2   INDUS    506 non-null    float64

3   CHAS     506 non-null    float64

4   NOX      506 non-null    float64

5   RM       506 non-null    float64

6   AGE      506 non-null    float64

7   DIS      506 non-null    float64

8   RAD      506 non-null    float64

9   TAX      506 non-null    float64

10  PTRATIO  506 non-null    float64

11  B        506 non-null    float64

12  LSTAT    506 non-null    float64

13  MEDV     506 non-null    float64

dtypes: float64(14)

memory usage: 55.5 KB

# мы видим, что переменная CHAS категориальная

boston.CHAS.value_counts()

0.0    471

1.0     35

Name: CHAS, dtype: int64

Посмотрим на распределение признаков с помощью boxplots.

plt.figure(figsize = (10, 8))

sns.boxplot(data = boston.drop(columns = [‘CHAS’, ‘MEDV’]))

plt.show()

boxplots количественных признаков

Посмотрим на распределение целевой переменной.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

def box_density(x):

  # создадим два подграфика

  f, (ax_box, ax_kde) = plt.subplots(nrows = 2, # из двух строк

                                      ncols = 1, # и одного столбца

                                      sharex = True, # оставим только нижние подписи к оси x

                                      gridspec_kw = {‘height_ratios’: (.15, .85)}, # зададим разную высоту строк

                                      figsize = (10,8)) # зададим размер графика

  # в первом подграфике построим boxplot

  sns.boxplot(x = x, ax = ax_box)

  ax_box.set(xlabel = None)

  # во втором — график плотности распределения

  sns.kdeplot(x, fill = True)

  # зададим заголовок и подписи к осям

  ax_box.set_title(‘Распределение переменной’, fontsize = 17)

  ax_kde.set_xlabel(‘Переменная’, fontsize = 15)

  ax_kde.set_ylabel(‘Плотность распределения’, fontsize = 15)

  plt.show()

box_density(boston.iloc[:, 1])

распределение целевой переменной

Посмотрим на корреляцию количественных признаков с целевой переменной.

boston.drop(columns = ‘CHAS’).corr().MEDV.to_frame().style.background_gradient()

корреляция количественных признаков с целевой переменной

Используем точечно-бисериальную корреляцию для оценки взамосвязи переменной CHAS и целевой переменной.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

def pbc(continuous, binary):

  # преобразуем количественную переменную в массив Numpy

  continuous_values = np.array(continuous)

  # классы качественной переменной превратим в нули и единицы

  binary_values = np.unique(binary, return_inverse = True)[1]

  # создадим две подгруппы количественных наблюдений

  # в зависимости от класса дихотомической переменной

  group0 = continuous_values[np.argwhere(binary_values == 0).flatten()]

  group1 = continuous_values[np.argwhere(binary_values == 1).flatten()]

  # найдем средние групп,

  mean0, mean1 = np.mean(group0), np.mean(group1)

  # а также длины групп и всего датасета

  n0, n1, n = len(group0), len(group1), len(continuous_values)

  # рассчитаем СКО количественной переменной

  std = continuous_values.std()

  # подставим значения в формулу

  return (mean1 mean0) / std * np.sqrt( (n1 * n0) / (n * (n1)) )

pbc(boston.MEDV, boston.CHAS)

Обработка данных

Пропущенные значения

Посмотрим, есть ли пропущенные значения.

CRIM       0

ZN         0

INDUS      0

CHAS       0

NOX        0

RM         0

AGE        0

DIS        0

RAD        0

TAX        0

PTRATIO    0

B          0

LSTAT      0

MEDV       0

dtype: int64

Выбросы

Удалим выбросы.

from sklearn.ensemble import IsolationForest

clf = IsolationForest(max_samples = 100, random_state = 42)

clf.fit(boston)

boston[‘anomaly’] = clf.predict(boston)

boston = boston[boston.anomaly == 1]

boston = boston.drop(columns = ‘anomaly’)

boston.shape

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

Масштабирование признаков

Приведем признаки к одному масштабу (целевую переменную трогать не будем).

boston.iloc[:, :1] = (boston.iloc[:, :1] boston.iloc[:, :1].mean()) / boston.iloc[:, :1].std()

Замечу, что метод наименьших квадратов не требует масштабирования признаков, градиентному спуску же напротив необходимо, чтобы все значения находились в одном диапазоне (подробнее в дополнительных материалах).

Кодирование категориальных переменных

После стандартизации переменная CHAS также сохранила только два значения.

boston.CHAS.value_counts()

-0.182581    389

5.463391     13

Name: CHAS, dtype: int64

Ее можно не трогать.

Построение модели

Создадим первую пробную (baseline) модель с помощью библиотеки sklearn.

baseline-модель

X = boston.drop(‘MEDV’, axis = 1)

y = boston[‘MEDV’]

from sklearn.linear_model import LinearRegression

model = LinearRegression()

y_pred = model.fit(X, y).predict(X)

Оценка качества

Диагностика модели, метрики качества и функции потерь

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

Функция потерь и метрика качества могут совпадать, а могут и не совпадать. Важно понимать, что у них разное назначение.

  • Функция потерь — это часть алгоритма, нам важно, чтобы эта функция была дифференцируема (у нее была производная)
  • Производная метрики качества нас не интересует. Метрика качества должна быть адекватна решаемой задаче.

MSE, RMSE, MAE, MAPE

MSE и RMSE

Для оценки качества RMSE предпочтительнее, чем MSE, потому что показывает насколько ошибается модель в тех же единицах измерения, что и целевая переменная. Например, если диапазон целевой переменной от 80 до 100, а RMSE 20, то в среднем модель ошибается на 20-25 процентов.

В качестве практики напишем собственную функцию.

# параметр squared = True возвращает MSE

# параметр squared = False возвращает RMSE

def mse(y, y_pred, squared = True):

  mse = ((y y_pred) ** 2).sum() / len(y)

  if squared == True:

    return mse

  else:

    return np.sqrt(mse)

mse(y, y_pred), mse(y, y_pred, squared = False)

(9.980044349414223, 3.1591208190593507)

Сравним с sklearn.

from sklearn.metrics import mean_squared_error

# squared = False дает RMSE

mean_squared_error(y, y_pred, squared = False)

MAE

Приведем формулу.

$$ MAE = frac{sum |y-hat{y}|}{n} $$

Средняя абсолютная ошибка представляет собой среднее арифметическое абсолютной ошибки $varepsilon = |y-hat{y}| $ и использует те же единицы измерения, что и целевая переменная.

def mae(y, y_pred):

  return np.abs(y y_pred).sum() / len(y)

from sklearn.metrics import mean_absolute_error

mean_absolute_error(y, y_pred)

MAE часто используется при оценке качества моделей временных рядов.

MAPE

Средняя абсолютная ошибка в процентах (mean absolute percentage error) по сути выражает MAE в процентах, а не в абсолютных величинах, представляя отклонение как долю от истинных ответов.

$$ MAPE = frac{1}{n} sum vert frac{y-hat{y}}{y} vert $$

Это позволяет сравнивать модели с разными единицами измерения между собой.

def mape(y, y_pred):

  return 1/len(y) * np.abs((y y_pred) / y).sum()

from sklearn.metrics import mean_absolute_percentage_error

mean_absolute_percentage_error(y, y_pred)

Коэффициент детерминации

В рамках вводного курса в ответах на вопросы к занятию по регрессии мы подробно рассмотрели коэффициент детерминации ($R^2$), его связь с RMSE, а также зачем нужен скорректированный $R^2$. Как мы знаем, если использовать, например, класс LinearRegression, то эта метрика содержится в методе .score().

Также можно использовать функцию r2_score() модуля metrics.

from sklearn.metrics import r2_score

r2_score(y, y_pred)

Для скорректированного $R^2$ напишем собственную функцию.

def r_squared(x, y, y_pred):

  r2 = 1 ((y y_pred)** 2).sum()/((y y.mean()) ** 2).sum()

  n, k = x.shape

  r2_adj = 1 ((y y_pred)** 2).sum()/((y y.mean()) ** 2).sum()

  return r2, r2_adj

(0.7965234359550825, 0.7965234359550825)

Диагностика модели

Теперь проведем диагностику модели в соответствии со сделанными ранее допущениями.

Анализ остатков и прогнозных значений

Напишем диагностическую функцию, которая сразу выведет несколько интересующих нас графиков и метрик, касающихся остатков и прогнозных значений.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

from scipy.stats import probplot

from statsmodels.graphics.tsaplots import plot_acf

from statsmodels.stats.stattools import durbin_watson

def diagnostics(y, y_pred):

  residuals = y y_pred

  residuals_mean = np.round(np.mean(y y_pred), 3)

  f, ((ax_rkde, ax_prob), (ax_ry, ax_auto), (ax_yy, ax_ykde)) = plt.subplots(nrows = 3,

                                                                             ncols = 2,

                                                                             figsize = (12, 18))

  # в первом подграфике построим график плотности остатков

  sns.kdeplot(residuals, fill = True, ax = ax_rkde)

  ax_rkde.set_title(‘Residuals distribution’, fontsize = 14)

  ax_rkde.set(xlabel = f‘Residuals, mean: {residuals_mean}’)

  ax_rkde.set(ylabel = ‘Density’)

  # во втором — график нормальной вероятности остатков

  probplot(residuals, dist = ‘norm’, plot = ax_prob)

  ax_prob.set_title(‘Residuals probability plot’, fontsize = 14)

  # в третьем — график остатков относительно прогноза

  ax_ry.scatter(y_pred, residuals)

  ax_ry.set_title(‘Predicted vs. Residuals’, fontsize = 14)

  ax_ry.set(xlabel = ‘y_pred’)

  ax_ry.set(ylabel = ‘Residuals’)

  # в четвертом — автокорреляцию остатков

  plot_acf(residuals, lags = 30, ax = ax_auto)

  ax_auto.set_title(‘Residuals Autocorrelation’, fontsize = 14)

  ax_auto.set(xlabel = f‘Lags ndurbin_watson: {durbin_watson(residuals).round(2)}’)

  ax_auto.set(ylabel = ‘Autocorrelation’)

  # в пятом — сравним прогнозные и фактические значения

  ax_yy.scatter(y, y_pred)

  ax_yy.plot([y.min(), y.max()], [y.min(), y.max()], «k—«, lw = 1)

  ax_yy.set_title(‘Actual vs. Predicted’, fontsize = 14)

  ax_yy.set(xlabel = ‘y_true’)

  ax_yy.set(ylabel = ‘y_pred’)

  # в шестом — сравним распределение истинной и прогнозной целевой переменных

  sns.kdeplot(y, fill = True, ax = ax_ykde, label = ‘y_true’)

  sns.kdeplot(y_pred, fill = True, ax = ax_ykde, label = ‘y_pred’)

  ax_ykde.set_title(‘Actual vs. Predicted Distribution’, fontsize = 14)

  ax_ykde.set(xlabel = ‘y_true and y_pred’)

  ax_ykde.set(ylabel = ‘Density’)

  ax_ykde.legend(loc = ‘upper right’, prop = {‘size’: 12})

  plt.tight_layout()

  plt.show()

диагностика модели

Разберем полученную информацию.

  • В целом остатки модели распределены нормально с нулевым средним значением
  • Явной гетероскедастичности нет, хотя мы видим, что дисперсия не всегда равномерна
  • Присутствует умеренная отрицательная корреляция
  • График y_true vs. y_pred показывает насколько сильно прогнозные значения отклоняются от фактических. В идеальной модели (без шума, т.е. без случайных колебаний) точки должны были би стремиться находиться на диагонали, в более реалистичной модели нам бы хотелось видеть, что точки плотно сосредоточены вокруг диагонали.
  • Распределение прогнозных значений в целом повторяет распределение фактических.

Мультиколлинеарность

Отдельно проведем анализ на мультиколлинеарность. Напишем соответствующую функцию.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

def vif(df, features):    

    vif, tolerance = {}, {}

    # пройдемся по интересующим нас признакам

    for feature in features:

        # составим список остальных признаков, которые будем использовать

        # для построения регрессии

        X = [f for f in features if f != feature]

        # поместим текущие признаки и таргет в X и y      

        X, y = df[X], df[feature]

        # найдем коэффициент детерминации

        r2 = LinearRegression().fit(X, y).score(X, y)                

        # посчитаем tolerance

        tolerance[feature] = 1 r2

        # найдем VIF

        vif[feature] = 1 / (tolerance[feature])

    # выведем результат в виде датафрейма

    return pd.DataFrame({‘VIF’: vif, ‘Tolerance’: tolerance})

vif(df = X.drop(‘CHAS’, axis = 1), features = X.drop(‘CHAS’, axis = 1).columns)

оценка мультиколлинеарности

Дополнительная обработка данных

Попробуем дополнительно улучшить некоторые из диагностических показателей.

VIF

Уберем признак с наибольшим VIF (RAD) и посмотрим, что получится.

vif(df = X, features = [‘CRIM’,

                        ‘ZN’,

                        ‘INDUS’,

                        ‘CHAS’,

                        ‘NOX’,

                        ‘RM’,

                        ‘AGE’,

                        ‘DIS’,

                        ‘TAX’,

                        ‘PTRATIO’,

                        ‘B’,

                        ‘LSTAT’])

удаление признаков с высоким VIF

Показатели пришли в норму. Окончательно удалим RAD.

boston.drop(columns = ‘RAD’, inplace = True)

Преобразование данных

Применим преобразование Йео-Джонсона.

from sklearn.preprocessing import PowerTransformer

pt = PowerTransformer()

boston = pd.DataFrame(pt.fit_transform(boston),

                      columns = boston.columns)

Отбор признаков

Посмотрим на линейную корреляцию Пирсона количественных признаков и целевой переменной.

boston_t.drop(columns = ‘CHAS’).corr().MEDV.to_frame().style.background_gradient()

корреляция признаков и целевой переменной Пирсона после обработки данных

Также рассчитаем точечно-бисериальную корреляцию.

pbc(boston_t.MEDV, boston_t.CHAS)

Удалим признаки с наименьшей корреляцией, а именно ZN, CHAS, DIS и B.

boston.drop(columns = [‘ZN’, ‘CHAS’, ‘DIS’, ‘B’], inplace = True)

Повторное моделирование и диагностика

Повторное моделирование

Выполним повторное моделирование.

X = boston_t.drop(columns = [‘ZN’, ‘CHAS’, ‘DIS’, ‘B’, ‘MEDV’])

y = boston_t.MEDV

from sklearn.linear_model import LinearRegression

model = LinearRegression()

y_pred = model.fit(X, y).predict(X)

Оценка качества и диагностика

Оценим качество. Так как мы преобразовали целевую переменную, показатель RMSE не будет репрезентативен. Воспользуемся MAPE и $R^2$.

(0.7546883769637166, 0.7546883769637166)

Отклонение прогнозного значения от истинного снизилось. $R^2$ немного уменьшился, чтобы бывает, когда мы пытаемся привести модель к соответствию допущениям. Проведем диагностику.

диагностика модели после обработки данных

Распределение остатков немного улучшилось, при этом незначительно усилилась их отрицательная автокорреляция. Распределение целевой переменной стало менее островершинным.

Данные можно было бы продолжить анализировать и улучшать, однако в рамках текущего занятия перейдем к механике обучения модели.

Коэффициенты

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

model.intercept_, model.coef_

(9.574055157844797e-16,

array([-0.09989392,  0.03965441,  0.1069877 ,  0.23172172, -0.05561128,

        -0.16878987, -0.18057055, -0.49319274]))

Обучение модели

Теперь когда мы поближе познакомились с понятием регрессии, разобрали функции потерь и изучили допущения, при которых модель может быть удачной аппроксимацией данных, пора перейти к непосредственному созданию алгоритмов.

Векторизация уравнения

Для удобства векторизуем приведенное выше уравнение множественной линейной регрессии

$$ y = begin{bmatrix} y_1 \ y_2 \ vdots \ y_n end{bmatrix} X = begin{bmatrix} x_0 & x_1 & ldots & x_j \ x_0 & x_1 & ldots & x_j \ vdots & vdots & vdots & vdots \ x_{0} & x_{1} & ldots & x_{n,j} end{bmatrix}, theta = begin{bmatrix} theta_0 \ theta_1 \ vdots \ theta_n end{bmatrix}, varepsilon = begin{bmatrix} varepsilon_1 \ varepsilon_2 \ vdots \ varepsilon_n end{bmatrix} $$

где n — количество наблюдений, а j — количество признаков.

Обратите внимание, что мы создали еще один столбец данных $ x_0 $, который будем умножать на сдвиг $ theta_0 $. Его мы заполним единицами.

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

$$ y = Xtheta + varepsilon $$

Кроме того, как мы увидим ниже, так нам не придется искать отдельную производную для коэффициента $ theta_0 $.

Схематично для модели с четырьмя наблюдениями (n = 4) и двумя признаками (j = 2) получаются вот такие матрицы.

умножение матрицы на вектор в модели линейной регрессии

Функция потерь

Как мы уже говорили, чтобы подобрать оптимальные коэффициенты $theta$, нам нужен критерий или функция потерь. Логично измерять отклонение прогнозного значения от истинного.

$$ varepsilon = Xtheta-y $$

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

Абсолютная ошибка, L1 loss

При усреднении на количество наблюдений мы получаем среднюю абсолютную ошибку (mean absolute error, MAE).

$$ MAE = frac{sum{|y-Xtheta|}}{n} = frac{sum{|varepsilon|}}{n} $$

Приведем пример такой функции на Питоне.

def L1(y_true, y_pred):

  return np.sum(np.abs(y_true y_pred)) / y_true.size

Помимо модуля ошибку можно возводить в квадрат.

Квадрат ошибки, L2 loss

В этом случай говорят про сумму квадратов ошибок (sum of squared errors, SSE) или сумму квадратов остатков (sum of squared residuals, SSR или residual sum of squares, RSS).

$$ SSE = sum (y-Xtheta)^2 $$

Как мы уже знаем, на практике вместо SSE часто используется MSE, или вернее half MSE для удобства нахождения производной.

$$ MSE = frac{1}{2n} sum (y-theta X)^2 $$

Ниже код на Питоне.

def L2(y_true, y_pred):

  return np.sum((y_true y_pred) ** 2) / y_true.size

На практике у обеих функций есть сильные и слабые стороны. Рассмотрим L1 loss (MAE) и L2 loss (MSE) на графике.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# для построения графиков мы используем x вместо y_true, y_pred

# в качестве входящего значения

def mse(x):

  return x ** 2

def mae(x):

  return np.abs(x)

plt.figure(figsize = (10, 8))

x_vals = np.arange(3, 3, 0.01)

plt.plot(x_vals, mae(x_vals), label = ‘MAE’)

plt.plot(x_vals, mse(x_vals), label = ‘MSE’)

plt.legend(loc = ‘upper center’, prop = {‘size’: 14})

plt.grid()

plt.show()

сравнение MSE и MAE

Очевидно, при отклонении от точки минимума из-за возведения в квадрат L2 значительно быстрее увеличивает ошибку, поэтому если в данных есть выбросы при суммированнии они очень сильно влияют на этот показатель, хотя де-факто большая часть значений такого уровня потерь не дали бы.

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

Функция Хьюбера

Рассмотрим функцию Хьюбера (Huber loss), которая объединяет сильные стороны вышеупомянутых функций и при этом лишена их недостатков. Посмотрим на формулу.

$$ L_{delta}= left{begin{matrix} frac{1}{2}(y-hat{y})^{2} & if | y-hat{y} | < delta\ delta (|y-hat{y}|-frac1 2 delta) & otherwise end{matrix}right. $$

Представим ее на графике.

plt.figure(figsize = (10, 8))

def huber(x, delta = 1.):

  huber_mse = 0.5 * np.square(x)

  huber_mae = delta * (np.abs(x) 0.5 * delta)

  return np.where(np.abs(x) <= delta, huber_mse, huber_mae)

x_vals = np.arange(3, 3, 0.01)

plt.plot(x_vals, mae(x_vals), label = ‘MAE’)

plt.plot(x_vals, mse(x_vals), label = ‘MSE’)

plt.plot(x_vals, huber(x_vals, delta = 2), label = ‘Huber’)

plt.legend(loc = ‘upper center’, prop = {‘size’: 14})

plt.grid()

plt.show()

функция Хьюбера

Также приведем код этой функции.

def huber(y_pred, y_true, delta = 1.0):

  # пропишем обе части функции потерь

  huber_mse = 0.5 * (y_true y_pred) ** 2

  huber_mae = delta * (np.abs(y_true y_pred) 0.5 * delta)

  # выберем одну из них в зависимости от дельта

  return np.where(np.abs(y_true y_pred) <= delta, huber_mse, huber_mae)

На сегодняшнем занятии мы, как и раньше, в качестве функции потерь используем MSE.

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

Нормальные уравнения

Для множественной линейной регрессии коэффициенты находятся по следующей формуле

$$ theta = (X^TX)^{-1}X^Ty $$

Разберем эту формулу подробнее. Сумму квадратов остатков (SSE) можно переписать как произведение вектора $ hat{varepsilon} $ на самого себя, то есть $ SSE = varepsilon^{T} varepsilon$. Помня, что $varepsilon = y-Xtheta $ получаем (не забывая транспонировать)

$$ (y-Xtheta)^T(y-Xtheta) $$

Раскрываем скобки

$$ y^Ty-y^T(Xtheta)-(Xtheta)^Ty+(Xtheta)^T(Xtheta) $$

Заметим, что $A^TB = B^TA$, тогда

$$ y^Ty-(Xtheta)^Ty-(Xtheta)^Ty+(Xtheta)^T(Xtheta)$$

$$ y^Ty-2(Xtheta)^Ty+(Xtheta)^T(Xtheta) $$

Вспомним, что $(AB)^T = A^TB^T$, тогда

$$ y^Ty-2theta^TX^Ty+theta^TX^TXtheta $$

Теперь нужно найти частные производные этих функций

$$ nabla_{theta} J(theta) = y^Ty-2theta^TX^Ty+theta^TX^TXtheta $$

После дифференцирования мы получаем следующую производную

$$ -2X^Ty+2X^TXtheta $$

Как мы помним, оптимум функции находится там, где производная равна нулю.

$$ -2X^Ty+2X^TXtheta = 0 $$

$$ -X^Ty+X^TXtheta = 0 $$

$$ X^TXtheta = X^Ty $$

Выражение выше называется нормальным уравнением (normal equation). Решив его для $theta$ мы найдем аналитическое решение минимизации суммы квадратов отклонений.

$$ theta = (X^TX)^{-1}X^Ty $$

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

Код на Питоне

Перейдем к созданию класса линейной регрессии наподобие LinearRegression библиотеки sklearn. Вначале напишем функцию гипотезы (т.е. функцию самой модели), снабдив ее еще одной функцией, которая добавляет столбец из единиц к признакам.

$$ h_{theta}(x) = theta X $$

def add_ones(x):

  # важно! метод .insert() изменяет исходный датафрейм

  return x.insert(0,‘x0’, np.ones(x.shape[0]))

def h(x, theta):

  x = x.copy()

  add_ones(x)

  return np.dot(x, theta)

Перейдем к функции, отвечающей за обучение модели.

$$ theta = (X^TX)^{-1}X^Ty $$

# строчную `x` используем внутри функций и методов класса

# заглавную `X` вне функций и методов

def fit(x, y):

  x = x.copy()

  add_ones(x)

  xT = x.transpose()

  inversed = np.linalg.inv(np.dot(xT, x))

  thetas = inversed.dot(xT).dot(y)

  return thetas

Обучим модель и выведем коэффициенты.

thetas = fit(X, y)

thetas[0], thetas[1:]

(9.3718435789647e-16,

array([-0.09989392,  0.03965441,  0.1069877 ,  0.23172172, -0.05561128,

        -0.16878987, -0.18057055, -0.49319274]))

Примечание. Замечу, что не все матрицы обратимы. В этом случае можно найти псевдообратную матрицу (pseudoinverse). Для этого в Numpy есть функция np.linalg.pinv().

Сделаем прогноз.

y_pred = h(X, thetas)

y_pred[:5]

array([1.24414666, 0.55999778, 1.48103299, 1.49481605, 1.21342788])

Создание класса

Объединим код в класс.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class ols():

  def __init__(self):

    self.thetas = None

  def add_ones(self, x):

    return x.insert(0,‘x0’, np.ones(x.shape[0]))

  def fit(self, x, y):

    x = x.copy()

    self.add_ones(x)

    xT = x.T

    inversed = np.linalg.inv(np.dot(xT, x))

    self.thetas = inversed.dot(xT).dot(y)

  def predict(self, x):

    x = x.copy()

    self.add_ones(x)

    return np.dot(x, self.thetas)

Создадим объект класса и обучим модель.

model = ols()

model.fit(X, y)

Выведем коэффициенты.

model.thetas[0], model.thetas[1:]

(9.3718435789647e-16,

array([-0.09989392,  0.03965441,  0.1069877 ,  0.23172172, -0.05561128,

        -0.16878987, -0.18057055, -0.49319274]))

Сделаем прогноз.

y_pred = model.predict(X)

y_pred[:5]

array([1.24414666, 0.55999778, 1.48103299, 1.49481605, 1.21342788])

Оценка качества

Оценим качество через MAPE и $R^2$.

(0.7546883769637167, 0.7546883769637167)

Мы видим, что результаты аналогичны.

Метод градиентного спуска

В целом с этим методом мы уже хорошо знакомы. В качестве упражнения давайте реализуем этот алгоритм на Питоне для многомерных данных.

Нахождение градиента

Покажем расчет градиента на схеме.

нахождение градиента в модели линейной регрессии

В данном случае мы берем датасет из четырех наблюдений и двух признаков ($x_1$ и $x_2$) и соответственно используем три коэффициента ($theta_0, theta_1, theta_2$).

Пошаговое построение модели

Начнем с функции гипотезы.

$$ h_{theta}(x) = theta X $$

def h(x, thetas):

  return np.dot(x, thetas)

Объявим функцию потерь.

$$ J({theta_j}) = frac{1}{2n} sum (y-theta X)^2 $$

def objective(x, y, thetas, n):

  return np.sum((y h(x, thetas)) ** 2) / (2 * n)

Объявим функцию для расчета градиента.

$$ frac{partial}{partial theta_j} J(theta) = -x_j(y — Xtheta) times frac{1}{n} $$

где j — индекс признака.

def gradient(x, y, thetas, n):

  return np.dot(x.T, (y h(x, thetas))) / n

Напишем функцию для обучения модели.

$$ theta_j := theta_j-alpha frac{partial}{partial theta_j} J(theta) $$

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

def fit(x, y, iter = 20000, learning_rate = 0.05):

  x, y = x.copy(), y.copy()

  # функцию add_ones() мы объявили выше

  add_ones(x)

  thetas, n = np.zeros(x.shape[1]), x.shape[0]

  loss_history = []

  for i in range(iter):

    loss_history.append(objective(x, y, thetas, n))

    grad = gradient(x, y, thetas, n)

    thetas -= learning_rate * grad

  return thetas, loss_history

Обучим модель, выведем коэффициенты и достигнутый (минимальный) уровень ошибки.

thetas, loss_history = fit(X, y, iter = 50000, learning_rate = 0.05)

thetas[0], thetas[1:], loss_history[1]

(9.493787734953824e-16,

array([-0.09989392,  0.03965441,  0.1069877 ,  0.23172172, -0.05561128,

        -0.16878987, -0.18057055, -0.49319274]),

0.1226558115181417)

Полученный результат очень близок к тому, что было найдено методом наименьших квадратов.

Прогноз

Сделаем прогноз.

def predict(x, thetas):

  x = x.copy()

  add_ones(x)

  return np.dot(x, thetas)

y_pred = predict(X, thetas)

y_pred[:5]

array([1.24414666, 0.55999778, 1.48103299, 1.49481605, 1.21342788])

Создание класса

Объединим написанные функции в класс.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

class gd():

  def __init__(self):

    self.thetas = None

    self.loss_history = []

  def add_ones(self, x):

    return x.insert(0,‘x0’, np.ones(x.shape[0]))

  def objective(self, x, y, thetas, n):

    return np.sum((y self.h(x, thetas)) ** 2) / (2 * n)

  def h(self, x, thetas):

    return np.dot(x, thetas)

  def gradient(self, x, y, thetas, n):

    return np.dot(x.T, (y self.h(x, thetas))) / n

  def fit(self, x, y, iter = 20000, learning_rate = 0.05):

    x, y = x.copy(), y.copy()

    self.add_ones(x)

    thetas, n = np.zeros(x.shape[1]), x.shape[0]

    # объявляем переменную loss_history (отличается от self.loss_history)

    loss_history = []

    for i in range(iter):

      loss_history.append(self.objective(x, y, thetas, n))

      grad = self.gradient(x, y, thetas, n)

      thetas -= learning_rate * grad

    # записываем обратно во внутренние атрибуты, чтобы передать методу .predict()

    self.thetas = thetas

    self.loss_history = loss_history

  def predict(self, x):

    x = x.copy()

    self.add_ones(x)

    return np.dot(x, self.thetas)

Создадим объект класса, обучим модель, выведем коэффициенты и сделаем прогноз.

model = gd()

model.fit(X, y, iter = 50000, learning_rate = 0.05)

model.thetas[0], model.thetas[1:], model.loss_history[1]

(9.493787734953824e-16,

array([-0.09989392,  0.03965441,  0.1069877 ,  0.23172172, -0.05561128,

        -0.16878987, -0.18057055, -0.49319274]),

0.1226558115181417)

y_pred = model.predict(X)

y_pred[:5]

array([1.24414666, 0.55999778, 1.48103299, 1.49481605, 1.21342788])

Оценка качества

(0.7546883769637167, 0.7546883769637167)

Теперь рассмотрим несколько дополнительных соображений, касающихся построения модели линейной регрессии.

Диагностика алгоритма

Работу алгоритма можно проверить с помощью кривой обучения (learning curve).

  • Ошибка постоянно снижается
  • Алгоритм остановится, после истечения заданного количества итераций
  • Можно задать пороговое значение, после которого он остановится (например, $10^{-1}$)

Построим кривую обучения.

plt.plot(loss_history)

plt.show()

зависимость ошибки от итераций

plt.plot(loss_history[:100])

plt.show()

зависимость ошибки от итераций (первые 100 итераций)

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

Подведем итог

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

Кроме того, мы узнали как изнутри устроены метод наименьших квадратов и метод градиентного спуска и построили соответствующие модели на Питоне.

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

Но прежде предлагаю в деталях изучить уже знакомый нам алгоритм логистической регрессии.

Дополнительные материалы к занятию.


  Перевод


  Ссылка на автора

Метрики, которые вы выбираете для оценки ваших алгоритмов машинного обучения, очень важны.

Выбор метрик влияет на то, как измеряется и сравнивается производительность алгоритмов машинного обучения. Они влияют на то, как вы оцениваете важность различных характеристик в результатах и ​​ваш окончательный выбор того, какой алгоритм выбрать.

В этом посте вы узнаете, как выбирать и использовать различные метрики производительности машинного обучения в Python с помощью scikit-learn.

Давайте начнем.

  • Обновление январь / 2017: Обновлено для отражения изменений в Scikit-Learn API в версии 0.18.
  • Обновление март / 2018: Добавлена ​​альтернативная ссылка для загрузки набора данных, так как кажется, что оригинал удален.

О рецептах

Различные метрики оценки машинного обучения демонстрируются в этом посте с использованием небольших рецептов кода на Python и scikit-learn.

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

Метрики демонстрируются для задач машинного обучения как по классификации, так и по типу регрессии.

  • Для метрик классификации Пима индейцы начало набора данных диабета используется в качестве демонстрации. Это проблема двоичной классификации, когда все входные переменные являются числовыми (обновление: скачать отсюда).
  • Для показателей регрессии Бостонский Дом Цена данных используется в качестве демонстрации. это проблема регрессии, когда все входные переменные также являются числовыми (обновление: скачать данные отсюда).

В каждом рецепте набор данных загружается непосредственно из UCI хранилище машинного обучения,

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

Предостережение в этих рецептах cross_val_score Функция, используемая для отчета о производительности в каждом рецепте. Она позволяет использовать различные метрики оценки, которые будут обсуждаться, но все оценки представляются таким образом, чтобы их можно было сортировать в порядке возрастания (наибольшая оценка является лучшей).

Некоторые метрики оценки (например, среднеквадратическая ошибка) — это, естественно, нисходящие баллы (наименьший балл — лучший), и поэтому они сообщаются как отрицательныеcross_val_score ()функция. Это важно отметить, потому что некоторые оценки будут сообщаться как отрицательные, которые по определению никогда не могут быть отрицательными.

Вы можете узнать больше о метриках производительности алгоритма машинного обучения, поддерживаемых scikit-learn, на странице Модель оценки: количественная оценка качества прогнозов,

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

Метрики классификации

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

В этом разделе мы рассмотрим, как использовать следующие метрики:

  1. Точность классификации.
  2. Логарифмическая потеря.
  3. Площадь под кривой ROC.
  4. Матрица путаницы.
  5. Классификационный отчет.

1. Точность классификации

Точность классификации — это число правильных прогнозов, сделанное как отношение всех сделанных прогнозов.

Это наиболее распространенная метрика оценки для задач классификации, и она также используется не по назначению. Это действительно подходит только тогда, когда в каждом классе имеется равное количество наблюдений (что бывает редко), и что все предсказания и ошибки предсказания одинаково важны, что часто не так.

Ниже приведен пример расчета точности классификации.

# Cross Validation Classification Accuracy
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LogisticRegression()
scoring = 'accuracy'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("Accuracy: %.3f (%.3f)") % (results.mean(), results.std())

Вы можете видеть, что соотношение сообщается. Это может быть преобразовано в процент путем умножения значения на 100, что дает оценку точности приблизительно на 77%.

Accuracy: 0.770 (0.048)

2. Логарифмическая потеря

Логарифмическая потеря (или logloss) является метрикой производительности для оценки предсказаний вероятностей принадлежности к данному классу.

Скалярная вероятность от 0 до 1 может рассматриваться как мера достоверности для прогноза алгоритмом. Предсказания, которые являются правильными или неправильными, вознаграждаются или наказываются пропорционально достоверности прогноза.

Вы можете узнать больше о логарифмическом на Функции потерь для классификации статьи Википедии,

Ниже приведен пример расчета logloss для прогнозов логистической регрессии на начало данных о диабете у индейцев пима.

# Cross Validation Classification LogLoss
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LogisticRegression()
scoring = 'neg_log_loss'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("Logloss: %.3f (%.3f)") % (results.mean(), results.std())

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

Logloss: -0.493 (0.047)

3. Площадь под кривой ROC

Область под кривой ROC (или AUC для краткости) является метрикой производительности для задач двоичной классификации.

AUC представляет способность модели различать положительные и отрицательные классы. Площадь 1 0 представляет модель, которая сделала все прогнозы идеально. Площадь 0,5 представляет модель, как случайную. Узнайте больше о РПЦ здесь,

РПЦ можно разбить на чувствительность и специфичность. Проблема бинарной классификации — это действительно компромисс между чувствительностью и специфичностью.

  • Чувствительность — это истинно положительный показатель, также называемый отзывом. Это число экземпляров из положительного (первого) класса, которое на самом деле правильно предсказано.
  • Специфика также называется истинным отрицательным показателем. Количество экземпляров из отрицательного класса (второго) класса, которые на самом деле были правильно спрогнозированы.

Вы можете узнать больше о РПЦ на странице Википедии,

Приведенный ниже пример демонстрирует расчет AUC.

# Cross Validation Classification ROC AUC
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LogisticRegression()
scoring = 'roc_auc'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("AUC: %.3f (%.3f)") % (results.mean(), results.std())

Вы можете видеть, что AUC относительно близок к 1 и больше 0,5, что говорит о некотором умении предсказывать.

AUC: 0.824 (0.041)

4. Матрица путаницы

Матрица путаницы — это удобное представление о точности модели с двумя или более классами.

В таблице представлены прогнозы по оси X и результаты точности по оси Y. Ячейки таблицы — это количество прогнозов, сделанных алгоритмом машинного обучения.

Например, алгоритм машинного обучения может предсказывать 0 или 1, и каждое предсказание могло фактически быть 0 или 1. Прогнозы для 0, которые были фактически 0, появляются в ячейке для предсказания = 0 и фактического = 0, тогда как предсказания для 0, которые были фактически 1 появляется в ячейке для прогнозирования = 0 и фактического = 1. И так далее.

Вы можете узнать больше о Матрица путаницы в статье Википедии,

Ниже приведен пример вычисления путаницы для набора прогнозов по модели на тестовом наборе.

# Cross Validation Classification Confusion Matrix
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
matrix = confusion_matrix(Y_test, predicted)
print(matrix)

Хотя массив печатается без заголовков, вы можете видеть, что большинство предсказаний приходится на диагональную линию матрицы (которые являются правильными предсказаниями).

[[141  21]
 [ 41  51]]

5. Классификационный отчет

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

classification_report ()Функция отображает точность, отзыв, f1-балл и поддержку для каждого класса.

Пример ниже демонстрирует отчет о проблеме двоичной классификации.

# Cross Validation Classification Report
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
report = classification_report(Y_test, predicted)
print(report)

Вы можете увидеть хороший прогноз и отзыв для алгоритма.

precision    recall  f1-score   support

        0.0       0.77      0.87      0.82       162
        1.0       0.71      0.55      0.62        92

avg / total       0.75      0.76      0.75       254

Метрики регрессии

В этом разделе будут рассмотрены 3 наиболее распространенных показателя для оценки прогнозов проблем регрессионного машинного обучения:

  1. Средняя Абсолютная Ошибка.
  2. Средняя квадратичная ошибка
  3. R ^ 2.

1. Средняя абсолютная ошибка

Средняя абсолютная ошибка (или MAE) представляет собой сумму абсолютных различий между прогнозами и фактическими значениями. Это дает представление о том, насколько неправильными были прогнозы.

Мера дает представление о величине ошибки, но не дает представление о направлении (например, сверх или при прогнозировании).

Вы можете узнать больше о Среднее Абсолютная ошибка в Википедии,

В приведенном ниже примере показано вычисление средней абсолютной ошибки по набору цен на жилье в Бостоне.

# Cross Validation Regression MAE
import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_absolute_error'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("MAE: %.3f (%.3f)") % (results.mean(), results.std())

Значение 0 указывает на отсутствие ошибок или точных прогнозов. Как logloss, эта метрика инвертируетсяcross_val_score ()функция.

MAE: -4.005 (2.084)

2. Средняя квадратическая ошибка

Средняя квадратическая ошибка (или MSE) очень похожа на среднюю абсолютную ошибку в том, что она дает общее представление о величине ошибки.

Взятие квадратного корня из среднеквадратичной ошибки преобразует единицы обратно в исходные единицы выходной переменной и может иметь смысл для описания и представления. Это называется среднеквадратической ошибкой (или RMSE).

Вы можете узнать больше о Средняя квадратическая ошибка в Википедии,

Приведенный ниже пример демонстрирует расчет среднего квадрата ошибки.

# Cross Validation Regression MSE
import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_squared_error'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("MSE: %.3f (%.3f)") % (results.mean(), results.std())

Эта метрика тоже инвертирована, так что результаты растут. Не забудьте взять абсолютное значение перед получением квадратного корня, если вы заинтересованы в расчете RMSE.

MSE: -34.705 (45.574)

3. R ​​^ 2 Метрика

Метрика R ^ 2 (или R Squared) указывает на достоверность соответствия набора прогнозов фактическим значениям. В статистической литературе эта мера называется коэффициентом детерминации.

Это значение между 0 и 1 для неподходящего и идеального соответствия соответственно.

Вы можете узнать больше о Статья о коэффициенте определения в Википедии,

Приведенный ниже пример демонстрирует вычисление среднего значения R ^ 2 для набора прогнозов.

# Cross Validation Regression R^2
import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'r2'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("R^2: %.3f (%.3f)") % (results.mean(), results.std())

Вы можете видеть, что прогнозы плохо соответствуют фактическим значениям со значением, близким к нулю и меньшим, чем 0,5.

R^2: 0.203 (0.595)

Резюме

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

Вы узнали о 3 метриках классификации:

  • Точность.
  • Логарифмическая потеря.
  • Площадь под кривой ROC.

Также 2 удобных метода для классификации результатов прогнозирования:

  • Матрица путаницы.
  • Классификационный отчет.

И 3 показателя регрессии:

  • Средняя Абсолютная Ошибка.
  • Средняя квадратичная ошибка
  • R ^ 2

Есть ли у вас какие-либо вопросы о метриках для оценки алгоритмов машинного обучения или этот пост? Задайте свой вопрос в комментариях, и я сделаю все возможное, чтобы ответить на него.

This article contains affiliate links. For more, please read the T&Cs.

Importance of Model Evaluation

Being able to correctly measure the performance of a machine learning model is a critical skill for every machine learning practitioner. In order to assess the performance of the model, we use evaluation metrics.

Depending on the type of problem that we want to solve, we can perform classification (where a categorical variable is predicted) or regression (where a real number is predicted) in order to solve it. Luckily, the scikit-learn library allows us to create regressions easily, without having to deal with the underlying mathematical theory. 

In this article, we will demonstrate how to perform linear regression on a given dataset and evaluate its performance using:

  • Mean absolute error
  • Mean squared error
  • R2 score (the coefficient of determination)

Regression Metrics

Regression metrics are different from classification metrics because we are predicting a continuous quantity. Furthermore, regression typically has simpler evaluation needs than classification.

Fundamental metrics that are used for assessing the regression model are presented below.

 Mean absolute error

Mean absolute error (MAE) is one of the most common metrics that is used to calculate the prediction error of the model. Prediction error of a single row of data is:

prediction error formula

We need to calculate prediction errors for each row of data, get their absolute value and then find the mean of all absolute prediction errors.

MAE is given by the following formula:

MAE formula

where yi represents the predicted value of ŷi.

MAE graphical

The plot above represents the residuals – differences between the predicted values (regression line) and the output values. MAE uses the absolute value of the residuals, so it cannot indicate whether the model is underperforming or overperforming. Each residual contributes linearly to the total error because we are summing individual residuals. For that reason, small MAE suggests the model is great at prediction. Similarly, a large MAE suggests that your model may have trouble at generalizing well. An MAE of 0 means that our model outputs perfect predictions, but this is unlikely to happen in real scenarios.

 Mean squared error

Mean squared error (MSE) takes the mean squared difference between the target and predicted values. This value is widely used for many regression problems and larger errors have correspondingly larger squared contributions to the mean error. 

MSE is given by the following formula:

where yi represents the predicted value of ŷi.

MSE will almost always be bigger than MAE because in MAE residuals contribute linearly to the total error, while in MSE the error grows quadratically with each residual. This is why MSE is used to determine the extent to which the model fits the data because it strongly penalizes the heavy outliers.

The coefficient of determination (R2 score)

R2 score determines how well the regression predictions approximate the real data points.

The value of R2 is calculated with the following formula:

coefficient of determination R2 score

where ŷi represents the predicted value of yi and ȳ is the mean of observed data which is calculated as

formula for the mean value

R2 can take values from 0 to 1. A value of 1 indicates that the regression predictions perfectly fit the data.

Tips For Using Regression Metrics

  • We always need to make sure that the evaluation metric we choose for a regression problem does penalize errors in a way that reflects the consequences of those errors for the business, organizational, or user needs of our application.
  • If there are outliers in the data, they can have an unwanted influence on the overall R2 or MSE scores. MAE is robust to the presence of outliers because it uses the absolute value. Hence, we can use the MAE score if ignoring outliers is important to us.
  • MAE is the best metrics when we want to make a distinction between different models because it doesn’t reflect large residuals.
  • If we want to ensure that our model takes the outliers into account more, we should use the MSE metrics.

Hands-On Example of Regression Metrics

In order to understand regression metrics, it’s best to get hands-on experience with a real dataset. In this tutorial, we will show you how to make a simple linear regression model in scikit-learn and then calculate the metrics that we have previously explained.

The rationale behind the model

The dataset that we will use is a Boston Housing Dataset and the task of our model will be to predict the price of the house. Let’s say that we are an estate agent and that we want to quickly determine the price of the house in Boston. We can do this by creating a model that considers the features of the new property, such as the number of rooms, air quality and the crime rate in the town, etc. In order to train the model, we will build a model on the features of training data and we will use the model to predict a value for new data.

Implementation

Now, let’s start our coding! First, we need to import the necessary libraries:

import numpy as np 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression 
from sklearn import metrics
from sklearn import datasets
%matplotlib inline

We will use the Boston Housing Dataset which can be accessed from the scikit-learn library.

boston_data = datasets.load_boston()

Our dataset is a dictionary that contains key:value pairs. We can check them out by printing the keys.

print(boston_data.keys())

boston housing dataset keys

This dataset contains 506 samples and 13 feature variables. The objective is to predict the prices of the house using the given features.

print(boston_data.data.shape)

By printing the description of the dataset, we can see more information about it and the features that it contains.

print(boston_data.DESCR)

description of boston housing dataset

Our features will be stored in x variable and output values (prices of properties) will be stored in y. Output values that are stored in y are the target values that our model will try to predict.


# Input Data
x = boston_data.data
# Output Data
y = boston_data.target

After that, we need to split our data into train and test splits.

X_train, X_test, y_train, y_test = train_test_split(x,y,test_size=1/3, random_state=0)

For the prediction, we will use the Linear Regression model. This model is available as the part of the sklearn.linear_model module. We will fit the model using the training data.

model = LinearRegression()
model.fit(X_train, y_train)

Once we train our model, we can use it for prediction. We will predict the prices of properties from our test set.

y_predicted = model.predict(X_test)

Actual vs Predicted graph

Before looking at the metrics and plain numbers, we should first plot our data on the Actual vs Predicted graph for our test dataset. This is one of the most useful plots because it can tell us a lot about the performance of our model. The plot below uses MatPlotLib to make its visualizations for analyzing residuals v. model fit.

fig, ax = plt.subplots()
ax.scatter(y_predicted, y_test, edgecolors=(0, 0, 1))
ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=3)
ax.set_xlabel('Predicted')
ax.set_ylabel('Actual')
plt.show()
Actual vs Predicted graph for linear regression

On this plot, we can check out where the points lie. We can see that some points are far away from the diagonal line and we can conclude that the Rscore will be low. This shows us that the model doesn’t fit the data very well. Now, we will make the same conclusion by solely observing magnitudes of regression metrics.

Evaluation of the model

In this step, we will evaluate the model by using the standard metrics available in sklearn.metrics. The quality of our model shows how well its predictions match up against actual values. We will assess how well the model performs against the test data using a set of standard metrics that we have previously introduced.

# model evaluation for testing set

mae = metrics.mean_absolute_error(y_test, y_predicted)
mse = metrics.mean_squared_error(y_test, y_predicted)
r2 = metrics.r2_score(y_test, y_predicted)

print("The model performance for testing set")
print("--------------------------------------")
print('MAE is {}'.format(mae))
print('MSE is {}'.format(mse))
print('R2 score is {}'.format(r2))

regression model performance

Mean absolute error is 3.55 which shows that our algorithm is not that accurate, but it can still make good predictions. 

The value of the mean squared error is 26.36 which shows that we have some outliers.

The Rscore is 0.66 and it shows that our model doesn’t fit data very well because it cannot explain all the variance. 

Considering our regression metrics, we can conclude that the model can be further improved. At this point, we could consider adding more features or trying to fit a different regression model.

Summary

In this post, we covered the fundamental metrics used to measure the performance of regression models. In the job interviews, you will be asked to evaluate the model, choose the proper metrics and explain it. This is why it is important to fully grasp the logic behind these concepts and learn when to use which evaluation metrics.

In the table below we give an overview of the regression evaluation metrics that we explored. 

ABBREVIATION FULL NAME ROBUST TO OUTLIERS
MAE MEAN ABSOLUTE ERROR YES
MSE MEAN SQUARED ERROR NO
R2  R SQUARED/ R2 NO

For further studying, we suggest you check out these links and find even more about regression evaluation!

  • Examples of model evaluation can be found in the book Chapter 5 of Introduction to Machine Learning with Python.
  • Getting back to basics is the best way to understand more complex things. Therefore, we suggest you check out the scikit-learn official tutorial on Linear regression.
  • Check the scikit-learn official documentation and read more about regression metrics that are part of this library.
  • This post on Towards Data Science explains mathematical formulations and usage cases for different regression metrics. 
  • The tutorial on GeeksforGeeks explains Mean squared error in detail.

Понравилась статья? Поделить с друзьями:
  • Mediaget ошибка установки
  • Mean squared error linear regression
  • Mediaget ошибка загрузки перепроверить данные
  • Mean squared error keras
  • Mediaget ошибка 1114