Квадратичная ошибка python

sklearn.metrics.mean_squared_error(y_true, y_pred, *, sample_weight=None, multioutput=‘uniform_average’, squared=True)[source]

Mean squared error regression loss.

Read more in the User Guide.

Parameters:
y_truearray-like of shape (n_samples,) or (n_samples, n_outputs)

Ground truth (correct) target values.

y_predarray-like of shape (n_samples,) or (n_samples, n_outputs)

Estimated target values.

sample_weightarray-like of shape (n_samples,), default=None

Sample weights.

multioutput{‘raw_values’, ‘uniform_average’} or array-like of shape (n_outputs,), default=’uniform_average’

Defines aggregating of multiple output values.
Array-like value defines weights used to average errors.

‘raw_values’ :

Returns a full set of errors in case of multioutput input.

‘uniform_average’ :

Errors of all outputs are averaged with uniform weight.

squaredbool, default=True

If True returns MSE value, if False returns RMSE value.

Returns:
lossfloat or ndarray of floats

A non-negative floating point value (the best value is 0.0), or an
array of floating point values, one for each individual target.

Examples

>>> from sklearn.metrics import mean_squared_error
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred)
0.375
>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred, squared=False)
0.612...
>>> y_true = [[0.5, 1],[-1, 1],[7, -6]]
>>> y_pred = [[0, 2],[-1, 2],[8, -5]]
>>> mean_squared_error(y_true, y_pred)
0.708...
>>> mean_squared_error(y_true, y_pred, squared=False)
0.822...
>>> mean_squared_error(y_true, y_pred, multioutput='raw_values')
array([0.41666667, 1.        ])
>>> mean_squared_error(y_true, y_pred, multioutput=[0.3, 0.7])
0.825...

Examples using sklearn.metrics.mean_squared_error

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    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)      begin{equation*}   hat{Y}_i = hat{beta}_0 + hat{beta}_1 X_i + hat{epsilon}_i   end{equation*}

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

      (2)    begin{equation*} hat{Y}_i end{equation*}

    3. Now subtract the new Y values (i.e. hat{Y}_i) from the original Y values. Thus, found values are the error terms. It is also known as the vertical distance of the given point from the regression line.

      (3)     begin{equation*}  Y_i - hat{Y}_i  end{equation*}

    4. Square the errors found in step 3.

      (4)     begin{equation*}  {(Y_i - hat{Y}_i)}^2  end{equation*}

    5. Sum up all the squares.

      (5)     begin{equation*}  sum_{i=1}^{N}(Y_i - hat{Y}_i)^2  end{equation*}

    6. Divide the value found in step 5 by the total number of observations.

      (6)     begin{equation*}  MSE = frac{1}{N}sum_{i=1}^{N}(Y_i - hat{Y}_i)^2  end{equation*}

    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 hat{Y}_i
    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

    MSE using scikit – learn:

    from sklearn.metrics import mean_squared_error

    Y_true = [1,1,2,2,4

    Y_pred = [0.6,1.29,1.99,2.69,3.4

    mean_squared_error(Y_true,Y_pred)

    Output: 0.21606

    MSE using Numpy module:

    import numpy as np

    Y_true = [1,1,2,2,4

    Y_pred = [0.6,1.29,1.99,2.69,3.4

    MSE = np.square(np.subtract(Y_true,Y_pred)).mean()

    Output: 0.21606

    Last Updated :
    30 Jun, 2019

    Like Article

    Save Article

    • Редакция Кодкампа

    17 авг. 2022 г.
    читать 1 мин


    Среднеквадратическая ошибка (MSE) — это распространенный способ измерения точности предсказания модели. Он рассчитывается как:

    MSE = (1/n) * Σ(фактическое – прогноз) 2

    куда:

    • Σ — причудливый символ, означающий «сумма».
    • n – размер выборки
    • фактический – фактическое значение данных
    • прогноз – прогнозируемое значение данных

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

    Как рассчитать MSE в Python

    Мы можем создать простую функцию для вычисления MSE в Python:

    import numpy as np
    
    def mse(actual, pred): 
     actual, pred = np.array(actual), np.array(pred)
     return np.square(np.subtract(actual,pred)).mean()
    

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

    actual = [12, 13, 14, 15, 15, 22, 27]
    pred = [11, 13, 14, 14, 15, 16, 18]
    
    mse(actual, pred)
    
    17.0
    

    Среднеквадратическая ошибка (MSE) для этой модели оказывается равной 17,0 .

    На практике среднеквадратическая ошибка (RMSE) чаще используется для оценки точности модели. Как следует из названия, это просто квадратный корень из среднеквадратичной ошибки.

    Мы можем определить аналогичную функцию для вычисления RMSE:

    import numpy as np
    
    def rmse(actual, pred): 
     actual, pred = np.array(actual), np.array(pred)
     return np.sqrt(np.square(np.subtract(actual,pred)).mean())
    

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

    actual = [12, 13, 14, 15, 15, 22, 27]
    pred = [11, 13, 14, 14, 15, 16, 18]
    
    rmse(actual, pred)
    
    4.1231
    

    Среднеквадратическая ошибка (RMSE) для этой модели оказывается равной 4,1231 .

    Дополнительные ресурсы

    Калькулятор среднеквадратичной ошибки (MSE)
    Как рассчитать среднеквадратичную ошибку (MSE) в Excel

    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.

    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:

    {displaystyle operatorname {MSE} ={frac {1}{n}}sum _{i=1}^{n}(Y_{i}-{hat {Y_{i}}})^{2}.}
    The formula for the mean squared error (MSE)

    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.

    # Importing a sample Pandas DataFrame
    import pandas as pd
    
    df = pd.DataFrame.from_dict({
        'x': [1,2,3,4,5,6,7,8,9,10], 
        'y': [1,2,2,4,4,5,6,7,9,10]})
    
    print(df.head())
    #    x  y
    # 0  1  1
    # 1  2  2
    # 2  3  2
    # 3  4  4
    # 4  5  4

    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:

    # Plotting a line of best fit
    import seaborn as sns
    import matplotlib.pyplot as plt
    sns.regplot(data=df, x='x', y='y', ci=None)
    plt.ylim(bottom=0)
    plt.xlim(left=0)
    plt.show()

    This returns the following visualization:

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

    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 prediction y values in sklearn
    from sklearn.linear_model import LinearRegression
    
    model = LinearRegression()
    model.fit(df[['x']], df['y'])
    y_2 = model.predict(df[['x']])
    df['y_predicted'] = y_2
    print(df.head())
    
    # Returns:
    #    x  y  y_predicted
    # 0  1  1     0.581818
    # 1  2  2     1.563636
    # 2  3  2     2.545455
    # 3  4  4     3.527273
    # 4  5  4     4.509091

    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:

    # Calculating the MSE with sklearn
    from sklearn.metrics import mean_squared_error
    mse = mean_squared_error(df['y'], df['y_predicted'])
    print(mse)
    
    # Returns: 0.24727272727272714

    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.

    # Definiting a custom function to calculate the MSE
    import numpy as np
    
    def mse(actual, predicted):
        actual = np.array(actual)
        predicted = np.array(predicted)
        differences = np.subtract(actual, predicted)
        squared_differences = np.square(differences)
        return squared_differences.mean()
    
    print(mse(df['y'], df['y_predicted']))
    
    # Returns: 0.24727272727272714

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

    # A shorter version of the code above
    import numpy as np
    
    def mse(actual, predicted):
        return np.square(np.subtract(np.array(actual), np.array(predicted))).mean()
    
    print(mse(df['y'], df['y_predicted']))
    
    # Returns: 0.24727272727272714

    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:

    • Pandas Variance: Calculating Variance of a Pandas Dataframe Column
    • Calculate the Pearson Correlation Coefficient in Python
    • How to Calculate a Z-Score in Python (4 Ways)
    • Official Documentation from Scikit-Learn

    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.

    mean squared error in python

    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.

    Line regression 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.

    Also, Read | How to Calculate Square Root in Python

    To get the Mean Squared Error in Python using NumPy

    import numpy as np
    true_value_of_y= [3,2,6,1,5]
    predicted_value_of_y= [2.0,2.4,2.8,3.2,3.6]
    MSE = np.square(np.subtract(true_value_of_y,predicted_value_of_y)).mean()
    print(MSE)
    

    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

    3.6400000000000006

    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

    sklearn.metrices.mean_squared_error(y_truey_pred*sample_weight=Nonemultioutput='uniform_average'squared=True)

    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.

    Code

    from sklearn.metrics import mean_squared_error
    true_value_of_y= [3,2,6,1,5]
    predicted_value_of_y= [2.0,2.4,2.8,3.2,3.6]
    mean_squared_error(true_value_of_y,predicted_value_of_y)
    print(mean_squared_error(true_value_of_y,predicted_value_of_y))
    

    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

    3.6400000000000006

    Calculating Mean Squared Error Without Using any Modules

    true_value_of_y = [3,2,6,1,5]
    predicted_value_of_y = [2.0,2.4,2.8,3.2,3.6]
    summation_of_value = 0  
    n = len(true_value_of_y) 
    for i in range (0,n):
      difference_of_value = true_value_of_y[i] - predicted_value_of_y[i]  
      squared_difference = difference_of_value**2   
      summation_of_value = summation_of_value + squared_difference
    MSE = summation_of_value/n  
    print ("The Mean Squared Error is: " , MSE)
    

    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

    The Mean Squared Error is:  3.6400000000000006

    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:

    Calculate mean squared error using negative values

    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

    Code

    >>> from sklearn.metrics import mean_squared_error
    >>> y_true = [2,-1,0.6,-0.7,-0.2]
    >>> y_pred = [0.9,0.1,-0.4,-0.1,0.6]
    >>> mean_squared_error(y_true, y_pred)
    

    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

    0.884

    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.

    Code:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from numpy import *
    
    
    def compute_error(b, m, points):
        totalError = 0
        for i in range(0, len(points)):
            x = points[i, 0]
            y = points[i, 1]
            totalError += (y - (m * x + b)) ** 2
        return totalError / float(len(points))
    
    
    def gradient_step(
        b_current,
        m_current,
        points,
        learningRate,
        ):
        b_gradient = 0
        m_gradient = 0
        N = float(len(points))
        for i in range(0, len(points)):
            x = points[i, 0]
            y = points[i, 1]
            b_gradient += -(2 / N) * (y - (m_current * x + b_current))
            m_gradient += -(2 / N) * x * (y - (m_current * x + b_current))
        new_b = b_current - learningRate * b_gradient
        new_m = m_current - learningRate * m_gradient
        return [new_b, new_m]
    
    
    def gradient_descent_runner(
        points,
        starting_b,
        starting_m,
        learning_rate,
        iterations,
        ):
        b = starting_b
        m = starting_m
        for i in range(iterations):
            (b, m) = gradient_step(b, m, array(points), learning_rate)
        return [b, m]
    
    
    def main():
        points = genfromtxt('data.csv', delimiter=',')
        learning_rate = 0.00001
        initial_b = 0
        initial_m = 0
        iterations = 10000
        print('Starting gradient descent at b = {0}, m = {1}, error = {2}'.format(initial_b,
                initial_m, compute_error(initial_b, initial_m, points)))
        print('Running...')
        [b, m] = gradient_descent_runner(points, initial_b, initial_m,
                learning_rate, iterations)
        print('After {0} iterations b = {1}, m = {2}, error = {3}'.format(iterations,
                b, m, compute_error(b, m, points)))
    
    
    if __name__ == '__main__':
        main()
    

    Output:

    Starting gradient descent at b = 0, m = 0, error = 5671.844671124282
    Running...
    After 10000 iterations b = 0.11558415090685024, m = 1.3769012288001614, error = 212.26220312358794

    1. What is the pip command to install numpy?

    pip install numpy

    2. What is the pip command to install sklearn.metrices library?

    pip install sklearn

    3. What is the expansion of MSE?

    The expansion of MSE is Mean Squared Error.

    Conclusion

    In this article, we have learned about the mean squared error. It is effortless to calculate. This is useful for loss function for least squares regression. The formula for the MSE is easy to memorize. We hope this article is handy and easy to understand.

    Есть 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

    Примеры использования:

    >>> from sklearn import svm, datasets
    >>> from sklearn.model_selection import cross_val_score
    >>> X, y = datasets.load_iris(return_X_y=True)
    >>> clf = svm.SVC(random_state=0)
    >>> cross_val_score(clf, X, y, cv=5, scoring='recall_macro')
    array([0.96..., 0.96..., 0.96..., 0.93..., 1.        ])
    >>> model = svm.SVC()
    >>> cross_val_score(model, X, y, cv=5, scoring='wrong_choice')
    Traceback (most recent call last):
    ValueError: 'wrong_choice' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.

    Примечание

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

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

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

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

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

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

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

    >>> from sklearn.metrics import fbeta_score, make_scorer
    >>> ftwo_scorer = make_scorer(fbeta_score, beta=2)
    >>> from sklearn.model_selection import GridSearchCV
    >>> from sklearn.svm import LinearSVC
    >>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]},
    ...                     scoring=ftwo_scorer, cv=5)

    Второй вариант использования — создание полностью настраиваемого объекта скоринга из простой функции 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 параметра:

    >>> import numpy as np
    >>> def my_custom_loss_func(y_true, y_pred):
    ...     diff = np.abs(y_true - y_pred).max()
    ...     return np.log1p(diff)
    ...
    >>> # score will negate the return value of my_custom_loss_func,
    >>> # which will be np.log(2), 0.693, given the values for X
    >>> # and y defined below.
    >>> score = make_scorer(my_custom_loss_func, greater_is_better=False)
    >>> X = [[1], [1]]
    >>> y = [0, 1]
    >>> from sklearn.dummy import DummyClassifier
    >>> clf = DummyClassifier(strategy='most_frequent', random_state=0)
    >>> clf = clf.fit(X, y)
    >>> my_custom_loss_func(y, clf.predict(X))
    0.69...
    >>> score(clf, X, y)
    -0.69...

    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) и импортируется:

    >>> from custom_scorer_module import custom_scoring_function 
    >>> cross_val_score(model,
    ...  X_train,
    ...  y_train,
    ...  scoring=make_scorer(custom_scoring_function, greater_is_better=False),
    ...  cv=5,
    ...  n_jobs=-1) 

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

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

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

    • Как итерация строковых показателей:
    >>> scoring = ['accuracy', 'precision']
    • В качестве dictсопоставления имени секретаря с функцией подсчета очков:
    >>> from sklearn.metrics import accuracy_score
    >>> from sklearn.metrics import make_scorer
    >>> scoring = {'accuracy': make_scorer(accuracy_score),
    ...            'prec': 'precision'}

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

    • Как вызываемый объект, возвращающий словарь оценок:
    >>> from sklearn.model_selection import cross_validate
    >>> from sklearn.metrics import confusion_matrix
    >>> # A sample toy binary classification dataset
    >>> X, y = datasets.make_classification(n_classes=2, random_state=0)
    >>> svm = LinearSVC(random_state=0)
    >>> def confusion_matrix_scorer(clf, X, y):
    ...      y_pred = clf.predict(X)
    ...      cm = confusion_matrix(y, y_pred)
    ...      return {'tn': cm[0, 0], 'fp': cm[0, 1],
    ...              'fn': cm[1, 0], 'tp': cm[1, 1]}
    >>> cv_results = cross_validate(svm, X, y, cv=5,
    ...                             scoring=confusion_matrix_scorer)
    >>> # Getting the test set true positive scores
    >>> print(cv_results['test_tp'])
    [10  9  8  7  8]
    >>> # Getting the test set false negative scores
    >>> print(cv_results['test_fn'])
    [0 1 2 3 2]

    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, *[, …]) Потеря классификации нулевая единица.

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

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

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

    Некоторые метрики по существу определены для задач двоичной классификации (например f1_scoreroc_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{y}_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда доля правильных прогнозов по сравнению с $n_{samples}$ определяется как
    $$texttt{accuracy}(y, hat{y}) = frac{1}{n_text{samples}} sum_{i=0}^{n_text{samples}-1} 1(hat{y}_i = y_i)$$

    где $1(x)$- индикаторная функция .

    >>> import numpy as np
    >>> from sklearn.metrics import accuracy_score
    >>> y_pred = [0, 2, 1, 3]
    >>> y_true = [0, 1, 2, 3]
    >>> accuracy_score(y_true, y_pred)
    0.5
    >>> accuracy_score(y_true, y_pred, normalize=False)
    2

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

    >>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))
    0.5

    Пример:

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

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

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

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

    Если $hat{f}_{i,j}$ прогнозируемый класс для $i$-й образец, соответствующий $j$-й по величине прогнозируемый результат и $y_i$ — соответствующее истинное значение, тогда доля правильных прогнозов по сравнению с $n_{samples}$ определяется как
    $$texttt{top-k accuracy}(y, hat{f}) = frac{1}{n_text{samples}} sum_{i=0}^{n_text{samples}-1} sum_{j=1}^{k} 1(hat{f}_{i,j} = y_i)$$

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

    >>> import numpy as np
    >>> from sklearn.metrics import top_k_accuracy_score
    >>> y_true = np.array([0, 1, 2, 2])
    >>> y_score = np.array([[0.5, 0.2, 0.2],
    ...                     [0.3, 0.4, 0.2],
    ...                     [0.2, 0.4, 0.3],
    ...                     [0.7, 0.2, 0.1]])
    >>> top_k_accuracy_score(y_true, y_score, k=2)
    0.75
    >>> # Not normalizing gives the number of "correctly" classified samples
    >>> top_k_accuracy_score(y_true, y_score, k=2, normalize=False)
    3

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

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

    В двоичном случае сбалансированная точность равна среднему арифметическому чувствительности (истинно положительный показатель) и специфичности (истинно отрицательный показатель) или площади под кривой ROC с двоичными прогнозами, а не баллами:
    $$texttt{balanced-accuracy} = frac{1}{2}left( frac{TP}{TP + FN} + frac{TN}{TN + FP}right )$$

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

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

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

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

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

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

    Примечание

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

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

    Рекомендации:

    • Гийон 2015 ( 1 , 2 ) И. Гайон, К. Беннет, Г. Коули, Х. Дж. Эскаланте, С. Эскалера, Т. К. Хо, Н. Масиа, Б. Рэй, М. Саид, А. Р. Статников, Э. Вьегас, Дизайн конкурса ChaLearn AutoML Challenge 2015 , IJCNN 2015 г.
    • Мосли 2013 ( 1 , 2 ) Л. Мосли, Сбалансированный подход к проблеме мультиклассового дисбаланса , IJCV 2010.
    • Kelleher2015 Джон. Д. Келлехер, Брайан Мак Нейме, Аойф Д’Арси, Основы машинного обучения для прогнозной аналитики данных: алгоритмы, рабочие примеры и тематические исследования , 2015.
    • Урбанович2015 Urbanowicz RJ, Moore, JH ExSTraCS 2.0: описание и оценка масштабируемой системы классификаторов обучения , Evol. Intel. (2015) 8:89.

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

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

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

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

    >>> from sklearn.metrics import cohen_kappa_score
    >>> y_true = [2, 0, 2, 2, 0, 1]
    >>> y_pred = [0, 0, 2, 2, 0, 2]
    >>> cohen_kappa_score(y_true, y_pred)
    0.4285714285714286

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

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

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

    >>> from sklearn.metrics import confusion_matrix
    >>> y_true = [2, 0, 2, 2, 0, 1]
    >>> y_pred = [0, 0, 2, 2, 0, 2]
    >>> confusion_matrix(y_true, y_pred)
    array([[2, 0, 0],
           [0, 0, 1],
           [1, 0, 2]])

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

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

    >>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]
    >>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]
    >>> confusion_matrix(y_true, y_pred, normalize='all')
    array([[0.25 , 0.125],
           [0.25 , 0.375]])

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

    >>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]
    >>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]
    >>> tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
    >>> tn, fp, fn, tp
    (2, 1, 2, 3)

    Пример:

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

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

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

    >>> from sklearn.metrics import classification_report
    >>> y_true = [0, 1, 2, 2, 0]
    >>> y_pred = [0, 0, 2, 1, 0]
    >>> target_names = ['class 0', 'class 1', 'class 2']
    >>> print(classification_report(y_true, y_pred, target_names=target_names))
                  precision    recall  f1-score   support
    
         class 0       0.67      1.00      0.80         2
         class 1       0.00      0.00      0.00         1
         class 2       1.00      0.50      0.67         2
    
        accuracy                           0.60         5
       macro avg       0.56      0.50      0.49         5
    weighted avg       0.67      0.60      0.59         5

    Пример:

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

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

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

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

    где $1(x)$- индикаторная функция .

    >>> from sklearn.metrics import hamming_loss
    >>> y_pred = [1, 2, 3, 4]
    >>> y_true = [2, 2, 3, 4]
    >>> hamming_loss(y_true, y_pred)
    0.25

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

    >>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))
    0.75

    Примечание

    В мультиклассовой классификации потери Хэмминга соответствуют расстоянию Хэмминга между 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{AP} = sum_n (R_n — R_{n-1}) 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 для оценки качества вывода классификатора.

    Рекомендации:

    • [Manning2008] г. CD Manning, P. Raghavan, H. Schütze, Introduction to Information Retrieval , 2008.
    • [Everingham2010] М. Эверингем, Л. Ван Гул, CKI Уильямс, Дж. Винн, А. Зиссерман, Задача классов визуальных объектов Pascal (VOC) , IJCV 2010.
    • [Davis2006] Дж. Дэвис, М. Гоадрич, Взаимосвязь между точным воспроизведением и кривыми ROC , ICML 2006.
    • [Flach2015] П.А. Флэч, М. Кулл, Кривые точности-отзыва-выигрыша: PR-анализ выполнен правильно , NIPS 2015.

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

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

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

    В этом контексте мы можем определить понятия точности, отзыва и F-меры:
    $$text{precision} = frac{tp}{tp + fp},$$
    $$text{recall} = frac{tp}{tp + fn},$$
    $$F_beta = (1 + beta^2) frac{text{precision} times text{recall}}{beta^2 text{precision} + text{recall}}.$$

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

    >>> from sklearn import metrics
    >>> y_pred = [0, 1, 0, 0]
    >>> y_true = [0, 1, 0, 1]
    >>> metrics.precision_score(y_true, y_pred)
    1.0
    >>> metrics.recall_score(y_true, y_pred)
    0.5
    >>> metrics.f1_score(y_true, y_pred)
    0.66...
    >>> metrics.fbeta_score(y_true, y_pred, beta=0.5)
    0.83...
    >>> metrics.fbeta_score(y_true, y_pred, beta=1)
    0.66...
    >>> metrics.fbeta_score(y_true, y_pred, beta=2)
    0.55...
    >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5)
    (array([0.66..., 1.        ]), array([1. , 0.5]), array([0.71..., 0.83...]), array([2, 2]))
    
    
    >>> import numpy as np
    >>> from sklearn.metrics import precision_recall_curve
    >>> from sklearn.metrics import average_precision_score
    >>> y_true = np.array([0, 0, 1, 1])
    >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8])
    >>> precision, recall, threshold = precision_recall_curve(y_true, y_scores)
    >>> precision
    array([0.66..., 0.5       , 1.        , 1.        ])
    >>> recall
    array([1. , 0.5, 0.5, 0. ])
    >>> threshold
    array([0.35, 0.4 , 0.8 ])
    >>> average_precision_score(y_true, y_scores)
    0.83...

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

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

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

    • $y$ набор предсказанных ($sample$, $label$) пары
    • $hat{y}$ набор истинных ($sample$, $label$) пары
    •  $L$ набор лейблов
    • $S$ набор образцов
    • $y_s$ подмножество $y$ с образцом $s$, т.е $y_s := left{(s’, l) in y | s’ = sright}$. 
    • $y_l$ подмножество $y$ с этикеткой $l$
    • по аналогии, $hat{y}_s$ а также $hat{y}_l$ являются подмножествами $hat{y}$
    • $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{P(A, B) times R(A, B)}{beta^2 P(A, B) + R(A, B)}$$

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

    average Точность Отзывать F_beta
    «micro» $P(y, hat{y})$ $R(y, hat{y})$ $F_beta(y, hat{y})$
    «samples» $frac{1}{left|Sright|} sum_{s in S} P(y_s, hat{y}_s)$ $frac{1}{left|Sright|} sum_{s in S} R(y_s, hat{y}_s)$ $frac{1}{left|Sright|} sum_{s in S} F_beta(y_s, hat{y}_s)$
    «macro» $frac{1}{left|Lright|} sum_{l in L} P(y_l, hat{y}_l)$ $frac{1}{left|Lright|} sum_{l in L} R(y_l, hat{y}_l)$ $frac{1}{left|Lright|} sum_{l in L} F_beta(y_l, hat{y}_l)$
    «weighted» $frac{1}{sum_{l in L} left|hat{y}lright|} sum{l in L} left|hat{y}_lright| P(y_l, hat{y}_l)$ $frac{1}{sum_{l in L} left|hat{y}lright|} sum{l in L} left|hat{y}_lright| R(y_l, hat{y}_l)$ $frac{1}{sum_{l in L} left|hat{y}lright|} sum{l in L} left|hat{y}lright| Fbeta(y_l, hat{y}_l)$
    None $langle P(y_l, hat{y}_l) | l in L rangle$ $langle R(y_l, hat{y}_l) | l in L rangle$ $langle F_beta(y_l, hat{y}_l) | l in L rangle$
    >>> from sklearn import metrics
    >>> y_true = [0, 1, 2, 0, 1, 2]
    >>> y_pred = [0, 2, 1, 0, 0, 1]
    >>> metrics.precision_score(y_true, y_pred, average='macro')
    0.22...
    >>> metrics.recall_score(y_true, y_pred, average='micro')
    0.33...
    >>> metrics.f1_score(y_true, y_pred, average='weighted')
    0.26...
    >>> metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5)
    0.23...
    >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None)
    (array([0.66..., 0.        , 0.        ]), array([1., 0., 0.]), array([0.71..., 0.        , 0.        ]), array([2, 2, 2]...))
    

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

    >>> metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro')
    ... # excluding 0, no labels were correctly recalled
    0.0

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

    >>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro')
    0.166...

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

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

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

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

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

    >>> import numpy as np
    >>> from sklearn.metrics import jaccard_score
    >>> y_true = np.array([[0, 1, 1],
    ...                    [1, 1, 0]])
    >>> y_pred = np.array([[1, 1, 1],
    ...                    [1, 0, 0]])
    >>> jaccard_score(y_true[0], y_pred[0])
    0.6666...

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

    >>> jaccard_score(y_true, y_pred, average='samples')
    0.5833...
    >>> jaccard_score(y_true, y_pred, average='macro')
    0.6666...
    >>> jaccard_score(y_true, y_pred, average=None)
    array([0.5, 0.5, 1. ])

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

    >>> y_pred = [0, 2, 1, 2]
    >>> y_true = [0, 1, 2, 2]
    >>> jaccard_score(y_true, y_pred, average=None)
    array([1. , 0. , 0.33...])
    >>> jaccard_score(y_true, y_pred, average='macro')
    0.44...
    >>> jaccard_score(y_true, y_pred, average='micro')
    0.33...

    3.3.2.11. Петля лосс

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

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

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

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

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

    >>> from sklearn import svm
    >>> from sklearn.metrics import hinge_loss
    >>> X = [[0], [1]]
    >>> y = [-1, 1]
    >>> est = svm.LinearSVC(random_state=0)
    >>> est.fit(X, y)
    LinearSVC(random_state=0)
    >>> pred_decision = est.decision_function([[-2], [3], [0.5]])
    >>> pred_decision
    array([-2.18...,  2.36...,  0.09...])
    >>> hinge_loss([-1, 1, 1], pred_decision)
    0.3...

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

    >>> X = np.array([[0], [1], [2], [3]])
    >>> Y = np.array([0, 1, 2, 3])
    >>> labels = np.array([0, 1, 2, 3])
    >>> est = svm.LinearSVC()
    >>> est.fit(X, Y)
    LinearSVC()
    >>> pred_decision = est.decision_function([[-1], [2], [3]])
    >>> y_true = [0, 2, 3]
    >>> hinge_loss(y_true, pred_decision, labels)
    0.56...

    3.3.2.12. Лог лосс

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

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

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

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

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

    >>> from sklearn.metrics import log_loss
    >>> y_true = [0, 0, 1, 1]
    >>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]
    >>> log_loss(y_true, y_pred)
    0.1738...

    Первое [.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{tp times tn — fp times fn}{sqrt{(tp + fp)(tp + fn)(tn + fp)(tn + fn)}}.$$

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

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

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

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

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

    >>> from sklearn.metrics import matthews_corrcoef
    >>> y_true = [+1, +1, +1, -1]
    >>> y_pred = [+1, -1, +1, +1]
    >>> matthews_corrcoef(y_true, y_pred)
    -0.33...

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

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

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

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

    >>> import numpy as np
    >>> from sklearn.metrics import multilabel_confusion_matrix
    >>> y_true = np.array([[1, 0, 1],
    ...                    [0, 1, 0]])
    >>> y_pred = np.array([[1, 0, 0],
    ...                    [0, 1, 1]])
    >>> multilabel_confusion_matrix(y_true, y_pred)
    array([[[1, 0],
            [0, 1]],
    
           [[1, 0],
            [0, 1]],
    
           [[0, 1],
            [1, 0]]])

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

    >>> multilabel_confusion_matrix(y_true, y_pred, samplewise=True)
    array([[[1, 0],
            [1, 1]],
    
           [[1, 1],
            [0, 1]]])

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

    >>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
    >>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
    >>> multilabel_confusion_matrix(y_true, y_pred,
    ...                             labels=["ant", "bird", "cat"])
    array([[[3, 1],
            [0, 2]],
    
           [[5, 0],
            [1, 0]],
    
           [[2, 1],
            [1, 2]]])

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

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

    >>> y_true = np.array([[0, 0, 1],
    ...                    [0, 1, 0],
    ...                    [1, 1, 0]])
    >>> y_pred = np.array([[0, 1, 0],
    ...                    [0, 0, 1],
    ...                    [1, 1, 0]])
    >>> mcm = multilabel_confusion_matrix(y_true, y_pred)
    >>> tn = mcm[:, 0, 0]
    >>> tp = mcm[:, 1, 1]
    >>> fn = mcm[:, 1, 0]
    >>> fp = mcm[:, 0, 1]
    >>> tp / (tp + fn)
    array([1. , 0.5, 0. ])

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

    >>> tn / (tn + fp)
    array([1. , 0. , 0.5])

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

    >>> fp / (fp + tn)
    array([0. , 1. , 0.5])

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

    >>> fn / (fn + tp)
    array([0. , 0.5, 1. ])

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

    Функция roc_curve вычисляет рабочую характеристическую кривую приемника или кривую ROC . Цитата из Википедии:

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

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

    >>> import numpy as np
    >>> from sklearn.metrics import roc_curve
    >>> y = np.array([1, 1, 2, 2])
    >>> scores = np.array([0.1, 0.4, 0.35, 0.8])
    >>> fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
    >>> fpr
    array([0. , 0. , 0.5, 0.5, 1. ])
    >>> tpr
    array([0. , 0.5, 0.5, 1. , 1. ])
    >>> thresholds
    array([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])

    На этом рисунке показан пример такой кривой 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,).

    >>> from sklearn.datasets import load_breast_cancer
    >>> from sklearn.linear_model import LogisticRegression
    >>> from sklearn.metrics import roc_auc_score
    >>> X, y = load_breast_cancer(return_X_y=True)
    >>> clf = LogisticRegression(solver="liblinear").fit(X, y)
    >>> clf.classes_
    array([0, 1])

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

    >>> y_score = clf.predict_proba(X)[:, 1]
    >>> roc_auc_score(y, y_score)
    0.99...

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

    >>> roc_auc_score(y, clf.decision_function(X))
    0.99...

    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}{c(c-1)}sum_{j=1}^{c}sum_{k > j}^c (text{AUC}(j | k) + text{AUC}(k | j))$$

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

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

    >>> from sklearn.datasets import make_multilabel_classification
    >>> from sklearn.multioutput import MultiOutputClassifier
    >>> X, y = make_multilabel_classification(random_state=0)
    >>> inner_clf = LogisticRegression(solver="liblinear", random_state=0)
    >>> clf = MultiOutputClassifier(inner_clf).fit(X, y)
    >>> y_score = np.transpose([y_pred[:, 1] for y_pred in clf.predict_proba(X)])
    >>> roc_auc_score(y, y_score, average=None)
    array([0.82..., 0.86..., 0.94..., 0.85... , 0.94...])

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

    >>> from sklearn.linear_model import RidgeClassifierCV
    >>> clf = RidgeClassifierCV().fit(X, y)
    >>> y_score = clf.decision_function(X)
    >>> roc_auc_score(y, y_score, average=None)
    array([0.81..., 0.84... , 0.93..., 0.87..., 0.94...])

    Примеры:

    • См. В разделе « Рабочие характеристики приемника» (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_{samples}$. По умолчанию функция нормализуется по выборке. Чтобы получить сумму $L_{0−1}$, установите normalize значение False.

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

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

    где $1(x)$- индикаторная функция.

    >>> from sklearn.metrics import zero_one_loss
    >>> y_pred = [1, 2, 3, 4]
    >>> y_true = [2, 2, 3, 4]
    >>> zero_one_loss(y_true, y_pred)
    0.25
    >>> zero_one_loss(y_true, y_pred, normalize=False)
    1

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

    >>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))
    0.5
    
    >>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)),  normalize=False)
    1

    Пример:

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

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

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

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

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

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

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

    >>> import numpy as np
    >>> from sklearn.metrics import brier_score_loss
    >>> y_true = np.array([0, 1, 1, 0])
    >>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"])
    >>> y_prob = np.array([0.1, 0.9, 0.8, 0.4])
    >>> y_pred = np.array([0, 1, 1, 0])
    >>> brier_score_loss(y_true, y_prob)
    0.055
    >>> brier_score_loss(y_true, 1 - y_prob, pos_label=0)
    0.055
    >>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham")
    0.055
    >>> brier_score_loss(y_true, y_prob > 0.5)
    0.0

    Балл Бриера можно использовать для оценки того, насколько хорошо откалиброван классификатор. Однако меньшая потеря по шкале Бриера не всегда означает лучшую калибровку. Это связано с тем, что по аналогии с разложением среднеквадратичной ошибки на дисперсию смещения потеря оценки по Бриеру может быть разложена как сумма потерь калибровки и потерь при уточнении [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}^{n_text{samples} times n_text{labels}}$ и оценка, связанная с каждой меткой $hat{f} in mathbb{R}^{n_text{samples} times n_text{labels}}$ покрытие определяется как
    $$coverage(y, hat{f}) = frac{1}{n_{text{samples}}} sum_{i=0}^{n_{text{samples}} — 1} max_{j:y_{ij} = 1} text{rank}_{ij}$$

    с участием $text{rank}{ij} = left|left{k: hat{f}{ik} geq hat{f}_{ij} right}right|$. Учитывая определение ранга, связи y_scores разрываются путем присвоения максимального ранга, который был бы присвоен всем связанным значениям.

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

    >>> import numpy as np
    >>> from sklearn.metrics import coverage_error
    >>> y_true = np.array([[1, 0, 0], [0, 0, 1]])
    >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])
    >>> coverage_error(y_true, y_score)
    2.5

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

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

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

    Формально, учитывая двоичную индикаторную матрицу наземных меток истинности $y in left{0, 1right}^{n_text{samples} times n_text{labels}}$ и оценка, связанная с каждой меткой $hat{f} in mathbb{R}^{n_text{samples} times n_text{labels}}$, средняя точность определяется как
    $$LRAP(y, hat{f}) = frac{1}{n_{text{samples}}} sum_{i=0}^{n_{text{samples}} — 1} frac{1}{||y_i||0} sum{j:y_{ij} = 1} frac{|mathcal{L}{ij}|}{text{rank}{ij}}$$

    где $mathcal{L}{ij} = left{k: y{ik} = 1, hat{f}{ik} geq hat{f}{ij} right}$, $text{rank}{ij} = left|left{k: hat{f}{ik} geq hat{f}_{ij} right}right|$, |cdot| вычисляет мощность набора (т. е. количество элементов в наборе), и $||cdot||_0$ это $ell_0$ «Norm» (который вычисляет количество ненулевых элементов в векторе).

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

    >>> import numpy as np
    >>> from sklearn.metrics import label_ranking_average_precision_score
    >>> y_true = np.array([[1, 0, 0], [0, 0, 1]])
    >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])
    >>> label_ranking_average_precision_score(y_true, y_score)
    0.416...

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

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

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

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

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

    >>> import numpy as np
    >>> from sklearn.metrics import label_ranking_loss
    >>> y_true = np.array([[1, 0, 0], [0, 0, 1]])
    >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])
    >>> label_ranking_loss(y_true, y_score)
    0.75...
    >>> # With the following prediction, we have perfect and minimal loss
    >>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]])
    >>> label_ranking_loss(y_true, y_score)
    0.0

    Рекомендации:

    • Цумакас, Г., Катакис, И., и Влахавас, И. (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{y}$, что индуцирует функцию ранжирования $f$, оценка DCG составляет
    $$sum_{r=1}^{min(K, M)}frac{y_{f(r)}}{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. Оценка объясненной дисперсии

    explained_variance_score вычисляет объясненной дисперсии регрессии балл.

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

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

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

    >>> from sklearn.metrics import explained_variance_score
    >>> y_true = [3, -0.5, 2, 7]
    >>> y_pred = [2.5, 0.0, 2, 8]
    >>> explained_variance_score(y_true, y_pred)
    0.957...
    >>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
    >>> y_pred = [[0, 2], [-1, 2], [8, -5]]
    >>> explained_variance_score(y_true, y_pred, multioutput='raw_values')
    array([0.967..., 1.        ])
    >>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7])
    0.990...

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

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

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

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

    >>> from sklearn.metrics import max_error
    >>> y_true = [3, 2, 7, 1]
    >>> y_pred = [9, 2, 7, 1]
    >>> max_error(y_true, y_pred)
    6

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

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

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

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

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

    >>> from sklearn.metrics import mean_absolute_error
    >>> y_true = [3, -0.5, 2, 7]
    >>> y_pred = [2.5, 0.0, 2, 8]
    >>> mean_absolute_error(y_true, y_pred)
    0.5
    >>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
    >>> y_pred = [[0, 2], [-1, 2], [8, -5]]
    >>> mean_absolute_error(y_true, y_pred)
    0.75
    >>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')
    array([0.5, 1. ])
    >>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])
    0.85...

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

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

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

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

    >>> from sklearn.metrics import mean_squared_error
    >>> y_true = [3, -0.5, 2, 7]
    >>> y_pred = [2.5, 0.0, 2, 8]
    >>> mean_squared_error(y_true, y_pred)
    0.375
    >>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
    >>> y_pred = [[0, 2], [-1, 2], [8, -5]]
    >>> mean_squared_error(y_true, y_pred)
    0.7083...

    Примеры:

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

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

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

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

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

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

    >>> from sklearn.metrics import mean_squared_log_error
    >>> y_true = [3, 5, 2.5, 7]
    >>> y_pred = [2.5, 5, 4, 8]
    >>> mean_squared_log_error(y_true, y_pred)
    0.039...
    >>> y_true = [[0.5, 1], [1, 2], [7, 6]]
    >>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]]
    >>> mean_squared_log_error(y_true, y_pred)
    0.044...

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

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

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

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

    В функции mean_absolute_percentage_error опоры multioutput.

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

    >>> from sklearn.metrics import mean_absolute_percentage_error
    >>> y_true = [1, 10, 1e6]
    >>> y_pred = [0.9, 15, 1.2e6]
    >>> mean_absolute_percentage_error(y_true, y_pred)
    0.2666...

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

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

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

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

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

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

    >>> from sklearn.metrics import median_absolute_error
    >>> y_true = [3, -0.5, 2, 7]
    >>> y_pred = [2.5, 0.0, 2, 8]
    >>> median_absolute_error(y_true, y_pred)
    0.5

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

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

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

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

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

    где $bar{y} = frac{1}{n} sum_{i=1}^{n} y_i$ и $sum_{i=1}^{n} (y_i — hat{y}i)^2 = sum{i=1}^{n} epsilon_i^2$.

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

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

    >>> from sklearn.metrics import r2_score
    >>> y_true = [3, -0.5, 2, 7]
    >>> y_pred = [2.5, 0.0, 2, 8]
    >>> r2_score(y_true, y_pred)
    0.948...
    >>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
    >>> y_pred = [[0, 2], [-1, 2], [8, -5]]
    >>> r2_score(y_true, y_pred, multioutput='variance_weighted')
    0.938...
    >>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
    >>> y_pred = [[0, 2], [-1, 2], [8, -5]]
    >>> r2_score(y_true, y_pred, multioutput='uniform_average')
    0.936...
    >>> r2_score(y_true, y_pred, multioutput='raw_values')
    array([0.965..., 0.908...])
    >>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7])
    0.925...

    Пример:

    • См. В разделе « Лассо и эластичная сеть для разреженных сигналов» приведен пример использования показателя 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{y}_i$ прогнозируемое значение $i$-й образец и $y_i$ — соответствующее истинное значение, тогда средняя ошибка отклонения Твиди (D) для мощности $p$, оценивается более $n_{samples}$ определяется как

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

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

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

    >>> from sklearn.metrics import mean_tweedie_deviance
    >>> mean_tweedie_deviance([1.0], [1.5], power=0)
    0.25
    >>> mean_tweedie_deviance([100.], [150.], power=0)
    2500.0

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

    >>> mean_tweedie_deviance([1.0], [1.5], power=1)
    0.18...
    >>> mean_tweedie_deviance([100.], [150.], power=1)
    18.9...

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

    >>> mean_tweedie_deviance([1.0], [1.5], power=2)
    0.14...
    >>> mean_tweedie_deviance([100.], [150.], power=2)
    0.14...

    мы получим идентичные ошибки. Таким образом, отклонение 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 сначала создадим несбалансированный набор данных:

    >>> from sklearn.datasets import load_iris
    >>> from sklearn.model_selection import train_test_split
    >>> X, y = load_iris(return_X_y=True)
    >>> y[y != 1] = -1
    >>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

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

    >>> from sklearn.dummy import DummyClassifier
    >>> from sklearn.svm import SVC
    >>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.63...
    >>> clf = DummyClassifier(strategy='most_frequent', random_state=0)
    >>> clf.fit(X_train, y_train)
    DummyClassifier(random_state=0, strategy='most_frequent')
    >>> clf.score(X_test, y_test)
    0.57...

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

    >>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train)
    >>> clf.score(X_test, y_test)
    0.94...

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

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

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

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

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

    What is RMSE? Also known as MSE, RMD, or RMS. What problem does it solve?

    If you understand RMSE: (Root mean squared error), MSE: (Mean Squared Error) RMD (Root mean squared deviation) and RMS: (Root Mean Squared), then asking for a library to calculate this for you is unnecessary over-engineering. All these can be intuitively written in a single line of code. rmse, mse, rmd, and rms are different names for the same thing.

    RMSE answers: «How similar, on average, are the numbers in list1 to list2?». The two lists must be the same size. Wash out the noise between any two given elements, wash out the size of the data collected, and get a single number result».

    Intuition and ELI5 for RMSE. What problem does it solve?:

    Imagine you are learning to throw darts at a dart board. Every day you practice for one hour. You want to figure out if you are getting better or getting worse. So every day you make 10 throws and measure the distance between the bullseye and where your dart hit.

    You make a list of those numbers list1. Use the root mean squared error between the distances at day 1 and a list2 containing all zeros. Do the same on the 2nd and nth days. What you will get is a single number that hopefully decreases over time. When your RMSE number is zero, you hit bullseyes every time. If the rmse number goes up, you are getting worse.

    Example in calculating root mean squared error in python:

    import numpy as np
    d = [0.000, 0.166, 0.333]   #ideal target distances, these can be all zeros.
    p = [0.000, 0.254, 0.998]   #your performance goes here
    
    print("d is: " + str(["%.8f" % elem for elem in d]))
    print("p is: " + str(["%.8f" % elem for elem in p]))
    
    def rmse(predictions, targets):
        return np.sqrt(((predictions - targets) ** 2).mean())
    
    rmse_val = rmse(np.array(d), np.array(p))
    print("rms error is: " + str(rmse_val))
    

    Which prints:

    d is: ['0.00000000', '0.16600000', '0.33300000']
    p is: ['0.00000000', '0.25400000', '0.99800000']
    rms error between lists d and p is: 0.387284994115
    

    The mathematical notation:

    root mean squared deviation explained

    Glyph Legend: n is a whole positive integer representing the number of throws. i represents a whole positive integer counter that enumerates sum. d stands for the ideal distances, the list2 containing all zeros in above example. p stands for performance, the list1 in the above example. superscript 2 stands for numeric squared. di is the i’th index of d. pi is the i’th index of p.

    The rmse done in small steps so it can be understood:

    def rmse(predictions, targets):
    
        differences = predictions - targets                       #the DIFFERENCEs.
    
        differences_squared = differences ** 2                    #the SQUAREs of ^
    
        mean_of_differences_squared = differences_squared.mean()  #the MEAN of ^
    
        rmse_val = np.sqrt(mean_of_differences_squared)           #ROOT of ^
    
        return rmse_val                                           #get the ^
    

    How does every step of RMSE work:

    Subtracting one number from another gives you the distance between them.

    8 - 5 = 3         #absolute distance between 8 and 5 is +3
    -20 - 10 = -30    #absolute distance between -20 and 10 is +30
    

    If you multiply any number times itself, the result is always positive because negative times negative is positive:

    3*3     = 9   = positive
    -30*-30 = 900 = positive
    

    Add them all up, but wait, then an array with many elements would have a larger error than a small array, so average them by the number of elements.

    But we squared them all earlier, to force them positive. Undo that damage with a square root.

    That leaves you with a single number that represents, on average, the distance between every value of list1 to it’s corresponding element value of list2.

    If the RMSE value goes down over time we are happy because variance is decreasing. «Shrinking the Variance» here is a primitive kind of machine learning algorithm.

    RMSE isn’t the most accurate line fitting strategy, total least squares is:

    Root mean squared error measures the vertical distance between the point and the line, so if your data is shaped like a banana, flat near the bottom and steep near the top, then the RMSE will report greater distances to points high, but short distances to points low when in fact the distances are equivalent. This causes a skew where the line prefers to be closer to points high than low.

    If this is a problem the total least squares method fixes this:
    https://mubaris.com/posts/linear-regression

    Gotchas that can break this RMSE function:

    If there are nulls or infinity in either input list, then output rmse value is is going to not make sense. There are three strategies to deal with nulls / missing values / infinities in either list: Ignore that component, zero it out or add a best guess or a uniform random noise to all timesteps. Each remedy has its pros and cons depending on what your data means. In general ignoring any component with a missing value is preferred, but this biases the RMSE toward zero making you think performance has improved when it really hasn’t. Adding random noise on a best guess could be preferred if there are lots of missing values.

    In order to guarantee relative correctness of the RMSE output, you must eliminate all nulls/infinites from the input.

    RMSE has zero tolerance for outlier data points which don’t belong

    Root mean squared error squares relies on all data being right and all are counted as equal. That means one stray point that’s way out in left field is going to totally ruin the whole calculation. To handle outlier data points and dismiss their tremendous influence after a certain threshold, see Robust estimators that build in a threshold for dismissal of outliers as extreme rare events that don’t need their outlandish results to change our behavior.

    y = [11,20,19,17,10]

    y_bar = [12,18,19.5,18,9]

    summation = 0 #variable to store the summation of differences

    n = len(y) #finding total number of items in list

    for i in range (0,n): #looping through each element of the list

    difference = y[i] - y_bar[i] #finding the difference between observed and predicted value

    squared_difference = difference**2 #taking square of the differene

    summation = summation + squared_difference #taking a sum of all the differences

    MSE = summation/n #dividing summation by total values to obtain average

    print "The Mean Square Error is: " , MSE

    Понравилась статья? Поделить с друзьями:
  • Квадратическая ошибка среднего арифметического формула
  • Квадрат ошибки прогноза
  • Квадрат абсолютной ошибки измерения смещения маятника
  • Ква 6 кондиционер для локомотивов ошибка f1
  • Кбм ошибка как исправить