File size: 7,193 Bytes
540fe64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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')