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:
Alexey 2023-12-07 15:39:15 +04:00
commit fb0c308c04
7 changed files with 49789 additions and 0 deletions

View 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)

File diff suppressed because it is too large Load Diff

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View 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))}')

View File

@ -0,0 +1,8 @@
from sklearn.linear_model import LinearRegression
def create_model(x, y):
linear = LinearRegression()
linear.fit(x, y)
return linear

View 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)