Files
IML_Assignments/Assignment2/Assignment2.ipynb
T
2025-04-13 22:12:27 +03:00

163 KiB

In [79]:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
import matplotlib.pyplot as plt

def task1_preprocessing() -> None:
    """
    Выполняет EDA и предобработку данных для прогнозирования сезонности на основе данных о потреблении энергии в Дании.
    """
    # 1. Загрузка данных
    try:
        data = pd.read_csv("dataset/opsd_raw.csv", parse_dates=["utc_timestamp"])
        print("Данные успешно загружены.")
    except FileNotFoundError:
        print("Ошибка: Файл dataset/opsd_raw.csv не найден.")
        return
    
    # 2. Выбор релевантных столбцов для Дании
    cols = [
        "utc_timestamp",
        "DK_load_actual_entsoe_transparency",
        "DK_wind_generation_actual", 
        "DK_solar_generation_actual"
    ]

    # Проверка наличия столбцов в данных
    missing_cols = [col for col in cols if col not in data.columns]
    if missing_cols:
        print(f"Ошибка: Отсутствуют столбцы {missing_cols} в данных.")
        return
    
    data = data[cols].copy()
    data.columns = ["timestamp", "load", "wind", "solar"]
    print("Выбраны релевантные столбцы для Дании.")
    
    # 3. Обработка пропущенных значений:
    # Удаляем строки, где есть хоть одно пропущенное значение
    data.dropna(inplace=True)
    print("Пропущенные значения обработаны (удалены строки с NaN).")

    # 4. Формирование массивов 24x3 (часы × признаки)
    data.set_index("timestamp", inplace=True)
    
    # Группируем по дням и оставляем только дни с ровно 24 записями
    daily_data = data.groupby(data.index.date).apply(
        lambda x: x[["load", "wind", "solar"]].values.T
        if len(x) == 24 else None
    )
    daily_data = daily_data.dropna()
    print("Сформированы массивы 24x3 (часы x признаки).")
    
    # Преобразуем индексы в формат datetime для дальнейшей работы
    daily_data.index = pd.to_datetime(daily_data.index)
    
    # 5. Создание DataFrame с массивами и метками сезонов
    df = pd.DataFrame({
        "timestamp": daily_data.index,
        "data": daily_data.values,
        "season": daily_data.index.map(lambda x: get_season(x.month))
    })
    print("Создан DataFrame с массивами и метками сезонов.")
    
    # 6. Разделение данных
    X = np.stack(df["data"].values)
    y = df["season"].values
    
    # Check for NaNs *before* train-test split
    if np.isnan(X).any() or not np.isfinite(X).all():
        print("Ошибка: X содержит NaN или бесконечные значения перед train-test split.")
        return
    
    # Encode labels
    label_encoder = LabelEncoder()
    y_encoded = label_encoder.fit_transform(y)
    print("Выполнено кодирование меток.")
    
    X_train, X_temp, y_train, y_temp = train_test_split(
        X, y_encoded, test_size=0.3, stratify=y_encoded, random_state=42
    )
    X_val, X_test, y_val, y_test = train_test_split(
        X_temp, y_temp, test_size=0.5, stratify=y_temp, random_state=42
    )
    print("Данные разделены на обучающий, валидационный и тестовый наборы.")
    
    # 7. Масштабирование
    scaler = StandardScaler()
    # Проверяем, что массивы не содержат NaN перед масштабированием
    if np.isnan(X_train).any() or not np.isfinite(X_train).all():
        print("Ошибка: X_train содержит NaN или бесконечные значения перед масштабированием.")
        return
    X_train_reshaped = X_train.reshape(-1, 3)
    X_train_scaled = scaler.fit_transform(X_train_reshaped).reshape(X_train.shape)
    
    if np.isnan(X_val).any() or not np.isfinite(X_val).all():
        print("Ошибка: X_val содержит NaN или бесконечные значения перед масштабированием.")
        return
    X_val_reshaped = X_val.reshape(-1, 3)
    X_val_scaled = scaler.transform(X_val_reshaped).reshape(X_val.shape)
    
    if np.isnan(X_test).any() or not np.isfinite(X_test).all():
        print("Ошибка: X_test содержит NaN или бесконечные значения перед масштабированием.")
        return
    X_test_reshaped = X_test.reshape(-1, 3)
    X_test_scaled = scaler.transform(X_test_reshaped).reshape(X_test.shape)
    print("Выполнено масштабирование данных.")
    
    # 8. Сохранение данных
    try:
        np.savez("processed_data.npz",
                X_train=X_train_scaled,
                X_val=X_val_scaled,
                X_test=X_test_scaled,
                y_train=y_train,
                y_val=y_val,
                y_test=y_test,
                classes=label_encoder.classes_,
                allow_pickle=True)
        print("Данные успешно сохранены в processed_data.npz")
    except Exception as e:
        print(f"Ошибка при сохранении данных: {e}")
        return
    
    # 9. Визуализация
    plot_sample_profiles(df)

def get_season(month: int) -> str:
    if month in [12, 1, 2]: return "winter"
    if month in [3, 4, 5]: return "spring"
    if month in [6, 7, 8]: return "summer"
    return "autumn"

def plot_sample_profiles(df: pd.DataFrame) -> None:
    plt.figure(figsize=(12, 6))
    for season in ["winter", "spring", "summer", "autumn"]:
        try:
            # Get the first day's data for the given season
            season_data = df[df["season"] == season].iloc[0]["data"]
            # Plotting only the 'load' data
            plt.plot(season_data[0], label=f"{season} load")
        except IndexError:
            print(f"Предупреждение: Нет данных для сезона {season} для построения графика.")
    plt.title("Суточные профили потребления энергии по сезонам")
    plt.xlabel("Час дня (0-23)")
    plt.ylabel("Мощность (МВт)")
    plt.legend()
    plt.grid(True)
    plt.savefig("load_profiles.png")
    plt.show()

# Запуск preprocessing
task1_preprocessing()
Данные успешно загружены.
Выбраны релевантные столбцы для Дании.
Пропущенные значения обработаны (удалены строки с NaN).
Сформированы массивы 24x3 (часы x признаки).
Создан DataFrame с массивами и метками сезонов.
Выполнено кодирование меток.
Данные разделены на обучающий, валидационный и тестовый наборы.
Выполнено масштабирование данных.
Данные успешно сохранены в processed_data.npz
In [80]:
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, classification_report
import warnings

def task2_mlp():
    """
    Строит и обучает многослойный перцептрон (MLP) для классификации сезонов.
    """
    warnings.filterwarnings("ignore")
    # 1. Загрузка данных
    try:
        data = np.load("processed_data.npz", allow_pickle=True)
        X_train, X_val, X_test = data["X_train"], data["X_val"], data["X_test"]
        y_train, y_val, y_test = data["y_train"], data["y_val"], data["y_test"]
        classes = data["classes"]
    except FileNotFoundError:
        print("Ошибка: Файл processed_data.npz не найден. Запустите task1_preprocessing() перед выполнением этой задачи.")
        return

    # 2. Определение модели
    mlp = MLPClassifier(max_iter=500, random_state=42)

    # 3. Настройка гиперпараметров с использованием GridSearchCV
    param_grid = {
        "hidden_layer_sizes": [(50,), (100,), (50, 50), (100, 100)],
        "activation": ["relu", "tanh"],
        "solver": ["adam", "sgd"],
        "alpha": [0.0001, 0.001],
    }
    grid_search = GridSearchCV(mlp, param_grid, cv=5, scoring="accuracy", n_jobs=-1)

    print("Запуск GridSearchCV...")
    grid_search.fit(X_train.reshape(X_train.shape[0], -1), y_train)

    # 4. Лучшая модель и её параметры
    best_model = grid_search.best_estimator_
    print("Лучшие параметры:", best_model.get_params)

    # 5. Оценка модели на тестовом наборе
    y_pred = best_model.predict(X_test.reshape(X_test.shape[0], -1))

    accuracy = accuracy_score(y_test, y_pred)
    print(f"Точность (Accuracy): {accuracy:.4f}")
    print(classification_report(y_test, y_pred, target_names=classes))

# Запуск обучения MLP
task2_mlp()
Запуск GridSearchCV...
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
/var/data/python/lib/python3.12/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(
Лучшие параметры: <bound method BaseEstimator.get_params of MLPClassifier(activation='tanh', hidden_layer_sizes=(50,), max_iter=500,
              random_state=42)>
Точность (Accuracy): 0.7587
              precision    recall  f1-score   support

      autumn       0.76      0.70      0.73        73
      spring       0.84      0.59      0.70        83
      summer       0.72      0.92      0.81        83
      winter       0.74      0.83      0.78        76

    accuracy                           0.76       315
   macro avg       0.77      0.76      0.75       315
weighted avg       0.77      0.76      0.75       315

In [81]:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import to_categorical
from sklearn.metrics import accuracy_score, classification_report

def task3_1d_cnn():
    """
    Строит и обучает одномерную сверточную нейронную сеть (1D CNN) для классификации сезонов.
    """
    # Загрузка предобработанных данных
    try:
        data = np.load("processed_data.npz", allow_pickle=True)
        X_train, X_val, X_test = data["X_train"], data["X_val"], data["X_test"]
        y_train, y_val, y_test = data["y_train"], data["y_val"], data["y_test"]
        classes = data["classes"]
    except FileNotFoundError:
        print("Ошибка: Файл processed_data.npz не найден. Запустите task1_preprocessing() перед выполнением этой задачи.")
        return
    
    num_classes = len(classes)
    y_train = to_categorical(y_train, num_classes)
    y_val = to_categorical(y_val, num_classes)
    y_test = to_categorical(y_test, num_classes)

    # strategy = tf.distribute.get_strategy()
    # with strategy.scope():

    # Построение модели 1D CNN
    model = Sequential([
        tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(24, 3)), # Corrected input shape
        tf.keras.layers.MaxPooling1D(pool_size=2),
        tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu'),
        tf.keras.layers.MaxPooling1D(pool_size=2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(num_classes, activation='softmax')
    ])
    # Компиляция модели
    model.compile(optimizer=Adam(learning_rate=0.001),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])

    # X_train = np.transpose(X_train, (0, 2, 1))
    # X_val = np.transpose(X_val, (0, 2, 1))
    # X_test = np.transpose(X_test, (0, 2, 1))

    # Обучение модели
    history = model.fit(X_train, y_train,
                        validation_data=(X_val, y_val),
                        epochs=50,
                        batch_size=32,
                        verbose=1)

    # Оценка модели на тестовом наборе
    y_pred = model.predict(X_test)
    y_pred_classes = np.argmax(y_pred, axis=1)
    y_test_classes = np.argmax(y_test, axis=1)

    # Вычисление метрик
    accuracy = accuracy_score(y_test_classes, y_pred_classes)
    print(f"Точность (Accuracy): {accuracy:.4f}")
    print(classification_report(y_test_classes, y_pred_classes, target_names=classes))

    # Сохранение модели
    model.save("1d_cnn_model.h5")

# Запуск обучения 1D CNN
task3_1d_cnn()
Epoch 1/50
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[81], line 76
     73     model.save("1d_cnn_model.h5")
     75 # Запуск обучения 1D CNN
---> 76 task3_1d_cnn()

Cell In[81], line 56, in task3_1d_cnn()
     47 model.compile(optimizer=Adam(learning_rate=0.001),
     48               loss='categorical_crossentropy',
     49               metrics=['accuracy'])
     51 # X_train = np.transpose(X_train, (0, 2, 1))
     52 # X_val = np.transpose(X_val, (0, 2, 1))
     53 # X_test = np.transpose(X_test, (0, 2, 1))
     54 
     55 # Обучение модели
---> 56 history = model.fit(X_train, y_train,
     57                     validation_data=(X_val, y_val),
     58                     epochs=50,
     59                     batch_size=32,
     60                     verbose=1)
     62 # Оценка модели на тестовом наборе
     63 y_pred = model.predict(X_test)

File /var/data/python/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:122, in filter_traceback.<locals>.error_handler(*args, **kwargs)
    119     filtered_tb = _process_traceback_frames(e.__traceback__)
    120     # To get the full stack trace, call:
    121     # `keras.config.disable_traceback_filtering()`
--> 122     raise e.with_traceback(filtered_tb) from None
    123 finally:
    124     del filtered_tb

File /var/data/python/lib/python3.12/site-packages/keras/src/layers/input_spec.py:227, in assert_input_compatibility(input_spec, inputs, layer_name)
    222     for axis, value in spec.axes.items():
    223         if value is not None and shape[axis] not in {
    224             value,
    225             None,
    226         }:
--> 227             raise ValueError(
    228                 f'Input {input_index} of layer "{layer_name}" is '
    229                 f"incompatible with the layer: expected axis {axis} "
    230                 f"of input shape to have value {value}, "
    231                 "but received input with "
    232                 f"shape {shape}"
    233             )
    234 # Check shape.
    235 if spec.shape is not None:

ValueError: Exception encountered when calling Sequential.call().

Input 0 of layer "conv1d_24" is incompatible with the layer: expected axis -1 of input shape to have value 3, but received input with shape (None, 3, 24)

Arguments received by Sequential.call():
  • inputs=tf.Tensor(shape=(None, 3, 24), dtype=float32)
  • training=True
  • mask=None