diff --git a/romanova_adelina_lab_6/1.png b/romanova_adelina_lab_6/1.png new file mode 100644 index 0000000..d121c34 Binary files /dev/null and b/romanova_adelina_lab_6/1.png differ diff --git a/romanova_adelina_lab_6/2.png b/romanova_adelina_lab_6/2.png new file mode 100644 index 0000000..2d10679 Binary files /dev/null and b/romanova_adelina_lab_6/2.png differ diff --git a/romanova_adelina_lab_6/3.png b/romanova_adelina_lab_6/3.png new file mode 100644 index 0000000..927a487 Binary files /dev/null and b/romanova_adelina_lab_6/3.png differ diff --git a/romanova_adelina_lab_6/4.png b/romanova_adelina_lab_6/4.png new file mode 100644 index 0000000..ec97f3c Binary files /dev/null and b/romanova_adelina_lab_6/4.png differ diff --git a/romanova_adelina_lab_6/README.md b/romanova_adelina_lab_6/README.md new file mode 100644 index 0000000..c94efa3 --- /dev/null +++ b/romanova_adelina_lab_6/README.md @@ -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 "") \ No newline at end of file diff --git a/romanova_adelina_lab_6/lab.py b/romanova_adelina_lab_6/lab.py new file mode 100644 index 0000000..e3384f5 --- /dev/null +++ b/romanova_adelina_lab_6/lab.py @@ -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]}") diff --git a/romanova_adelina_lab_6/res.png b/romanova_adelina_lab_6/res.png new file mode 100644 index 0000000..b5ba839 Binary files /dev/null and b/romanova_adelina_lab_6/res.png differ