malkova_anastasia_lab_6 ready #164

Merged
Alexey merged 1 commits from malkova_anastasia_lab_6 into main 2023-12-07 15:56:53 +04:00
8 changed files with 852275 additions and 0 deletions

View File

@ -0,0 +1,70 @@
# Лабораторная работа №6
> Нейронная сеть
### Как запустить лабораторную работу
1. Установить python, numpy, sklearn
1. Запустить команду `python main.py` в корне проекта
### Использованные технологии
* Язык программирования `python`
* Библиотеки `numpy, sklearn`
* Среда разработки `PyCharm`
### Что делает программа?
Цель программы: на основе данных об автомобилях на вторичном рынке обучить модель нейронной сети MLPRegressor
на предсказание цены.
Модель: MLPRegressor
Выбранные признаки:
- year
- mileage
- state
#### Сеть из 1 слоя в 20 нейронов
Обучение на 2 вариантах random state
Оценки качества по MAPE:
min: 91.89810260464559
median: 91.91394036274613
max: 91.92977812084669
std: 0.015837758100552435
Выводы: качество хорошее, но всё ещё есть доля ошибки. При этом разброс оценок качества 0.01 процента показывает,
что random state не сильно влияет на итоговое качество модели.
Обучение на 20 вариантах random state
min: 91.47984008974515
median: 91.97261118318303
max: 92.36410228588716
std: 0.22711198255843948
Выводы: качество неудовлетворительное. Похоже на переобучение. Разброс всё ещё небольшой 0.2 показывает,
что random state не сильно влияет на итоговое качество модели.
#### Сеть из 2 слоев по 20 нейронов
Обучение на 2 вариантах random state
min: 91.12873208155982
median: 91.44458715556677
max: 91.76044222957371
std: 0.31585507400694723
Обучение на 20 вариантах random state
min: 90.17104509583521
median: 91.85328507593465
max: 92.43304446695873
std: 0.5086054377534013
Выводы: Оптимальный результат 92.43%. Качество хорошее, но процент ошибки всё ещё большой.
Поэтому для решения поставленной задачи MLPRegressor с предложенными параметрами не подходит.

View File

@ -0,0 +1 @@
DATA_SIZE = 1000

View File

@ -0,0 +1,27 @@
import pandas as pd
from sklearn.model_selection import train_test_split
from config import DATA_SIZE
def load_dataset():
data = pd.read_csv('true_car_listings.csv')[:DATA_SIZE]
names = ['Year', 'Mileage', 'City', 'State', 'Vin', 'Make', 'Model']
convert_to_num(data, 'City')
convert_to_num(data, 'State')
convert_to_num(data, 'Vin')
convert_to_num(data, 'Make')
convert_to_num(data, 'Model')
Y = data['Price']
X = data[names]
x_train, x_test, y_train, y_test = train_test_split(
X, Y, test_size=0.05, random_state=42)
return x_train, x_test, y_train, y_test
def convert_to_num(data, col):
unique_numbers = list(set(data[col]))
data[col] = data[col].apply(unique_numbers.index)

View File

@ -0,0 +1,14 @@
from sklearn.neural_network import MLPRegressor
from scores import MAPE
def random_state_fit(i, x, y, x_test, y_test):
mlr = MLPRegressor(random_state=i, max_iter=2000, n_iter_no_change=20,
activation='relu', alpha=0.01, hidden_layer_sizes=[20, 20], tol=0.0000001)
mlr.fit(x, y)
y_pred = mlr.predict(x_test)
acc = 100 - MAPE(y_test, y_pred)
print('random state', i, "\naccuracy", acc)
return acc

View File

@ -0,0 +1,13 @@
from dataset import load_dataset
from fit import random_state_fit
from statistic import statistic
x_train, x_test, y_train, y_test = load_dataset()
history = []
for i in range(2):
acc = random_state_fit(i, x_train, y_train, x_test, y_test)
history.append(acc)
statistic(history)

View File

@ -0,0 +1,6 @@
import numpy as np
def MAPE(Y_actual, Y_Predicted):
mape = np.mean(np.abs((Y_actual - Y_Predicted)/Y_actual))*100
return mape

View File

@ -0,0 +1,21 @@
import numpy as np
def statistic(data):
data_min = min(data)
print('min:', data_min)
data_median = median(data)
print('median:', data_median)
data_max = max(data)
print('max:', data_max)
data_std = np.std(data)
print('std:', data_std)
return data_min, data_median, data_max, data_std
def median(list):
return np.median(np.array(list))

File diff suppressed because it is too large Load Diff