Merge pull request 'romanova_adelina_lab_6 is ready' (#280) from romanova_adelina_lab_6 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/280
This commit is contained in:
commit
d915c4d712
BIN
romanova_adelina_lab_6/1.png
Normal file
BIN
romanova_adelina_lab_6/1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 158 KiB |
BIN
romanova_adelina_lab_6/2.png
Normal file
BIN
romanova_adelina_lab_6/2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
BIN
romanova_adelina_lab_6/3.png
Normal file
BIN
romanova_adelina_lab_6/3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
BIN
romanova_adelina_lab_6/4.png
Normal file
BIN
romanova_adelina_lab_6/4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 98 KiB |
47
romanova_adelina_lab_6/README.md
Normal file
47
romanova_adelina_lab_6/README.md
Normal file
@ -0,0 +1,47 @@
|
||||
# Лабораторная работа №6. Вариант 21
|
||||
|
||||
## Тема:
|
||||
Нейронная сеть
|
||||
|
||||
## Модель:
|
||||
|
||||
MLPClassifier
|
||||
|
||||
## Как запустить программу:
|
||||
Установить *python, numpy, matplotlib, sklearn*
|
||||
```
|
||||
python lab.py
|
||||
```
|
||||
|
||||
## Какие технологии использовались:
|
||||
Язык программирования Python, библиотеки numpy, matplotlib, sklearn
|
||||
|
||||
Среда разработки VSCode
|
||||
|
||||
# Что делает лабораторная работа:
|
||||
|
||||
В ходе исследования нейронных сетей, в особенности многослойных перцептронов (MLP), был проведен тщательный анализ влияния архитектуры сети на её производительность в задаче классификации стадий сердечных заболеваний. Эксперименты с различными конфигурациями слоев и их размерами позволили более глубоко понять, какие параметры сети оказывают наибольшее влияние на точность прогнозов.
|
||||
|
||||
В качестве MLP в коде использовался класс ```sklearn.neural_network.MLPClassifier``` и целевой задачей являлось предсказание наличие болезни сердца (0 - отсутствует, а 1,2,3,4 - стадии)
|
||||
|
||||
Процесс подготовки данных и обучение MLP представлен на изображении ниже и ```качество оценки составило 0.83```, данное число представляет точность оценки и вычисляется как отношение правильных ответов к общему количеству ответов. Важно отметить, что данный MLP состоял только из ```одного скрытого слоя с размером = 100```.
|
||||
|
||||
![](1.png "")
|
||||
|
||||
При MLP, содержащим два скрытых состояния с размерами ```300``` и ```100``` соответственно получилось добиться ```точности в примерно 0.92```.
|
||||
|
||||
![](2.png "")
|
||||
|
||||
При MLP, содержащим четыре скрытых состояния с размерами ```150, 100, 50 и 50 ```соответственно получилось добиться ```точности в 0.95```.
|
||||
|
||||
![](3.png "")
|
||||
|
||||
При MLP, который содержит 5 слоев с размерами ```100, 400, 600, 400, 100```, то есть самая большая с точки зрения архитектуры модель имеет наилучший показать точности.
|
||||
|
||||
![](4.png "")
|
||||
|
||||
## Вывод
|
||||
|
||||
На основе проведенных экспериментов можно сделать вывод, что при усложнении архитектуры нейронной сети мы получаем улучшение в ее качестве.
|
||||
|
||||
![](res.png "")
|
86
romanova_adelina_lab_6/lab.py
Normal file
86
romanova_adelina_lab_6/lab.py
Normal file
@ -0,0 +1,86 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import seaborn as sns
|
||||
import sklearn
|
||||
from sklearn.neural_network import MLPClassifier
|
||||
import argparse
|
||||
|
||||
from sklearn.preprocessing import (LabelEncoder,
|
||||
StandardScaler,
|
||||
MinMaxScaler,
|
||||
RobustScaler)
|
||||
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold, learning_curve, ShuffleSplit
|
||||
|
||||
|
||||
def get_arguments():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument('--id_pred', type=int, default=1, help='Какой id из тестовой выборки будем предсказывать')
|
||||
|
||||
args = parser.parse_args()
|
||||
return args
|
||||
|
||||
|
||||
def str_features_to_numeric(data):
|
||||
# Преобразовывает все строковые признаки в числовые.
|
||||
|
||||
# Определение категориальных признаков
|
||||
categorical_columns = []
|
||||
numerics = ['int8', 'int16', 'int32', 'int64', 'float16', 'float32', 'float64']
|
||||
features = data.columns.values.tolist()
|
||||
for col in features:
|
||||
if data[col].dtype in numerics: continue
|
||||
categorical_columns.append(col)
|
||||
|
||||
# Кодирование категориальных признаков
|
||||
for col in categorical_columns:
|
||||
if col in data.columns:
|
||||
le = LabelEncoder()
|
||||
le.fit(list(data[col].astype(str).values))
|
||||
data[col] = le.transform(list(data[col].astype(str).values))
|
||||
|
||||
return data
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = get_arguments()
|
||||
|
||||
data = pd.read_csv("..//heart_disease_uci.csv")
|
||||
data['target'] = data['num']
|
||||
data = data.drop(columns=['id', 'dataset', 'num'])
|
||||
|
||||
data_wo_null = data.dropna()
|
||||
print(len(data_wo_null))
|
||||
data_wo_null.head(3)
|
||||
|
||||
encoded_data_wo_null = str_features_to_numeric(data_wo_null)
|
||||
|
||||
scaler = StandardScaler()
|
||||
new_data = pd.DataFrame(scaler.fit_transform(encoded_data_wo_null), columns = encoded_data_wo_null.columns)
|
||||
|
||||
dataset = data_wo_null.copy() # original data
|
||||
target_name = 'target'
|
||||
target = data_wo_null.pop(target_name)
|
||||
|
||||
X_train, X_test, y_train, y_test = train_test_split(new_data, target, test_size=0.2, random_state=42)
|
||||
|
||||
clf = MLPClassifier(random_state=42, max_iter=300, hidden_layer_sizes=(100)).fit(X_train, y_train)
|
||||
print("---"*15, " MLPClassifier(100) ", "---"*15)
|
||||
print(f"Accuracy: {clf.score(X_test, y_test)}")
|
||||
|
||||
clf2 = MLPClassifier(random_state=42, max_iter=300, hidden_layer_sizes=(300, 100)).fit(X_train, y_train)
|
||||
print("---"*15, " MLPClassifier(300, 100) ", "---"*15)
|
||||
print(f"Accuracy: {clf2.score(X_test, y_test)}")
|
||||
|
||||
clf3 = MLPClassifier(random_state=42, max_iter=300, hidden_layer_sizes=(150, 100, 50, 50)).fit(X_train, y_train)
|
||||
print("---"*15, " MLPClassifier(150, 100, 50, 50) ", "---"*15)
|
||||
print(f"Accuracy: {clf3.score(X_test, y_test)}")
|
||||
|
||||
clf4 = MLPClassifier(random_state=42, max_iter=300, hidden_layer_sizes=(100, 400, 600, 400, 100)).fit(X_train, y_train)
|
||||
print("---"*15, " MLPClassifier(100, 400, 600, 400, 100) ", "---"*15)
|
||||
print(f"Accuracy: {clf4.score(X_test, y_test)}")
|
||||
|
||||
print("---"*15, f" Предсказание элемента под id = {args.id_pred}", "---"*15)
|
||||
print(f"Предсказанное значение: {clf3.predict(np.array(list(X_test.iloc[args.id_pred])).reshape(1, -1))}")
|
||||
print(f"Настоящее значение {y_test.iloc[args.id_pred]}")
|
BIN
romanova_adelina_lab_6/res.png
Normal file
BIN
romanova_adelina_lab_6/res.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Loading…
Reference in New Issue
Block a user