# Функции потерь в Python — простая реализация

![water\_loss\_spin\_compressed-2](https://github.com/UzunDemir/uzundemir.github.io/assets/94790150/676855f4-9ea9-44d9-9cdd-ce032c523a82)

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

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

В этом уроке будут рассмотрены следующие четыре функции потерь.

* [Среднеквадратическая ошибка](#id-1-srednekvadraticheskaya-oshibka-mse)
* [Корень средней квадратической ошибки](#id-2-srednekvadraticheskaya-oshibka-rmse)
* [Средняя абсолютная ошибка](#id-3-srednyaya-absolyutnaya-oshibka-mae)
* [Кросс-энтропийные потери](#id-4-funkciya-kross-entropiinoi-poteri-v-python)

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

### Реализация функций потерь в Python <a href="#realizaciya-funkcii-poter-v-python" id="realizaciya-funkcii-poter-v-python"></a>

### 1. Среднеквадратическая ошибка (MSE) — Mean Squared Error <a href="#id-1-srednekvadraticheskaya-oshibka-mse" id="id-1-srednekvadraticheskaya-oshibka-mse"></a>

Среднеквадратичная ошибка (MSE) рассчитывается как среднее значение квадратов разностей между прогнозируемыми и фактически наблюдаемыми значениями. Математически это можно выразить следующим образом:

Реализация MSE на языке Python выглядит следующим образом:

{% tabs %}
{% tab title="Код" %}
```python
import numpy as np

def mean_squared_error(act, pred):
   # Вычисляем разницу между предсказанными и фактическими значениями
   diff = pred - act
   
   # Возводим каждую разницу в квадрат
   differences_squared = diff ** 2
   
   # Вычисляем среднее значение квадратов разниц
   mean_diff = differences_squared.mean()
   
   # Возвращаем среднюю квадратичную ошибку
   return mean_diff

# Массив фактических значений
act = np.array([1.1,2,1.7])

# Массив предсказанных значений
pred = np.array([1,1.7,1.5])

# Выводим среднюю квадратичную ошибку между фактическими и предсказанными значениями
print(mean_squared_error(act, pred))

```
{% endtab %}

{% tab title="Результат выполениея" %}
```
0.04666666666666667
```
{% endtab %}
{% endtabs %}

Вы также можете использовать mean\_squared\_error из sklearn для расчета MSE. Вот как работает функция:

{% tabs %}
{% tab title="Код" %}
```python
from sklearn.metrics import mean_squared_error
import numpy as np

# Массив фактических значений
act = np.array([1.1, 2, 1.7])

# Массив предсказанных значений
pred = np.array([1, 1.7, 1.5])

# Вычисляем среднюю квадратичную ошибку между фактическими и предсказанными значениями
mse = mean_squared_error(act, pred)

# Выводим среднюю квадратичную ошибку
print(mse)
```
{% endtab %}

{% tab title="Результат выполениея" %}
```
0.04666666666666667
```
{% endtab %}
{% endtabs %}

### 2. Корень средней квадратической ошибки (RMSE) — Root Mean Squared Error <a href="#id-2-srednekvadraticheskaya-oshibka-rmse" id="id-2-srednekvadraticheskaya-oshibka-rmse"></a>

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

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

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

Среднеквадратическая ошибка (RMSE) рассчитывается как квадратный корень из среднеквадратичной ошибки. Математически мы можем представить это следующим образом:

Реализация Python для RMSE выглядит следующим образом:

{% tabs %}
{% tab title="Код" %}
```python
import numpy as np

def root_mean_squared_error(act, pred):
   # Вычисляем разницу между предсказанными и фактическими значениями
   diff = pred - act
   
   # Возводим каждую разницу в квадрат
   differences_squared = diff ** 2
   
   # Вычисляем среднее значение квадратов разниц
   mean_diff = differences_squared.mean()
   
   # Вычисляем квадратный корень из среднего значения квадратов разниц
   rmse_val = np.sqrt(mean_diff)
   
   # Возвращаем корень средней квадратичной ошибки
   return rmse_val

# Массив фактических значений
act = np.array([1.1, 2, 1.7])

# Массив предсказанных значений
pred = np.array([1, 1.7, 1.5])

# Выводим корень средней квадратичной ошибки между фактическими и предсказанными значениями
print(root_mean_squared_error(act, pred))
```
{% endtab %}

{% tab title="Результат выполениея" %}
```
0.21602468994692867
```
{% endtab %}
{% endtabs %}

Вы также можете использовать **mean\_squared\_error** из <mark style="color:blue;">**sklearn**</mark> для расчета **RMSE**. Давайте посмотрим, как реализовать RMSE, используя ту же функцию:

{% tabs %}
{% tab title="Код" %}
```python
from sklearn.metrics import mean_squared_error
import numpy as np

# Массив фактических значений
act = np.array([1.1, 2, 1.7])

# Массив предсказанных значений
pred = np.array([1, 1.7, 1.5])

# Вычисляем корень средней квадратичной ошибки (RMSE) между фактическими и предсказанными значениями
# Если параметр squared установлен в False, функция возвращает значение RMSE
rmse = mean_squared_error(act, pred, squared=False)

# Выводим корень средней квадратичной ошибки
print(rmse)

```
{% endtab %}

{% tab title="Результат выполениея" %}
```
0.21602468994692867
```
{% endtab %}
{% endtabs %}

Если для параметра squared установлено значение <mark style="color:purple;">**True**</mark>, функция возвращает значение MSE. Если установлено значение <mark style="color:purple;">**False**</mark>, функция возвращает значение **RMSE**.

### 3. Средняя абсолютная ошибка (MAE) — Mean Absolute Error <a href="#id-3-srednyaya-absolyutnaya-oshibka-mae" id="id-3-srednyaya-absolyutnaya-oshibka-mae"></a>

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

Реализация Python для MAE выглядит следующим образом:

{% tabs %}
{% tab title="Код" %}
```python
import numpy as np

def mean_absolute_error(act, pred):
    # Вычисляем разницу между предсказанными и фактическими значениями
    diff = pred - act
    
    # Вычисляем абсолютные значения разниц
    abs_diff = np.absolute(diff)
    
    # Вычисляем среднее значение абсолютных разниц
    mean_diff = abs_diff.mean()
    
    # Возвращаем среднюю абсолютную ошибку
    return mean_diff

# Массив фактических значений
act = np.array([1.1, 2, 1.7])

# Массив предсказанных значений
pred = np.array([1, 1.7, 1.5])

# Вычисляем и выводим среднюю абсолютную ошибку между фактическими и предсказанными значениями
print(mean_absolute_error(act, pred))
```
{% endtab %}

{% tab title="Результат выаолнения" %}
```
0.20000000000000004
```
{% endtab %}
{% endtabs %}

Вы также можете использовать mean\_absolute\_error из sklearn для расчета MAE.

{% tabs %}
{% tab title="Код" %}
```python
from sklearn.metrics import mean_absolute_error
import numpy as np

# Массив фактических значений
act = np.array([1.1, 2, 1.7])

# Массив предсказанных значений
pred = np.array([1, 1.7, 1.5])

# Вычисляем среднюю абсолютную ошибку между фактическими и предсказанными значениями
mae = mean_absolute_error(act, pred)

# Выводим среднюю абсолютную ошибку
print(mae)
```
{% endtab %}

{% tab title="Результат выполнения" %}
```
0.20000000000000004
```
{% endtab %}
{% endtabs %}

### 4. Функция кросс-энтропийной потери в Python <a href="#id-4-funkciya-kross-entropiinoi-poteri-v-python" id="id-4-funkciya-kross-entropiinoi-poteri-v-python"></a>

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

Давайте посмотрим, как вычислить ошибку в случае проблемы бинарной классификации.

Давайте рассмотрим проблему классификации, когда модель пытается провести классификацию между собакой и кошкой.

Код Python для поиска ошибки приведен ниже.

{% tabs %}
{% tab title="Код" %}
```python
from sklearn.metrics import log_loss

# Массив фактических классов
true_classes = ["Dog", "Cat", "Cat", "Dog"]

# Массив предсказанных вероятностей для каждого класса
predicted_probabilities = [[.1, .9], [.9, .1], [.8, .2], [.35, .65]]

# Вычисляем логарифмическую потерю (log loss) между фактическими классами и предсказанными вероятностями
log_loss_value = log_loss(true_classes, predicted_probabilities)

# Выводим значение логарифмической потери
print(log_loss_value)
```
{% endtab %}

{% tab title="Результат выполнения" %}
```
0.21616187468057912
```
{% endtab %}
{% endtabs %}

Мы используем метод log\_loss из sklearn.

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

Вероятности представлены в следующем формате:

```python
[P(dog), P(cat)]
```

### Заключение <a href="#zaklyuchenie" id="zaklyuchenie"></a>

Это руководство было посвящено функциям потерь в Python. Мы рассмотрели различные функции потерь как для задач регрессии, так и для задач классификации.&#x20;
