Загрузка данных


import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
import os
import glob

# ========== УКАЖИТЕ ВАШ ПУТЬ ==========
DATA_PATH = r"C:\Users\user\Desktop\Бакланов П. Л. СИМ"   # <--- измените на свой путь, где лежат consumer1 и consumer2

def load_data_from_folders(base_path):
    X = []   # обязательно список
    y = []
    # Потребитель 1 (класс 0)
    folder1 = os.path.join(base_path, 'consumer1')
    files1 = glob.glob(os.path.join(folder1, '*.txt'))
    print(f"Найдено файлов в consumer1: {len(files1)}")
    for f in files1:
        data = np.loadtxt(f, delimiter=';', usecols=1)
        X.append(data)
        y.append(0)
    # Потребитель 2 (класс 1)
    folder2 = os.path.join(base_path, 'consumer2')
    files2 = glob.glob(os.path.join(folder2, '*.txt'))
    print(f"Найдено файлов в consumer2: {len(files2)}")
    for f in files2:
        data = np.loadtxt(f, delimiter=';', usecols=1)
        X.append(data)
        y.append(1)
    X = np.array(X)
    y = np.array(y)
    print(f"Общий массив X имеет форму: {X.shape} (ожидается (2000, 512))")
    return X, y

# Загрузка
X, y = load_data_from_folders(DATA_PATH)

# Построим графики двух примеров
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
idx0 = np.where(y==0)[0][0]
plt.plot(X[idx0])
plt.title('Потребитель 1 (класс 0) - пример осциллограммы')
plt.xlabel('Номер отсчёта')
plt.ylabel('Ток, отн. ед.')

plt.subplot(1,2,2)
idx1 = np.where(y==1)[0][0]
plt.plot(X[idx1])
plt.title('Потребитель 2 (класс 1) - пример осциллограммы')
plt.xlabel('Номер отсчёта')
plt.tight_layout()
plt.savefig('oscillograms_example.png')
plt.show()

# Нормализация признаков
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Разделение на обучение (80%) и тест (20%)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42, stratify=y)

# Создание и обучение нейронной сети
mlp = MLPClassifier(
    hidden_layer_sizes=(64, 32, 16),
    activation='relu',
    solver='adam',
    max_iter=500,
    random_state=42,
    early_stopping=True,
    validation_fraction=0.1,
    verbose=True
)
mlp.fit(X_train, y_train)

# Предсказание
y_pred = mlp.predict(X_test)

# Метрики
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)

print("\n" + "="*40)
print("РЕЗУЛЬТАТЫ КЛАССИФИКАЦИИ (тестовая выборка)")
print("="*40)
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1-мера: {f1:.4f}")
print("\nДетальный отчёт:")
print(classification_report(y_test, y_pred, target_names=['Потребитель 1', 'Потребитель 2']))

# Сохраняем метрики
with open('metrics.txt', 'w', encoding='utf-8') as f:
    f.write(f"Accuracy: {accuracy:.4f}\n")
    f.write(f"Precision: {precision:.4f}\n")
    f.write(f"Recall: {recall:.4f}\n")
    f.write(f"F1-мера: {f1:.4f}\n")

print("\nМетрики сохранены в metrics.txt")
print("График сохранён как oscillograms_example.png")