Шестая лабораторная готова
This commit is contained in:
parent
a98d914e7c
commit
b0accdaf06
76
alexandrov_dmitrii_lab_6/lab6.py
Normal file
76
alexandrov_dmitrii_lab_6/lab6.py
Normal 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()
|
149
alexandrov_dmitrii_lab_6/readme.md
Normal file
149
alexandrov_dmitrii_lab_6/readme.md
Normal 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" показала себя не лучшим образом. Возможно, другие методы могут выдать лучшие результаты, либо необходима более обширная модификация модели.
|
28896
alexandrov_dmitrii_lab_6/sberbank_data.csv
Normal file
28896
alexandrov_dmitrii_lab_6/sberbank_data.csv
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user