yandex_project / pages /5_star_temperature.py
Sazuppy's picture
Upload 32 files
540fe64 verified
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')