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")