alexandrov_dmitrii_lab_5 is ready #51
48
alexandrov_dmitrii_lab_5/lab5.py
Normal file
48
alexandrov_dmitrii_lab_5/lab5.py
Normal 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()
|
36
alexandrov_dmitrii_lab_5/readme.md
Normal file
36
alexandrov_dmitrii_lab_5/readme.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
### Задание
|
||||||
|
Использовать регрессию по варианту для выбранных данных по варианту, самостоятельно сформулировав задачу.
|
||||||
|
Интерпретировать результаты и оценить, насколько хорошо она подходит для
|
||||||
|
решения сформулированной вами задачи.
|
||||||
|
|
||||||
|
Вариант 1: полиномиальная регрессия
|
||||||
|
|
||||||
|
Была сформулирована следующая задача: необходимо предсказывать стоимость жилья по избранным признакам при помощи регрессии.
|
||||||
|
|
||||||
|
### Запуск программы
|
||||||
|
Файл lab5.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует.
|
||||||
|
|
||||||
|
### Описание программы
|
||||||
|
Программа считывает цены на жильё как выходные данные и следующие данные как входные: год размещения объявления, площадь, этаж, количество этажей, год постройки, количество комнат, материал, расстояние до кремля (условного центра).
|
||||||
|
Далее она обрабатывает данные (цифровизирует нулевые данные), оставляет только год объявления.
|
||||||
|
|
||||||
|
После обработки программа делит данные на 99% обучающего материала и 1% тестового и обучает модель полиномиальной регрессии со степенью 3.
|
||||||
|
Далее модель генерирует набор предсказаний на основе тестовых входных данных. Эти предсказания обрабатываются: убираются отрицательные цены.
|
||||||
|
|
||||||
|
Далее программа оценивает предсказания по коэффициенту детерминации и выводит результат в консоль. А также показывает диаграммы рассеяния для действительных (зелёные точки) и предсказанных (красные точки) цен.
|
||||||
|
|
||||||
|
### Результаты тестирования
|
||||||
|
По результатам тестирования, можно сказать следующее:
|
||||||
|
* Полные данные алгоритм обрабатывает плохо, поэтому было необходимо было выбирать наиболее значимые признаки.
|
||||||
|
* В зависимости от данных, разные степени регрессии дают разный результат. В общем случае обычная линейная регрессия давала коэффициент около 0.3. При добавлении же степеней полиномиальная регрессия выдавала выбросные значения цен: например, -300 миллионов, что негативно сказывалось на результате.
|
||||||
|
* Для того, чтобы явно выбросные результаты не портили оценку (коэффициент соответственно становился -1000) эти выбросные значения заменялись на средние.
|
||||||
|
* Опытным путём было найдено, что наилучшие результаты (коэффициент 0.54) показывает степень 3.
|
||||||
|
* Результат 0.54 - наилучший результат - можно назвать неприемлимым: только в половине случаев предсказанная цена условно похожа на действительную.
|
||||||
|
* Возможно, включением большего количества признаков и использованием других моделей (линейная, например, не давала выбросов) удастся решить проблему.
|
||||||
|
|
||||||
|
Пример консольного вывода:
|
||||||
|
>Оценка обучения:
|
||||||
|
>
|
||||||
|
>0.5390648784908953
|
||||||
|
|
||||||
|
Итого: Алгоритм можно привести к некоторой эффективности, однако для конкретно этих данных он не подходит. Лучше попытаться найти другую модель регрессии.
|
28896
alexandrov_dmitrii_lab_5/sberbank_data.csv
Normal file
28896
alexandrov_dmitrii_lab_5/sberbank_data.csv
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user