Compare commits

..

1 Commits

11 changed files with 29127 additions and 145 deletions

6
.idea/IIS_2023_1.iml generated
View File

@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.9 (PyCharmProjects)" jdkType="Python SDK" />
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.8 (venv)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

5
.idea/misc.xml generated
View File

@@ -1,9 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.9 (PyCharmProjects)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (PyCharmProjects)" project-jdk-type="Python SDK" />
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (venv)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" />
</component>

42
.idea/workspace.xml generated
View File

@@ -5,8 +5,6 @@
</component>
<component name="ChangeListManager">
<list default="true" id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/IIS_2023_1.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/IIS_2023_1.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@@ -36,9 +34,6 @@
&quot;associatedIndex&quot;: 2
}</component>
<component name="ProjectId" id="2VlZqWiOX68aCf0o2y0AtYJWURS" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="1" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
@@ -47,16 +42,8 @@
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
&quot;git-widget-placeholder&quot;: &quot;senkin__alexander__lab__1&quot;,
&quot;last_opened_file_path&quot;: &quot;D:/ulstukek/Course4/IIS/labs&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;reference.settings.ide.settings.new.ui&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
&quot;settings.editor.selected.configurable&quot;: &quot;reference.settings.ide.settings.new.ui&quot;
}
}</component>
<component name="RecentsManager">
@@ -65,7 +52,7 @@
<recent name="D:\ulstukek\Course4\IIS\IISLabs\IIS_2023_1\zavrazhnova_svetlana_lab_1" />
</key>
</component>
<component name="RunManager">
<component name="RunManager" selected="Python.zavrazhnova_svetlana_lab3_2">
<configuration name="zavrazhnova_svetlana_lab3_2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="IIS_2023_1" />
<option name="INTERPRETER_OPTIONS" value="" />
@@ -78,7 +65,6 @@
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_3/zavrazhnova_svetlana_lab3_2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
@@ -100,7 +86,6 @@
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_2/zavrazhnova_svetlana_lab_2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
@@ -122,7 +107,6 @@
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/zavrazhnova_svetlana_lab_3/zavrazhnova_svetlana_lab_3_1.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
@@ -150,38 +134,18 @@
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1695412818437</updated>
<workItem from="1697735437405" duration="1706000" />
<workItem from="1697740229646" duration="3802000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="HEAD" />
</list>
</value>
</entry>
</map>
</option>
</State>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/PyCharmProjects$senkin_alexander_lab_1.coverage" NAME="senkin_alexander_lab_1 Coverage Results" MODIFIED="1697744262965" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/senkin_alexander_lab_1" />
</component>
</project>

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -1,38 +0,0 @@
Вариант 2
Задание на лабораторную работу:
По данным построить графики 3 моделей:
- Линейную регрессию
- Полиномиальную регрессию (со степенью 3)
- Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0)
Данные: make_circles (noise=0.2, factor=0.5, random_state=rs)
Как запустить лабораторную работу:
Чтобы увидеть работу программы, нужно запустить исполняемый питон файл senkin_alexander_lab_1.py, после чего будут отрисованы 3 графика, которые также можно увидеть в формате png в папке проекта.
Библиотеки
Matplotlib. Используется для создания графиков.
Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением.
Описание программы:
- Генерируем набор данных из 100 точек данных используя функцию make_circles
- С помощью функции train_test_split разделяем данные на тестовые и обучающие в соотношении 20 к 80
- Создаем 3 модели:
- Линейную регрессию
- Полиномиальную регрессию (со степенью 3)
- Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0)
- Модели используем для предсказания классов с помощью метода predict
- Оцениваем точность каждой модели
- Строим графики для визуального представления и оценивая работ моделей
- Сравниваем точности моделей и выбираем наиболее точную
![Linear.png](Linear.png)![Polynomial.png](Polynomial.png)![Ridge.png](Ridge.png)
Изходя из результатов: Линейная - 0.30, Полиномиальная - 0.45, Гребневая полиномиальная - 0.47, делаем вывод, что наиболее точная модель - Гребневая полиномиальная.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -1,60 +0,0 @@
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
# Создаем данные
rs = 42 #желаемый random_state
X, y = make_circles(n_samples=100, noise=0.2, factor=0.5, random_state=rs)
# Разделяем данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=rs)
# Обучаем модели
# Линейная регрессия
lr = LinearRegression()
lr.fit(X_train, y_train)
y_lr_pred = lr.predict(X_test)
r2_lr = r2_score(y_test, y_lr_pred)
# Полиномиальная регрессия с полиномом 3-й степени
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X_train)
lr_poly = LinearRegression()
lr_poly.fit(X_poly, y_train)
X_test_poly = poly.transform(X_test)
y_poly_pred = lr_poly.predict(X_test_poly)
r2_poly = r2_score(y_test, y_poly_pred)
# Гребневая полиномиальная регрессия с полиномом 3-й степени и alpha = 1.0
ridge = Ridge(alpha=1.0)
ridge.fit(X_poly, y_train)
y_ridge_pred = ridge.predict(X_test_poly)
r2_ridge = r2_score(y_test, y_ridge_pred)
# Функция для отображения точек на графике
def plot_with_labels(X, y, title, xlabel, ylabel):
plt.figure(figsize=(12, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='.', label='Тестовые данные')
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', marker='o', edgecolors='black', linewidths=0.5, label='Обучающие данные')
plt.title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.legend()
plt.show()
# График для линейной регрессии
plot_with_labels(X_test, y_lr_pred, 'Линейная регрессия', 'Признак 1', 'Признак 2')
print(f'Линейная регрессия - Точность: {r2_lr:.2f}')
# График для полиномиальной регрессии
plot_with_labels(X_test, y_poly_pred, 'Полиномиальная регрессия', 'Признак 1', 'Признак 2')
print(f'Полиномиальная регрессия - Точность: {r2_poly:.2f}')
# График для гребневой полиномиальной регрессии
plot_with_labels(X_test, y_ridge_pred, 'Гребневая полиномиальная регрессия', 'Признак 1', 'Признак 2')
print(f'Гребневая полиномиальная регрессия - Точность: {r2_ridge:.2f}')