Advertisement
gagarin_1982

neural net simple

Nov 2nd, 2024
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.97 KB | None | 0 0
  1. %%time
  2.  
  3. # нейросеть/метрика RMSE/графики изменения RMSE и R2 от эпохи к эпохе
  4.  
  5. import pandas as pd
  6. import numpy as np
  7. from sklearn.model_selection import train_test_split
  8. from sklearn.preprocessing import StandardScaler, OneHotEncoder
  9. from sklearn.metrics import r2_score
  10. import torch
  11. import torch.nn as nn
  12. import torch.optim as optim
  13. from torch.utils.data import DataLoader, TensorDataset
  14. import matplotlib.pyplot as plt
  15.  
  16. # Признаки и цель
  17. features = ['luminosity', 'radius', 'abs_magnitude', 'star_type', 'star_color']
  18. target = 'temperature'
  19.  
  20. # Разделение на признаки и таргет
  21. X = data[features]
  22. y = data[target]
  23.  
  24. # Категоризация строковых признаков с помощью OneHotEncoder
  25. encoder = OneHotEncoder(sparse=False)
  26. categorical_features = X[['star_type', 'star_color']]
  27. encoded_features = encoder.fit_transform(categorical_features)
  28.  
  29. # Объединение закодированных и числовых признаков
  30. numeric_features = X.drop(columns=['star_type', 'star_color']).values
  31. X_encoded = np.hstack([numeric_features, encoded_features])
  32.  
  33. # Разделение данных на тренировочные и тестовые выборки
  34. X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.25, random_state=42)
  35.  
  36. # Масштабирование данных
  37. scaler = StandardScaler()
  38. X_train_scaled = scaler.fit_transform(X_train)
  39. X_test_scaled = scaler.transform(X_test)
  40.  
  41. # Преобразование в тензоры
  42. X_train_tensor = torch.tensor(X_train_scaled, dtype=torch.float32)
  43. X_test_tensor = torch.tensor(X_test_scaled, dtype=torch.float32)
  44. y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32).view(-1, 1)
  45. y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32).view(-1, 1)
  46.  
  47. # Создание датасетов и загрузчиков данных
  48. train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
  49. test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
  50.  
  51. train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True)
  52. test_loader = DataLoader(test_dataset, batch_size=10, shuffle=False)
  53.  
  54. # Определение нейронной сети
  55. class NeuralNetwork(nn.Module):
  56.     def __init__(self):
  57.         super(NeuralNetwork, self).__init__()
  58.         self.fc1 = nn.Linear(X_train_tensor.shape[1], 1500)
  59.         self.dropout1 = nn.Dropout(0.1)
  60.         self.fc2 = nn.Linear(1500, 1400)
  61.         self.dropout2 = nn.Dropout(0.5)
  62.         self.fc3 = nn.Linear(1400, 1300)
  63.         self.dropout3 = nn.Dropout(0.5)
  64.         self.fc4 = nn.Linear(1300, 1100)
  65.         self.dropout5 = nn.Dropout(0.5)
  66.         self.fc5 = nn.Linear(1100, 1)
  67.        
  68.     def forward(self, x):
  69.         x = torch.relu(self.fc1(x))
  70.         x = self.dropout1(x)
  71.         x = torch.relu(self.fc2(x))
  72.         x = self.dropout2(x)
  73.         x = torch.relu(self.fc3(x))
  74.         x = self.dropout3(x)
  75.         x = torch.relu(self.fc4(x))
  76.         x = self.dropout5(x)
  77.         x = self.fc5(x) # убираем активацию в последнем слое
  78.         return x
  79.  
  80. # Инициализация модели, функции потерь и оптимизатора
  81. model = NeuralNetwork()
  82. criterion = nn.MSELoss()
  83. optimizer = optim.Adam(model.parameters(), lr=0.001)
  84.  
  85. # Обучение модели
  86. num_epochs = 100
  87.  
  88. # Хранение результатов для построения графиков
  89. results = []
  90.  
  91. for epoch in range(num_epochs):
  92.     model.train() # перевод сети в режим обучения
  93.    
  94.     for X_batch, y_batch in train_loader:
  95.         optimizer.zero_grad() # обнуление градиентов
  96.         outputs = model(X_batch) # предсказание на партии/батче тренировочных данных
  97.         loss = criterion(outputs, y_batch)  # вычисление значения функции потерь
  98.         loss.backward() # вычисление градиентов
  99.         optimizer.step() # один шаг оптимизации весов
  100.  
  101.     # Расчет R² и RMSE в конце каждой эпохи
  102.     model.eval() # перевод сети в режим предсказания
  103.     with torch.no_grad():
  104.         train_predictions = model(X_train_tensor) # предсказания на тренировочных данных
  105.         r2_train = r2_score(y_train_tensor.numpy(), train_predictions.numpy()) # расчет R² на тренировочных данных
  106.         rmse_train = torch.sqrt(criterion(train_predictions, y_train_tensor)).item() # расчет RMSE на тренировочных данных
  107.         test_predictions = model(X_test_tensor) # предсказания на тестовых данных
  108.         r2_test = r2_score(y_test_tensor.numpy(), test_predictions.numpy()) # расчет R² на тестовых данных
  109.         rmse_test = torch.sqrt(criterion(test_predictions, y_test_tensor)).item() # расчет RMSE на тестовых данных
  110.    
  111.     results.append({
  112.         'Epoch': epoch+1,
  113.         'Train R²': r2_train,
  114.         'Test R²': r2_test,
  115.         'Train RMSE': rmse_train,
  116.         'Test RMSE': rmse_test
  117.     })
  118.  
  119. # Итоговая оценка модели
  120. model.eval() # перевод сети в режим предсказания
  121. with torch.no_grad():
  122.     test_predictions = model(X_test_tensor) # расчет предсказаний на тестовых данных
  123.     test_loss = criterion(test_predictions, y_test_tensor) # расчет метрики на тестовых данных
  124.     r2 = r2_score(y_test_tensor.numpy(), test_predictions.numpy()) # расчет R² на тестовых данных
  125.     rmse = torch.sqrt(test_loss).item() # расчет RMSE на тестовых данных
  126.     print(f'Итоговая оценка на тестовых данных: R²: {r2:.2f}, RMSE: {rmse:.2f}')
  127.  
  128. # Создание Pandas DataFrame для отображения результатов
  129. df_results = pd.DataFrame(results)
  130.  
  131. # Построение графиков
  132. plt.figure(figsize=(14, 5))
  133.  
  134. # График 1: динамика изменения R²
  135. plt.subplot(1, 2, 1)
  136. plt.plot(df_results['Epoch'], df_results['Train R²'], 'r-', label='Train R²')
  137. plt.plot(df_results['Epoch'], df_results['Test R²'], 'b-', label='Test R²')
  138. plt.xlabel('Эпоха')
  139. plt.ylabel('R²')
  140. plt.title('Динамика изменения R² от эпохи к эпохе')
  141. plt.legend()
  142.  
  143. # График 2: динамика изменения RMSE
  144. plt.subplot(1, 2, 2)
  145. plt.plot(df_results['Epoch'], df_results['Train RMSE'], 'r-', label='Train RMSE')
  146. plt.plot(df_results['Epoch'], df_results['Test RMSE'], 'b-', label='Test RMSE')
  147. plt.xlabel('Эпоха')
  148. plt.ylabel('RMSE')
  149. plt.title('Динамика изменения RMSE от эпохи к эпохе')
  150. plt.legend()
  151.  
  152. plt.tight_layout()
  153. plt.show()
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement