Merge pull request 'kondrashin_mikhail_lab_5_ready' (#206) from kondrashin_mikhail_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/206
This commit is contained in:
commit
fb0c308c04
42
kondrashin_mikhail_lab_5/README.md
Normal file
42
kondrashin_mikhail_lab_5/README.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#### Кондрашин Михаил ПИбд-41
|
||||||
|
|
||||||
|
## Лабораторная работа 5. Регрессия
|
||||||
|
|
||||||
|
### Запуск лабораторной работы:
|
||||||
|
|
||||||
|
* установить `python`, `numpy`, `matplotlib`, `sklearn`
|
||||||
|
* запустить проект (стартовая точка класс `main.py`)
|
||||||
|
|
||||||
|
### Используемые технологии:
|
||||||
|
|
||||||
|
* Язык программирования `Python`,
|
||||||
|
* Библиотеки `numpy`, `matplotlib`, `sklearn`
|
||||||
|
* Среда разработки `IntelliJ IDEA` (В версии "Ultimate edition" можно писать на python)
|
||||||
|
|
||||||
|
### Описание решения:
|
||||||
|
|
||||||
|
* Используется линейная регрессия
|
||||||
|
* Программа выявляет наиболее важные пункты при прогнозировании погоды. Использует линейную регрессию, а так же
|
||||||
|
оценивает точность модели.
|
||||||
|
* Входные данные:
|
||||||
|
* Влияющие признаки
|
||||||
|
* D1 (угол, с которого дует ветер на самом высоком датчике мачты ветростанции)
|
||||||
|
* TI1 (показатель турбуленции на самом высоком датчике мачты ветростанции)
|
||||||
|
* T (температура воздуха)
|
||||||
|
* RH (относительная влажность)
|
||||||
|
* P (атмосферное давление)
|
||||||
|
* Аппроксимирующий признак - температура
|
||||||
|
* Файл WindData.csv
|
||||||
|
|
||||||
|
### Выводы
|
||||||
|
|
||||||
|
* Наиболее важные признаки:
|
||||||
|
* TI1 (турбуленция)
|
||||||
|
* V1 (скорость ветра)
|
||||||
|
* TestSize при этом является достаточно небольшим, что свидетельствует о корректности работы модели
|
||||||
|
|
||||||
|
### Результат:
|
||||||
|
|
||||||
|
![Result](images/result.png)
|
||||||
|
|
||||||
|
|
49656
kondrashin_mikhail_lab_5/WindData.csv
Normal file
49656
kondrashin_mikhail_lab_5/WindData.csv
Normal file
File diff suppressed because it is too large
Load Diff
12
kondrashin_mikhail_lab_5/data.py
Normal file
12
kondrashin_mikhail_lab_5/data.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
|
||||||
|
def load(path):
|
||||||
|
dataset = pd.read_csv(path)
|
||||||
|
|
||||||
|
names = ['V1', 'D1', 'RH', 'TI1', 'P']
|
||||||
|
|
||||||
|
x = dataset[names]
|
||||||
|
y = dataset['T']
|
||||||
|
|
||||||
|
return x, y, names
|
BIN
kondrashin_mikhail_lab_5/images/result.png
Normal file
BIN
kondrashin_mikhail_lab_5/images/result.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
16
kondrashin_mikhail_lab_5/main.py
Normal file
16
kondrashin_mikhail_lab_5/main.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from models import create_model
|
||||||
|
from rank import calculate_mean_and_sort_list, get_ranks, calculate_mape
|
||||||
|
from data import load
|
||||||
|
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
X, y, names = load('WindData.csv')
|
||||||
|
linear = create_model(X, y)
|
||||||
|
ranks = get_ranks(linear, names)
|
||||||
|
print("MEAN", calculate_mean_and_sort_list(ranks))
|
||||||
|
for test_size in [0.001, 0.01, 0.05, 0.11]:
|
||||||
|
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=test_size, random_state=100)
|
||||||
|
mape = calculate_mape(X_train, X_test, Y_train, Y_test)
|
||||||
|
print(f'MAPE for test_size={test_size} is {float("{:.3f}".format(mape))}')
|
8
kondrashin_mikhail_lab_5/models.py
Normal file
8
kondrashin_mikhail_lab_5/models.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from sklearn.linear_model import LinearRegression
|
||||||
|
|
||||||
|
|
||||||
|
def create_model(x, y):
|
||||||
|
linear = LinearRegression()
|
||||||
|
linear.fit(x, y)
|
||||||
|
|
||||||
|
return linear
|
55
kondrashin_mikhail_lab_5/rank.py
Normal file
55
kondrashin_mikhail_lab_5/rank.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import numpy as np
|
||||||
|
from sklearn.preprocessing import MinMaxScaler
|
||||||
|
from operator import itemgetter
|
||||||
|
from models import create_model
|
||||||
|
from sklearn.metrics import mean_absolute_percentage_error
|
||||||
|
|
||||||
|
|
||||||
|
def get_ranks(linear, names):
|
||||||
|
ranks = dict()
|
||||||
|
ranks['Linear'] = sort_by_desc(rank_to_dict(linear.coef_, names))
|
||||||
|
return ranks
|
||||||
|
|
||||||
|
|
||||||
|
def sort_by_desc(dictionary):
|
||||||
|
return dict(sorted(dictionary.items(), key=itemgetter(1), reverse=True))
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_mean_and_sort_list(ranks):
|
||||||
|
mean = {}
|
||||||
|
for key, value in ranks.items():
|
||||||
|
print(key, value)
|
||||||
|
for item in value.items():
|
||||||
|
if item[0] not in mean:
|
||||||
|
mean[item[0]] = 0
|
||||||
|
mean[item[0]] += item[1]
|
||||||
|
for key, value in mean.items():
|
||||||
|
res = value / len(ranks)
|
||||||
|
mean[key] = round(res, 4)
|
||||||
|
return sort_by_desc(mean)
|
||||||
|
|
||||||
|
|
||||||
|
def rank_to_dict(ranks, names):
|
||||||
|
ranks = np.abs(ranks)
|
||||||
|
minmax = MinMaxScaler()
|
||||||
|
ranks = minmax.fit_transform(np.array(ranks).reshape(len(names), 1)).ravel()
|
||||||
|
ranks = map(lambda x: round(x, 4), ranks)
|
||||||
|
return dict(zip(names, ranks))
|
||||||
|
|
||||||
|
|
||||||
|
# Mean absolute percentage error regression loss
|
||||||
|
def calculate_mape(x_train, x_test, y_train, y_test):
|
||||||
|
lasso = create_model(x_train, y_train)
|
||||||
|
lasso_predict = lasso.predict(x_test)
|
||||||
|
|
||||||
|
# Convert to lists to calculate MAPE
|
||||||
|
y_test = list(y_test)
|
||||||
|
lasso_predict = list(lasso_predict)
|
||||||
|
|
||||||
|
# y_test_correct = []
|
||||||
|
#
|
||||||
|
# for i in y_test:
|
||||||
|
# if not i == 0. or not i == 0:
|
||||||
|
# y_test_correct.append(i)
|
||||||
|
|
||||||
|
return mean_absolute_percentage_error(list(y_test), lasso_predict)
|
Loading…
Reference in New Issue
Block a user