167 KiB
167 KiB
In [57]:
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"])
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"]
# 3. Обработка пропущенных значений:
# Удаляем строки, где есть хоть одно пропущенное значение
data.dropna(inplace=True)
# 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()
# Преобразуем индексы в формат 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))
})
# 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)
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
)
# 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)
# 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_encoded = df[df["season"] == season].iloc[0]["data"]
plt.plot(season_encoded[0], label=f"{season} load") # Plot the 'load' data
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()
Данные успешно сохранены в processed_data.npz
In [58]:
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"]
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("Лучшие параметры:", grid_search.best_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))
# Запуск обучения 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(
Лучшие параметры: {'activation': 'tanh', 'alpha': 0.0001, 'hidden_layer_sizes': (50,), 'solver': 'adam'}
Точность (Accuracy): 0.7587
precision recall f1-score support
0 0.76 0.70 0.73 73
1 0.84 0.59 0.70 83
2 0.72 0.92 0.81 83
3 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 [59]:
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)
# Построение модели 1D CNN
model = Sequential([
tf.keras.layers.Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(3, 24)), # 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()
[31m---------------------------------------------------------------------------[39m
[31mValueError[39m Traceback (most recent call last)
[36mCell[39m[36m [39m[32mIn[59][39m[32m, line 74[39m
[32m 71[39m model.save([33m"[39m[33m1d_cnn_model.h5[39m[33m"[39m)
[32m 73[39m [38;5;66;03m# Запуск обучения 1D CNN[39;00m
[32m---> [39m[32m74[39m [43mtask3_1d_cnn[49m[43m([49m[43m)[49m
[36mCell[39m[36m [39m[32mIn[59][39m[32m, line 33[39m, in [36mtask3_1d_cnn[39m[34m()[39m
[32m 30[39m y_test = to_categorical(y_test, num_classes)
[32m 32[39m [38;5;66;03m# Построение модели 1D CNN[39;00m
[32m---> [39m[32m33[39m model = [43mSequential[49m[43m([49m[43m[[49m
[32m 34[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mConv1D[49m[43m([49m[43mfilters[49m[43m=[49m[32;43m64[39;49m[43m,[49m[43m [49m[43mkernel_size[49m[43m=[49m[32;43m3[39;49m[43m,[49m[43m [49m[43mactivation[49m[43m=[49m[33;43m'[39;49m[33;43mrelu[39;49m[33;43m'[39;49m[43m,[49m[43m [49m[43minput_shape[49m[43m=[49m[43m([49m[32;43m3[39;49m[43m,[49m[43m [49m[32;43m24[39;49m[43m)[49m[43m)[49m[43m,[49m[43m [49m[38;5;66;43;03m# Corrected input shape[39;49;00m
[32m 35[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mMaxPooling1D[49m[43m([49m[43mpool_size[49m[43m=[49m[32;43m2[39;49m[43m)[49m[43m,[49m
[32m 36[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mConv1D[49m[43m([49m[43mfilters[49m[43m=[49m[32;43m32[39;49m[43m,[49m[43m [49m[43mkernel_size[49m[43m=[49m[32;43m3[39;49m[43m,[49m[43m [49m[43mactivation[49m[43m=[49m[33;43m'[39;49m[33;43mrelu[39;49m[33;43m'[39;49m[43m)[49m[43m,[49m
[32m 37[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mMaxPooling1D[49m[43m([49m[43mpool_size[49m[43m=[49m[32;43m2[39;49m[43m)[49m[43m,[49m
[32m 38[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mFlatten[49m[43m([49m[43m)[49m[43m,[49m
[32m 39[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mDense[49m[43m([49m[32;43m64[39;49m[43m,[49m[43m [49m[43mactivation[49m[43m=[49m[33;43m'[39;49m[33;43mrelu[39;49m[33;43m'[39;49m[43m)[49m[43m,[49m
[32m 40[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mDropout[49m[43m([49m[32;43m0.5[39;49m[43m)[49m[43m,[49m
[32m 41[39m [43m [49m[43mtf[49m[43m.[49m[43mkeras[49m[43m.[49m[43mlayers[49m[43m.[49m[43mDense[49m[43m([49m[43mnum_classes[49m[43m,[49m[43m [49m[43mactivation[49m[43m=[49m[33;43m'[39;49m[33;43msoftmax[39;49m[33;43m'[39;49m[43m)[49m
[32m 42[39m [43m[49m[43m][49m[43m)[49m
[32m 44[39m [38;5;66;03m# Компиляция модели[39;00m
[32m 45[39m model.compile(optimizer=Adam(learning_rate=[32m0.001[39m),
[32m 46[39m loss=[33m'[39m[33mcategorical_crossentropy[39m[33m'[39m,
[32m 47[39m metrics=[[33m'[39m[33maccuracy[39m[33m'[39m])
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:76[39m, in [36mSequential.__init__[39m[34m(self, layers, trainable, name)[39m
[32m 74[39m [38;5;28;01mfor[39;00m layer [38;5;129;01min[39;00m layers:
[32m 75[39m [38;5;28mself[39m.add(layer, rebuild=[38;5;28;01mFalse[39;00m)
[32m---> [39m[32m76[39m [38;5;28;43mself[39;49m[43m.[49m[43m_maybe_rebuild[49m[43m([49m[43m)[49m
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:149[39m, in [36mSequential._maybe_rebuild[39m[34m(self)[39m
[32m 147[39m [38;5;28;01mif[39;00m [38;5;28misinstance[39m([38;5;28mself[39m._layers[[32m0[39m], InputLayer) [38;5;129;01mand[39;00m [38;5;28mlen[39m([38;5;28mself[39m._layers) > [32m1[39m:
[32m 148[39m input_shape = [38;5;28mself[39m._layers[[32m0[39m].batch_shape
[32m--> [39m[32m149[39m [38;5;28;43mself[39;49m[43m.[49m[43mbuild[49m[43m([49m[43minput_shape[49m[43m)[49m
[32m 150[39m [38;5;28;01melif[39;00m [38;5;28mhasattr[39m([38;5;28mself[39m._layers[[32m0[39m], [33m"[39m[33minput_shape[39m[33m"[39m) [38;5;129;01mand[39;00m [38;5;28mlen[39m([38;5;28mself[39m._layers) > [32m1[39m:
[32m 151[39m [38;5;66;03m# We can build the Sequential model if the first layer has the[39;00m
[32m 152[39m [38;5;66;03m# `input_shape` property. This is most commonly found in Functional[39;00m
[32m 153[39m [38;5;66;03m# model.[39;00m
[32m 154[39m input_shape = [38;5;28mself[39m._layers[[32m0[39m].input_shape
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/layers/layer.py:230[39m, in [36mLayer.__new__.<locals>.build_wrapper[39m[34m(*args, **kwargs)[39m
[32m 228[39m [38;5;28;01mwith[39;00m obj._open_name_scope():
[32m 229[39m obj._path = current_path()
[32m--> [39m[32m230[39m [43moriginal_build_method[49m[43m([49m[43m*[49m[43margs[49m[43m,[49m[43m [49m[43m*[49m[43m*[49m[43mkwargs[49m[43m)[49m
[32m 231[39m [38;5;66;03m# Record build config.[39;00m
[32m 232[39m signature = inspect.signature(original_build_method)
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/models/sequential.py:195[39m, in [36mSequential.build[39m[34m(self, input_shape)[39m
[32m 193[39m [38;5;28;01mfor[39;00m layer [38;5;129;01min[39;00m [38;5;28mself[39m._layers[[32m1[39m:]:
[32m 194[39m [38;5;28;01mtry[39;00m:
[32m--> [39m[32m195[39m x = [43mlayer[49m[43m([49m[43mx[49m[43m)[49m
[32m 196[39m [38;5;28;01mexcept[39;00m [38;5;167;01mNotImplementedError[39;00m:
[32m 197[39m [38;5;66;03m# Can happen if shape inference is not implemented.[39;00m
[32m 198[39m [38;5;66;03m# TODO: consider reverting inbound nodes on layers processed.[39;00m
[32m 199[39m [38;5;28;01mreturn[39;00m
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/utils/traceback_utils.py:122[39m, in [36mfilter_traceback.<locals>.error_handler[39m[34m(*args, **kwargs)[39m
[32m 119[39m filtered_tb = _process_traceback_frames(e.__traceback__)
[32m 120[39m [38;5;66;03m# To get the full stack trace, call:[39;00m
[32m 121[39m [38;5;66;03m# `keras.config.disable_traceback_filtering()`[39;00m
[32m--> [39m[32m122[39m [38;5;28;01mraise[39;00m e.with_traceback(filtered_tb) [38;5;28;01mfrom[39;00m[38;5;250m [39m[38;5;28;01mNone[39;00m
[32m 123[39m [38;5;28;01mfinally[39;00m:
[32m 124[39m [38;5;28;01mdel[39;00m filtered_tb
[36mFile [39m[32m/var/data/python/lib/python3.12/site-packages/keras/src/ops/operation_utils.py:221[39m, in [36mcompute_conv_output_shape[39m[34m(input_shape, filters, kernel_size, strides, padding, data_format, dilation_rate)[39m
[32m 219[39m [38;5;28;01mfor[39;00m i [38;5;129;01min[39;00m [38;5;28mrange[39m([38;5;28mlen[39m(output_spatial_shape)):
[32m 220[39m [38;5;28;01mif[39;00m i [38;5;129;01mnot[39;00m [38;5;129;01min[39;00m none_dims [38;5;129;01mand[39;00m output_spatial_shape[i] < [32m0[39m:
[32m--> [39m[32m221[39m [38;5;28;01mraise[39;00m [38;5;167;01mValueError[39;00m(
[32m 222[39m [33m"[39m[33mComputed output size would be negative. Received [39m[33m"[39m
[32m 223[39m [33mf[39m[33m"[39m[33m`inputs shape=[39m[38;5;132;01m{[39;00minput_shape[38;5;132;01m}[39;00m[33m`, [39m[33m"[39m
[32m 224[39m [33mf[39m[33m"[39m[33m`kernel shape=[39m[38;5;132;01m{[39;00mkernel_shape[38;5;132;01m}[39;00m[33m`, [39m[33m"[39m
[32m 225[39m [33mf[39m[33m"[39m[33m`dilation_rate=[39m[38;5;132;01m{[39;00mdilation_rate[38;5;132;01m}[39;00m[33m`.[39m[33m"[39m
[32m 226[39m )
[32m 227[39m [38;5;28;01melif[39;00m padding == [33m"[39m[33msame[39m[33m"[39m [38;5;129;01mor[39;00m padding == [33m"[39m[33mcausal[39m[33m"[39m:
[32m 228[39m output_spatial_shape = np.floor((spatial_shape - [32m1[39m) / strides) + [32m1[39m
[31mValueError[39m: Computed output size would be negative. Received `inputs shape=(None, 0, 64)`, `kernel shape=(3, 64, 32)`, `dilation_rate=[1]`.