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