реклама
Бургер менюБургер меню

Джеймс Дэвис – Нейросети: создание и оптимизация будущего (страница 13)

18

Давайте рассмотрим пример кода, иллюстрирующий этапы подготовки данных, включая преобразование, нормализацию, разделение на тренировочные и тестовые наборы, а также кросс-валидацию. Для примера используем набор данных `Iris` из библиотеки `scikit-learn`.

Подготовка данных

1. Загрузка данных: используем датасет `Iris` и обрабатываем данные.

2. Обработка пропусков: Заменяем пропущенные значения на медианные.

3. Кодирование категориальных переменных: Кодируем целевой признак.

4. Нормализация данных: Применим Min-Max нормализацию.

5. Разделение на тренировочные и тестовые наборы: Разделяем данные для оценки.

6. Кросс-валидация: Применим k-fold кросс-валидацию.

Пример кода

```python

import numpy as np

import pandas as pd

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, KFold, cross_val_score

from sklearn.preprocessing import MinMaxScaler, StandardScaler, LabelEncoder

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import accuracy_score

# Шаг 1: Загрузка и подготовка данных

data = load_iris()

df = pd.DataFrame(data.data, columns=data.feature_names)

df['target'] = data.target

# Шаг 2: Обработка пропущенных данных (для примера добавим пропуски)

df.iloc[0, 0] = np.nan # добавляем пропущенное значение для примера

df.fillna(df.median(), inplace=True) # заполняем медианными значениями

# Шаг 3: Кодирование категориального признака (в данном случае уже числовой)

# Для других данных LabelEncoder может быть полезен

# Шаг 4: Нормализация данных

scaler = MinMaxScaler()

df[data.feature_names] = scaler.fit_transform(df[data.feature_names])

# Шаг 5: Разделение данных на тренировочные и тестовые наборы

X = df.drop('target', axis=1)

y = df['target']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Шаг 6: Обучение модели и оценка

model = RandomForestClassifier(random_state=42)

model.fit(X_train, y_train)

predictions = model.predict(X_test)

accuracy = accuracy_score(y_test, predictions)

print(f'Точность на тестовом наборе: {accuracy:.2f}')

# Шаг 7: Кросс-валидация

kf = KFold(n_splits=5, shuffle=True, random_state=42)

cv_scores = cross_val_score(model, X, y, cv=kf)

print(f'Средняя точность при кросс-валидации: {cv_scores.mean():.2f}')

```

Описание кода

– Загрузка данных: Набор данных `Iris` предоставляет четыре признака и один целевой признак – вид цветка.

– Обработка пропусков: Пример добавляет пропущенные значения в первый признак и затем заменяет их на медианное значение по этому признаку.

– Кодирование категориальных переменных: `LabelEncoder` может использоваться для преобразования категорий в числовой формат (не требуется в этом наборе данных).

– Нормализация данных: Min-Max нормализация применяется ко всем признакам, чтобы привести их к диапазону [0, 1]. Это улучшает процесс обучения, делая данные более однородными.

– Разделение данных: Данные разделяются на тренировочные и тестовые наборы в пропорции 70:30, чтобы обеспечить независимую проверку модели.

– Кросс-валидация: k-fold кросс-валидация (здесь с k=5) обеспечивает усреднённую оценку точности модели, разделяя данные на 5 подмножества и обучая модель на каждом из них, улучшая общую надёжность оценки.

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

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

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

Шаги обратного распространения: от выходного к входному слою

Вычисление ошибки на выходном слое

Чтобы улучшить работу нейронной сети, на первом шаге мы оцениваем, насколько её предсказания отличаются от реальных значений. Эта оценка выражается через ошибку – разницу между тем, что сеть предсказала, и тем, что должно было быть. Ошибка показывает, насколько сильно сеть "промахнулась", и даёт основу для последующей корректировки её параметров.

Как оценивается ошибка?

1. Для числовых прогнозов (например, предсказание стоимости, температуры и т.п.):

Используется метод, который особенно "чувствителен" к большим отклонениям – он усиливает влияние значительных ошибок, так что сеть быстрее начнёт "учиться" их исправлять. Например, если сеть сильно ошибается в предсказании цены, ошибка будет большой, а это заставит сеть сильнее корректировать свои параметры в нужную сторону.

2. Для задач классификации (например, когда нужно определить класс: "кошки" или "собаки"):

Здесь используется другая стратегия, которая сосредотачивается на точности вероятностей. Если сеть уверена, что перед ней "кошка", но это не так, ошибка будет очень большой, поскольку ошибка для уверенного прогноза наказывается сильнее, чем для "неуверенного". Это помогает быстрее адаптировать сеть к верным ответам в задачах классификации, где важна не только верность предсказания, но и уверенность в нём.

Процесс расчёта ошибки

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

2. Вычисление градиентов на выходном слое