Пятая лабораторная готова

This commit is contained in:
Дмитрий Александров 2023-10-15 20:20:22 +04:00
parent 9613109f32
commit 81479f5221
3 changed files with 28980 additions and 0 deletions

View File

@ -0,0 +1,48 @@
from matplotlib import pyplot as plt
from sklearn import metrics
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
import pandas as pd
def start():
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']]
y = data[['price_doc']]
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
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.01, random_state=42)
poly = Pipeline([('poly', PolynomialFeatures(degree=3)),
('linear', LinearRegression())])
poly.fit(x_train, y_train)
y_mean = y['price_doc'].mean()
y_predicted = poly.predict(x_test)
for i, n in enumerate(y_predicted):
if n < 10000:
y_predicted[i] = y_mean
print('Оценка обучения:')
print(metrics.r2_score(y_test, y_predicted))
plt.figure(1, figsize=(16, 9))
plt.title('Сравнение результатов обучения')
plt.scatter(x=[i for i in range(len(y_test))], y=y_test, c='g', s=5)
plt.scatter(x=[i for i in range(len(y_test))], y=y_predicted, c='r', s=5)
plt.show()
start()

View File

@ -0,0 +1,36 @@
### Задание
Использовать регрессию по варианту для выбранных данных по варианту, самостоятельно сформулировав задачу.
Интерпретировать результаты и оценить, насколько хорошо она подходит для
решения сформулированной вами задачи.
Вариант 1: полиномиальная регрессия
Была сформулирована следующая задача: необходимо предсказывать стоимость жилья по избранным признакам при помощи регрессии.
### Запуск программы
Файл lab5.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует.
### Описание программы
Программа считывает цены на жильё как выходные данные и следующие данные как входные: год размещения объявления, площадь, этаж, количество этажей, год постройки, количество комнат, материал, расстояние до кремля (условного центра).
Далее она обрабатывает данные (цифровизирует нулевые данные), оставляет только год объявления.
После обработки программа делит данные на 99% обучающего материала и 1% тестового и обучает модель полиномиальной регрессии со степенью 3.
Далее модель генерирует набор предсказаний на основе тестовых входных данных. Эти предсказания обрабатываются: убираются отрицательные цены.
Далее программа оценивает предсказания по коэффициенту детерминации и выводит результат в консоль. А также показывает диаграммы рассеяния для действительных (зелёные точки) и предсказанных (красные точки) цен.
### Результаты тестирования
По результатам тестирования, можно сказать следующее:
* Полные данные алгоритм обрабатывает плохо, поэтому было необходимо было выбирать наиболее значимые признаки.
* В зависимости от данных, разные степени регрессии дают разный результат. В общем случае обычная линейная регрессия давала коэффициент около 0.3. При добавлении же степеней полиномиальная регрессия выдавала выбросные значения цен: например, -300 миллионов, что негативно сказывалось на результате.
* Для того, чтобы явно выбросные результаты не портили оценку (коэффициент соответственно становился -1000) эти выбросные значения заменялись на средние.
* Опытным путём было найдено, что наилучшие результаты (коэффициент 0.54) показывает степень 3.
* Результат 0.54 - наилучший результат - можно назвать неприемлимым: только в половине случаев предсказанная цена условно похожа на действительную.
* Возможно, включением большего количества признаков и использованием других моделей (линейная, например, не давала выбросов) удастся решить проблему.
Пример консольного вывода:
>Оценка обучения:
>
>0.5390648784908953
Итого: Алгоритм можно привести к некоторой эффективности, однако для конкретно этих данных он не подходит. Лучше попытаться найти другую модель регрессии.

File diff suppressed because one or more lines are too long