Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %%time
- # нейросеть/метрика RMSE/графики изменения RMSE и R2 от эпохи к эпохе
- import pandas as pd
- import numpy as np
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler, OneHotEncoder
- from sklearn.metrics import r2_score
- import torch
- import torch.nn as nn
- import torch.optim as optim
- from torch.utils.data import DataLoader, TensorDataset
- import matplotlib.pyplot as plt
- # Признаки и цель
- features = ['luminosity', 'radius', 'abs_magnitude', 'star_type', 'star_color']
- target = 'temperature'
- # Разделение на признаки и таргет
- X = data[features]
- y = data[target]
- # Категоризация строковых признаков с помощью OneHotEncoder
- encoder = OneHotEncoder(sparse=False)
- categorical_features = X[['star_type', 'star_color']]
- encoded_features = encoder.fit_transform(categorical_features)
- # Объединение закодированных и числовых признаков
- numeric_features = X.drop(columns=['star_type', 'star_color']).values
- X_encoded = np.hstack([numeric_features, encoded_features])
- # Разделение данных на тренировочные и тестовые выборки
- X_train, X_test, y_train, y_test = train_test_split(X_encoded, y, test_size=0.25, random_state=42)
- # Масштабирование данных
- scaler = StandardScaler()
- X_train_scaled = scaler.fit_transform(X_train)
- X_test_scaled = scaler.transform(X_test)
- # Преобразование в тензоры
- X_train_tensor = torch.tensor(X_train_scaled, dtype=torch.float32)
- X_test_tensor = torch.tensor(X_test_scaled, dtype=torch.float32)
- y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32).view(-1, 1)
- y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32).view(-1, 1)
- # Создание датасетов и загрузчиков данных
- train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
- test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
- train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True)
- test_loader = DataLoader(test_dataset, batch_size=10, shuffle=False)
- # Определение нейронной сети
- class NeuralNetwork(nn.Module):
- def __init__(self):
- super(NeuralNetwork, self).__init__()
- self.fc1 = nn.Linear(X_train_tensor.shape[1], 1500)
- self.dropout1 = nn.Dropout(0.1)
- self.fc2 = nn.Linear(1500, 1400)
- self.dropout2 = nn.Dropout(0.5)
- self.fc3 = nn.Linear(1400, 1300)
- self.dropout3 = nn.Dropout(0.5)
- self.fc4 = nn.Linear(1300, 1100)
- self.dropout5 = nn.Dropout(0.5)
- self.fc5 = nn.Linear(1100, 1)
- def forward(self, x):
- x = torch.relu(self.fc1(x))
- x = self.dropout1(x)
- x = torch.relu(self.fc2(x))
- x = self.dropout2(x)
- x = torch.relu(self.fc3(x))
- x = self.dropout3(x)
- x = torch.relu(self.fc4(x))
- x = self.dropout5(x)
- x = self.fc5(x) # убираем активацию в последнем слое
- return x
- # Инициализация модели, функции потерь и оптимизатора
- model = NeuralNetwork()
- criterion = nn.MSELoss()
- optimizer = optim.Adam(model.parameters(), lr=0.001)
- # Обучение модели
- num_epochs = 100
- # Хранение результатов для построения графиков
- results = []
- for epoch in range(num_epochs):
- model.train() # перевод сети в режим обучения
- for X_batch, y_batch in train_loader:
- optimizer.zero_grad() # обнуление градиентов
- outputs = model(X_batch) # предсказание на партии/батче тренировочных данных
- loss = criterion(outputs, y_batch) # вычисление значения функции потерь
- loss.backward() # вычисление градиентов
- optimizer.step() # один шаг оптимизации весов
- # Расчет R² и RMSE в конце каждой эпохи
- model.eval() # перевод сети в режим предсказания
- with torch.no_grad():
- train_predictions = model(X_train_tensor) # предсказания на тренировочных данных
- r2_train = r2_score(y_train_tensor.numpy(), train_predictions.numpy()) # расчет R² на тренировочных данных
- rmse_train = torch.sqrt(criterion(train_predictions, y_train_tensor)).item() # расчет RMSE на тренировочных данных
- test_predictions = model(X_test_tensor) # предсказания на тестовых данных
- r2_test = r2_score(y_test_tensor.numpy(), test_predictions.numpy()) # расчет R² на тестовых данных
- rmse_test = torch.sqrt(criterion(test_predictions, y_test_tensor)).item() # расчет RMSE на тестовых данных
- results.append({
- 'Epoch': epoch+1,
- 'Train R²': r2_train,
- 'Test R²': r2_test,
- 'Train RMSE': rmse_train,
- 'Test RMSE': rmse_test
- })
- # Итоговая оценка модели
- model.eval() # перевод сети в режим предсказания
- with torch.no_grad():
- test_predictions = model(X_test_tensor) # расчет предсказаний на тестовых данных
- test_loss = criterion(test_predictions, y_test_tensor) # расчет метрики на тестовых данных
- r2 = r2_score(y_test_tensor.numpy(), test_predictions.numpy()) # расчет R² на тестовых данных
- rmse = torch.sqrt(test_loss).item() # расчет RMSE на тестовых данных
- print(f'Итоговая оценка на тестовых данных: R²: {r2:.2f}, RMSE: {rmse:.2f}')
- # Создание Pandas DataFrame для отображения результатов
- df_results = pd.DataFrame(results)
- # Построение графиков
- plt.figure(figsize=(14, 5))
- # График 1: динамика изменения R²
- plt.subplot(1, 2, 1)
- plt.plot(df_results['Epoch'], df_results['Train R²'], 'r-', label='Train R²')
- plt.plot(df_results['Epoch'], df_results['Test R²'], 'b-', label='Test R²')
- plt.xlabel('Эпоха')
- plt.ylabel('R²')
- plt.title('Динамика изменения R² от эпохи к эпохе')
- plt.legend()
- # График 2: динамика изменения RMSE
- plt.subplot(1, 2, 2)
- plt.plot(df_results['Epoch'], df_results['Train RMSE'], 'r-', label='Train RMSE')
- plt.plot(df_results['Epoch'], df_results['Test RMSE'], 'b-', label='Test RMSE')
- plt.xlabel('Эпоха')
- plt.ylabel('RMSE')
- plt.title('Динамика изменения RMSE от эпохи к эпохе')
- plt.legend()
- plt.tight_layout()
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement