Spaces:
Running
Running
import streamlit as st | |
import numpy as np | |
import pandas as pd | |
import pickle | |
import torch | |
import torch.nn as nn | |
from torch.utils.data import Dataset, DataLoader | |
from math import ceil | |
from sklearn.metrics import mean_squared_error | |
from sklearn.model_selection import train_test_split | |
from sklearn.preprocessing import StandardScaler, OneHotEncoder | |
from sklearn.compose import ColumnTransformer | |
st.set_page_config(page_title="# Прогнозирование температуры звезды") | |
st.markdown('# Прогнозирование температуры звезды') | |
with st.expander("Описание проекта"): | |
st.write(""" | |
Вам пришла задача от обсерватории «Небо на ладони»: придумать, как с помощью нейросети определять температуру на поверхности обнаруженных звёзд. Обычно для расчёта температуры учёные пользуются следующими методами: | |
- Закон смещения Вина. | |
- Закон Стефана-Больцмана. | |
- Спектральный анализ. | |
Каждый из них имеет плюсы и минусы. Обсерватория хочет внедрить технологии машинного обучения для предсказания температуры звёзд, надеясь, что этот метод будет наиболее точным и удобным. | |
В базе обсерватории есть характеристики уже изученных 240 звёзд. | |
**Характеристики** | |
- Относительная светимость L/Lo — светимость звезды относительно Солнца. | |
- Относительный радиус R/Ro — радиус звезды относительно радиуса Солнца. | |
- Абсолютная звёздная величина Mv — физическая величина, характеризующая блеск звезды. | |
- Звёздный цвет (white, red, blue, yellow, yellow-orange и др.) — цвет звезды, который определяют на основе спектрального анализа. | |
- Тип звезды. | |
- 0 - Коричневый карлик | |
- 1 - Красный карлик | |
- 2 - Белый карлик | |
- 3 - Звёзды главной последовательности | |
- 4 - Сверхгигант | |
- 5 - Гипергигант | |
- Абсолютная температура T(K) — температура на поверхности звезды в Кельвинах. | |
В этом самостоятельном проекте вам необходимо разработать нейронную сеть, которая поможет предсказывать абсолютную температуру на поверхности звезды. | |
Справочная информация: | |
Светимость Солнца (англ. Average Luminosity of Sun) | |
$L_0 = 3.828 \cdot 10^{26}\,Вт$ | |
Радиус Солнца (англ. Average Radius of Sun) | |
$R_0 = 6.9551\cdot 10^8\,м$ | |
""") | |
st.sidebar.header("Признаки для модели машинного обучения") | |
def star_type_cat(type_star): | |
type_dict = {'Коричневый карлик':0, | |
'Красный карлик':1, | |
'Белый карлик':2, | |
'Звёзды главной последовательности':3, | |
'Сверхгигант':4, | |
'Гипергигант':5 | |
} | |
return type_dict[type_star] | |
def user_input_features(): | |
star_color = st.sidebar.selectbox('цвет звезды, который определяют на основе спектрального анализа', ('red', 'blue', 'white', 'blue-white', 'orange', 'yellow-white', 'whitish')) | |
luminosity = st.sidebar.slider('светимость звезды относительно Солнца', 0.00008, 900000.0, 2000.0) | |
radius = st.sidebar.slider('радиус звезды относительно радиуса Солнца', 0.007, 2000.0, 200.0) | |
abs_magnitude = st.sidebar.slider('физическая величина, характеризующая блеск звезды', -12.0, 25.0, 10.0) | |
star_type = st.sidebar.selectbox('цвет звезды, который определяют на основе спектрального анализа', ('Коричневый карлик', 'Красный карлик', 'Белый карлик', 'Звёзды главной последовательности', | |
'Сверхгигант', 'Гипергигант')) | |
data = {'luminosity': luminosity, | |
'radius':radius, | |
'abs_magnitude':abs_magnitude, | |
'star_color':star_color, | |
'star_type':star_type | |
} | |
features = pd.DataFrame(data, index=[0]) | |
return features | |
df = user_input_features() | |
df = df.sort_index(axis=1) | |
st.subheader('Таблица с введенными вами параметрами:') | |
st.write(df) | |
def preprocessing_data(df, scaler, ohe): | |
df['star_type']=df['star_type'].apply(star_type_cat) | |
numeric = ['luminosity', 'radius', 'abs_magnitude'] | |
categorial = ['star_color', 'star_type'] | |
df[numeric] = scaler.transform(df[numeric]) | |
tmp = pd.DataFrame(ohe.transform(df[categorial]).toarray(), | |
columns=ohe.get_feature_names_out(), | |
index=df.index) | |
df.drop(categorial, axis=1, inplace=True) | |
df = df.join(tmp).sort_index(axis=1) | |
df = torch.FloatTensor(df.values) | |
return df | |
class Net(nn.Module): | |
def __init__(self, input_size, hidden_size1, hidden_size2, num_classes): | |
super(Net, self).__init__() | |
self.fc1 = nn.Linear(input_size, hidden_size1) | |
self.act1 = nn.Tanh() | |
self.fc2 = nn.Linear(hidden_size1, hidden_size2) | |
self.act2 = nn.ReLU() | |
self.fc3 = nn.Linear(hidden_size2, num_classes) | |
def forward(self, x): | |
out = self.fc1(x) | |
out = self.act1(out) | |
out = self.fc2(out) | |
out = self.act2(out) | |
out = self.fc3(out) | |
return out | |
def get_model_pre(): | |
ohe_model = pickle.load(open('models/ohe_star_temperature_pred.pkl', 'rb')) | |
scaler_model = pickle.load(open('models/scaler_star_temperature_pred.pkl', 'rb')) | |
return scaler_model, ohe_model | |
def get_model(): | |
net = Net(df_new.shape[1], 700, 850, 1) | |
net.load_state_dict(torch.load('models/star_temperature_pred.pkl')) | |
net.eval() | |
prediction = net.forward(df_new).detach().numpy()[0][0] | |
return prediction | |
sc_model, ohe_model = get_model_pre() | |
df_new = preprocessing_data(df, sc_model, ohe_model) | |
model_pred = get_model() | |
st.subheader('Температура звезды:') | |
st.write(str(model_pred) + ' K') | |