Merge pull request 'alexandrov_dmitrii_lab_6 ready' (#72) from alexandrov_dmitrii_lab_6 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/72
This commit is contained in:
Alexey 2023-10-28 12:11:47 +04:00
commit 1fddfd2362
3 changed files with 29121 additions and 0 deletions

View File

@ -0,0 +1,76 @@
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
import pandas as pd
import numpy as np
data = pd.read_csv('sberbank_data.csv', index_col='id')
x = data[['timestamp', 'full_sq', 'floor', 'max_floor', 'build_year', 'num_room', 'material', 'kremlin_km']]
x = x.replace('NA', 0)
x.fillna(0, inplace=True)
col_date = []
for val in x['timestamp']:
col_date.append(val.split('-', 1)[0])
x = x.drop(columns='timestamp')
x['timestamp'] = col_date
y = []
for val in data['price_doc']:
if val < 1500000:
y.append('low')
elif val < 3000000:
y.append('medium')
elif val < 5500000:
y.append('high')
elif val < 10000000:
y.append('premium')
else:
y.append('oligarch')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.01, random_state=42)
min_scores = []
med_scores = []
max_scores = []
def do_test(iters_num):
global x_train, x_test, y_train, y_test, min_scores, med_scores, max_scores
print("Testing iterations number "+str(iters_num)+":")
scores = []
for i in range(10):
neuro = MLPClassifier(max_iter=200)
neuro.fit(x_train, y_train)
scr = neuro.score(x_test, y_test)
print("res"+str(i+1)+": "+str(scr))
scores.append(scr)
print("Medium result: "+str(np.mean(scores)))
min_scores.append(np.min(scores))
med_scores.append(np.mean(scores))
max_scores.append(np.max(scores))
def start():
global min_scores, med_scores, max_scores
iter_nums = [200, 400, 600, 800, 1000]
for num in iter_nums:
do_test(num)
plt.figure(1, figsize=(16, 9))
plt.plot(iter_nums, min_scores, c='r')
plt.plot(iter_nums, med_scores, c='b')
plt.plot(iter_nums, max_scores, c='b')
plt.show()
start()

View File

@ -0,0 +1,149 @@
### Задание
Использовать нейронную сеть по варианту для выбранных данных по варианту, самостоятельно сформулировав задачу.
Интерпретировать результаты и оценить, насколько хорошо она подходит для
решения сформулированной вами задачи.
Вариант 1: MLPClassifier
Была сформулирована следующая задача: необходимо классифицировать жильё по стоимости на основе избранных признаков при помощи нейронной сети.
### Запуск программы
Файл lab6.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует.
### Описание программы
Программа считывает цены на жильё как выходные данные и следующие данные как входные: год размещения объявления, площадь, этаж, количество этажей, год постройки, количество комнат, материал, расстояние до кремля (условного центра).
Далее она обрабатывает данные (цифровизирует нулевые данные), оставляет только год объявления. Цены распределяются по пяти классам.
После обработки программа делит данные на 99% обучающего материала и 1% тестового.
Эти данные обрабатываются по 10 раз для идентичных моделей нейронных сетей, использующих метод градиентного спуска "adam", с разной настройкой максимального количества поколений: 200, 400, 600, 800, 1000.
Считаются оценка модели. Для каждой модели запоминаются минимальный, максимальный и средний результаты. В консоль выводятся все результаты.
В конце программа показывает графики зависимости результатов от максимального количества поколений модели.
### Результаты тестирования
По результатам тестирования, можно сказать следующее:
* В общем, модель даёт средний результат в районе 40-50% точности, что недостаточно.
* Увеличение максимального количества поколений влияет сильнее всего на минимальные оценки, сужая разброс точности.
* Нельзя сказать, что увеличение максимального количества поколений сильно улучшит модель: максимум на 10% точности.
Пример консольного вывода:
>Testing iterations number 200:
>
>res1: 0.3806228373702422
>
>res2: 0.6055363321799307
>
>res3: 0.4809688581314879
>
>res4: 0.4913494809688581
>
>res5: 0.4844290657439446
>
>res6: 0.2975778546712803
>
>res7: 0.48788927335640137
>
>res8: 0.06228373702422145
>
>res9: 0.6193771626297578
>
>res10: 0.47750865051903113
>
>Medium result: 0.4387543252595155
>
>Testing iterations number 400:
>
>res1: 0.6124567474048442
>
>res2: 0.4290657439446367
>
>res3: 0.3217993079584775
>
>res4: 0.5467128027681661
>
>res5: 0.48788927335640137
>
>res6: 0.40484429065743943
>
>res7: 0.6020761245674741
>
>res8: 0.4186851211072664
>
>res9: 0.42214532871972316
>
>res10: 0.370242214532872
>
>Medium result: 0.46159169550173
>
>Testing iterations number 600:
>
>res1: 0.4359861591695502
>
>res2: 0.2560553633217993
>
>res3: 0.5363321799307958
>
>res4: 0.5778546712802768
>
>res5: 0.35986159169550175
>
>res6: 0.356401384083045
>
>res7: 0.49480968858131485
>
>res8: 0.5121107266435986
>
>res9: 0.5224913494809689
>
>res10: 0.5190311418685121
>
>Medium result: 0.4570934256055363
>
>Testing iterations number 800:
>
>res1: 0.25951557093425603
>
>res2: 0.4083044982698962
>
>res3: 0.5224913494809689
>
>res4: 0.5986159169550173
>
>res5: 0.24567474048442905
>
>res6: 0.4013840830449827
>
>res7: 0.21453287197231835
>
>res8: 0.4671280276816609
>
>res9: 0.40484429065743943
>
>res10: 0.38408304498269896
>
>Medium result: 0.3906574394463667
>
>Testing iterations number 1000:
>
>res1: 0.4186851211072664
>
>res2: 0.5017301038062284
>
>res3: 0.5121107266435986
>
>res4: 0.3806228373702422
>
>res5: 0.44982698961937717
>
>res6: 0.5986159169550173
>
>res7: 0.5570934256055363
>
>res8: 0.4290657439446367
>
>res9: 0.32525951557093424
>
>res10: 0.41522491349480967
>
>Medium result: 0.4588235294117647
Итого: Для отобранных данных нейронная модель с методом градиентного спуска "adam" показала себя не лучшим образом. Возможно, другие методы могут выдать лучшие результаты, либо необходима более обширная модификация модели.

File diff suppressed because one or more lines are too long