Compare commits
13 Commits
zhelepov_a
...
antonov_dm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c47411bf1 | ||
|
|
401a5454ee | ||
|
|
a847058d44 | ||
|
|
059d5b0b12 | ||
|
|
c943260db9 | ||
|
|
d30caee3db | ||
|
|
0b83c390f5 | ||
|
|
8a288f0abf | ||
|
|
3543ab5163 | ||
|
|
9bf1c4845a | ||
|
|
94a76f47d8 | ||
| 9644582307 | |||
| 3d8201635c |
@@ -46,12 +46,12 @@ P.S. я знаю про хак "хочу скопировать у товари
|
||||
|
||||
4. Как только Вы закончили работу над лабораторной работой, то находясь в своей ветке (убедитесь в этом пожалуйста, использую команду git branch - ваша текущая ветка будет подсвечена), вы должны закоммитить и запушить свои изменения в репозиторий, другими словами сохранить их в репозиторий.
|
||||
|
||||
- git commit -m "zhelepov_alex_lab_1 is ready"
|
||||
- git push origin
|
||||
> git commit -m "zhelepov_alex_lab_1 is ready"
|
||||
> git push origin
|
||||
|
||||
P.S. я знаю про хак "скопируй у товарища и закоммить - все равно он (я) смотреть не будет" - не сработает - давайте быть честными и делать все самостоятельно. А во-вторых, на реальной работе так не прокатит - скорее всего Вас просто уволят.
|
||||
|
||||
5. После этого Вы должны перейти в наш gitlab и создать merge request, назначив его на меня. Дополнительно лучше маякнуть меня в нашем [телеграм-чате](https://t.me/+XSq2xEbEuD05N2Vi). Я проведу ревью и отпишу замечания, которые нужно будет исправить. Если все хорошо, то вмержу ваш pull-request в мастер-ветку. Данное состояние говорит о том, что ваша л/р принята.
|
||||
5. После этого Вы должны перейти в наш git и создать merge request, назначив его на меня. Дополнительно лучше маякнуть меня в нашем [телеграм-чате](https://t.me/+XSq2xEbEuD05N2Vi). Я проведу ревью и отпишу замечания, которые нужно будет исправить. Если все хорошо, то вмержу ваш pull-request в мастер-ветку. Данное состояние говорит о том, что ваша л/р принята.
|
||||
|
||||
6. **Важный момент**: Устно я не принимаю лабораторные работы (подойти к компьютеру, посмотреть код, поставить оценку), только через репозиторий и после успешного code review ревью кода вашей л/р и ее результатов в виде отчета. Это делается для того, чтобы вы привыкали к воркфлоу, который применяется практически всеми IT-компаниями, где между разработчиками в основном общение идет через "текст". Что касается лабораторных работ в расписании - они используются в качестве консультаций, а сдача и проверка л/р идет только через репозиторий (то есть все замечания вы получаете на code review). Проверяю я обычно лабораторную в течение 1-3 дней после создания pull-request-а (всегда можно маякнуть меня в нашем telegram-чате).
|
||||
|
||||
|
||||
97
antonov_dmitry_lab_1/README.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# Лаб 1
|
||||
|
||||
Работа с типовыми наборами данных и различными моделями
|
||||
|
||||
# Вариант 3
|
||||
|
||||
Данные: make_classification (n_samples=500, n_features=2,
|
||||
n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
|
||||
|
||||
# Запуск
|
||||
|
||||
Выполнением скрипта файла (вывод в консоль + рисует графики).
|
||||
|
||||
# Модели:
|
||||
|
||||
1. Линейная регрессия
|
||||
1. Полиномиальная регрессия (со степенью 3)
|
||||
1. Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0)
|
||||
|
||||
# Графики
|
||||
|
||||
<div>
|
||||
Качество каждой модели может быть оценено на основе среднеквадратичной ошибки (MSE).
|
||||
Более низкая MSE указывает на лучшее соответствие данным.
|
||||
Однако выбор модели зависит от набора данных и лежащей в основе взаимосвязи между объектами и целевой переменной.
|
||||
|
||||
Линейная регрессия: Линейная регрессия предполагает линейную зависимость между признаками и целевой переменной.
|
||||
Это хорошо работает, когда взаимосвязь линейна, а шум в наборе данных минимален.
|
||||
Лучше всего сработала на наборе лун. Хуже всего на кругах.
|
||||
На линейном наборе показала себя на равне с остальными.
|
||||
|
||||
Полиномиальная и гребневая показали примерно одинаково на всех наборах.
|
||||
|
||||
Полиномиальная регрессия (степень=3):
|
||||
Полиномиальная регрессия обеспечивает более гибкую подгонку за счет полинома более высокого порядка(кубическая кривая).
|
||||
Она может выявить более сложные взаимосвязи между объектами и целевой переменной.
|
||||
Она может сработать лучше, чем линейная регрессия, если истинная взаимосвязь нелинейна.
|
||||
|
||||
Гребневая регрессия (степень= 3, альфа=1,0):
|
||||
В случае полиномиальной регрессии с регуляризацией (альфа=1,0) модель добавляет коэффициент регуляризации
|
||||
для управления сложностью обучения. Регуляризация помогает предотвратить переобучение, когда набор
|
||||
данных содержит шум или когда он ограничен.
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<div>Набор лун (moon_dataset)</div>
|
||||
<img src="screens/myplot1.png" width="650" title="датасет 1">
|
||||
</p>
|
||||
<p>
|
||||
<div>Графики регрессии</div>
|
||||
<img src="screens/myplot2.png" width="450" title="линейная модель">
|
||||
<img src="screens/myplot3.png" width="450" title="полиномиальная модель">
|
||||
<img src="screens/myplot4.png" width="450" title="гребневая модель">
|
||||
<div>
|
||||
Линейная MSE: 0.0936
|
||||
Полиномиальная (degree=3) MSE: 0.0674
|
||||
Гребневая (degree=3, alpha=1.0) MSE: 0.0682
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div>Набор кругов (circles_dataset)</div>
|
||||
<img src="screens/myplot5.png" width="650" title="датасет 2">
|
||||
</p>
|
||||
<p>
|
||||
<div>Графики регрессии</div>
|
||||
<img src="screens/myplot6.png" width="450" title="линейная модель">
|
||||
<img src="screens/myplot7.png" width="450" title="полиномиальная модель">
|
||||
<img src="screens/myplot8.png" width="450" title="гребневая модель">
|
||||
<div>
|
||||
Линейная MSE: 0.2684
|
||||
Полиномиальная (degree=3) MSE: 0.1341
|
||||
Гребневая (degree=3, alpha=1.0) MSE: 0.1312
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div>Набор линейный (linearly_dataset)</div>
|
||||
<img src="screens/myplot9.png" width="650" title="датасет 3">
|
||||
</p>
|
||||
<p>
|
||||
<div>Графики регрессии</div>
|
||||
<img src="screens/myplot10.png" width="450" title="линейная модель">
|
||||
<img src="screens/myplot11.png" width="450" title="полиномиальная модель">
|
||||
<img src="screens/myplot12.png" width="450" title="гребневая модель">
|
||||
<div>
|
||||
Линейная MSE: 0.1101
|
||||
Полиномиальная (degree=3) MSE: 0.1045
|
||||
Гребневая (degree=3, alpha=1.0) MSE: 0.1078
|
||||
</div>
|
||||
</p>
|
||||
|
||||
<div>
|
||||
Итоговая модель подбирается учитывая зависимость в данных,
|
||||
как правило полиномиальная регрессия справляется лучше, а коэф регуляризации в гребневой регрессии помогает избежать
|
||||
переобучения.
|
||||
</div>
|
||||
97
antonov_dmitry_lab_1/lab1.py
Normal file
@@ -0,0 +1,97 @@
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from skimage.metrics import mean_squared_error
|
||||
from sklearn.datasets import make_moons, make_circles, make_classification
|
||||
from sklearn.linear_model import LinearRegression, Ridge
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.pipeline import make_pipeline
|
||||
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
|
||||
|
||||
X, y = make_classification(
|
||||
n_features=2,
|
||||
n_redundant=0,
|
||||
n_informative=2,
|
||||
random_state=0,
|
||||
n_clusters_per_class=1
|
||||
)
|
||||
|
||||
rng = np.random.RandomState(2)
|
||||
X += 2 * rng.uniform(size=X.shape)
|
||||
linearly_dataset = (X, y)
|
||||
moon_dataset = make_moons(noise=0.3, random_state=0)
|
||||
circles_dataset = make_circles(noise=0.2, factor=0.5, random_state=1)
|
||||
datasets = [moon_dataset, circles_dataset, linearly_dataset]
|
||||
|
||||
"""
|
||||
Данные:
|
||||
· moon_dataset
|
||||
· circles_dataset
|
||||
· linearly_dataset
|
||||
"""
|
||||
for ds_cnt, ds in enumerate(datasets):
|
||||
X, y = ds
|
||||
X = StandardScaler().fit_transform(X)
|
||||
X_train, X_test, y_train, y_test = train_test_split(
|
||||
X, y, test_size=.4, random_state=42
|
||||
)
|
||||
"""
|
||||
Модели:
|
||||
· Линейную регрессию
|
||||
· Полиномиальную регрессию (со степенью 3)
|
||||
· Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0)
|
||||
"""
|
||||
|
||||
# Линейная
|
||||
linear_regression = LinearRegression()
|
||||
linear_regression.fit(X_train, y_train)
|
||||
linear_predictions = linear_regression.predict(X_test)
|
||||
linear_mse = mean_squared_error(y_test, linear_predictions)
|
||||
|
||||
# Полиномиальная (degree=3)
|
||||
poly_regression = make_pipeline(PolynomialFeatures(degree=3), LinearRegression())
|
||||
poly_regression.fit(X_train, y_train)
|
||||
poly_predictions = poly_regression.predict(X_test)
|
||||
poly_mse = mean_squared_error(y_test, poly_predictions)
|
||||
|
||||
# Гребневая (degree=3, alpha=1.0)
|
||||
poly_regression_alpha = make_pipeline(PolynomialFeatures(degree=3), Ridge(alpha=1.0))
|
||||
poly_regression_alpha.fit(X_train, y_train)
|
||||
poly_alpha_predictions = poly_regression_alpha.predict(X_test)
|
||||
poly_alpha_mse = mean_squared_error(y_test, poly_alpha_predictions)
|
||||
|
||||
# График данных
|
||||
plt.figure(figsize=(10, 6))
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap='coolwarm')
|
||||
plt.title('Датасет №' + str(ds_cnt))
|
||||
plt.xlabel('X')
|
||||
plt.ylabel('Y')
|
||||
|
||||
# График линейной модели
|
||||
plt.figure(figsize=(10, 6))
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=linear_predictions, cmap='coolwarm')
|
||||
plt.title('Линейная ds'+ str(ds_cnt))
|
||||
plt.xlabel('X')
|
||||
plt.ylabel('Y')
|
||||
plt.show()
|
||||
|
||||
# График полиномиальной модели (degree=3)
|
||||
plt.figure(figsize=(10, 6))
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=poly_predictions, cmap='coolwarm')
|
||||
plt.title('Полиномиальная (degree=3) ds' + str(ds_cnt))
|
||||
plt.xlabel('X')
|
||||
plt.ylabel('Y')
|
||||
plt.show()
|
||||
|
||||
# График гребневой модели (degree=3, alpha=1.0)
|
||||
plt.figure(figsize=(10, 6))
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=poly_alpha_predictions, cmap='coolwarm')
|
||||
plt.title('Гребневая (degree=3, alpha=1.0) ds' + str(ds_cnt))
|
||||
plt.xlabel('X')
|
||||
plt.ylabel('Y')
|
||||
plt.show()
|
||||
|
||||
# Сравнение качества
|
||||
print('Линейная MSE:', linear_mse)
|
||||
print('Полиномиальная (degree=3) MSE:', poly_mse)
|
||||
print('Гребневая (degree=3, alpha=1.0) MSE:', poly_alpha_mse)
|
||||
|
||||
BIN
antonov_dmitry_lab_1/screens/myplot1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot10.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot11.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot12.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot2.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot3.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot4.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot5.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot6.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot7.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot8.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
antonov_dmitry_lab_1/screens/myplot9.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
85
antonov_dmitry_lab_3/README.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# Лаб 3
|
||||
|
||||
Деревья решений
|
||||
|
||||
Часть 1. По данным о пассажирах Титаника решите задачу классификации
|
||||
(с помощью дерева решений), в которой по различным характеристикам
|
||||
пассажиров требуется найти у выживших пассажиров два наиболее важных
|
||||
признака из трех рассматриваемых (по варианту). Пример решения задачи
|
||||
можно посмотреть здесь: [1] (стр.188). Скачать данные можно по ссылке:
|
||||
https://www.kaggle.com/datasets/heptapod/titanic
|
||||
|
||||
Часть 2. Решите с помощью библиотечной реализации дерева решений
|
||||
задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету
|
||||
«Методы искусственного интеллекта» на 99% ваших данных. Проверьте
|
||||
работу модели на оставшемся проценте, сделайте вывод.
|
||||
|
||||
# Вариант 3
|
||||
|
||||
Признаки Sex,Age,SibSp
|
||||
|
||||
# Запуск
|
||||
|
||||
Выполнением скрипта файла (вывод в консоль).
|
||||
|
||||
# Описание модели:
|
||||
|
||||
DecisionTreeClassifier - это алгоритм машинного обучения, используемый для задач классификации и регрессии.
|
||||
Он представляет собой дерево решений, где на каждом узле дерева решается, какой вопрос задать дальше
|
||||
(признак для дальнейшего разбиения данных), а в листьях находятся окончательные ответы.
|
||||
|
||||
# Результаты
|
||||
|
||||
На данных для Титаника модель определяет важность признаков с точность 75% (исключает 'sibsp').
|
||||
Эти два признака обладают статистической важностью.
|
||||
<p>
|
||||
<div>Титаник</div>
|
||||
<img src="screens/titanic.png" width="650" title="Титаник 1">
|
||||
</p>
|
||||
|
||||
На данных моего датасета модель справляется на 52.768%, если в качестве предлагаемых параметров
|
||||
на вход идут ['Gender', 'Debtor', 'International'] (исключает 'International').
|
||||
|
||||
<p>
|
||||
<div>Мой датасет 1</div>
|
||||
<img src="screens/mydataset1.png" width="650" title="Мой датасет 1">
|
||||
</p>
|
||||
|
||||
И на 70.961, если на вход идут ['Gender', 'Debtor', 'Curricular units 2nd sem (approved)']
|
||||
(исключает 'Gender').
|
||||
|
||||
<p>
|
||||
<div>Мой датасет 2</div>
|
||||
<img src="screens/mydataset2.png" width="650" title="Мой датасет 2">
|
||||
</p>
|
||||
|
||||
Такой результат можно объяснить большей значимостью признака 'Curricular units 2nd sem (approved)'
|
||||
вместо 'International' (было показано в предыдущей лабораторной).
|
||||
|
||||
Из-за того, что мы взяли статистически более значимый признак, модель выдает нам большую точность.
|
||||
|
||||
Точность 52.768% указывает на то, что модель работает на уровне случайности, что означает, что она
|
||||
работает не лучше, чем случайное угадывание. Для этого может быть несколько причин:
|
||||
|
||||
1. Признаки все имеет малое значение: то есть для сравнения подаются признаки статистически малозначимые.
|
||||
|
||||
2. Недостаточно данных: Набор данных может содержать недостаточно информации или примеров для
|
||||
изучения моделью. Если набор данных невелик или нерепрезентативен, модель, возможно, не сможет
|
||||
хорошо обобщить новые данные.
|
||||
|
||||
3. Несбалансированные классы: Если классы в вашей целевой переменной несбалансированы
|
||||
(например, случаев, не связанных с отсевом, гораздо больше, чем случаев отсева), модель может
|
||||
быть смещена в сторону прогнозирования класса большинства.
|
||||
|
||||
4. Переобучение: Модель может быть переобучена обучающими данным, что означает, что она изучает шум
|
||||
в данных, а не лежащие в их основе закономерности. Это может произойти, если модель слишком сложна по
|
||||
сравнению с объемом доступных данных.
|
||||
|
||||
5. Недостаточное соответствие: С другой стороны, модель может быть слишком простой, чтобы отразить
|
||||
взаимосвязи в данных. Важно выбрать соответствующий уровень сложности модели.
|
||||
|
||||
<div>
|
||||
При отборе признаков должна учитываться их статистическая значимость, вычисленная различными способами
|
||||
(например с помощью лин регрессии, Random Forest Regressor, линейной корреляции f_regression или других).
|
||||
Так же должно быть достаточно данных, в модели должно быть сведено к минимуму переобучение.
|
||||
</div>
|
||||
4425
antonov_dmitry_lab_3/dataset.csv
Normal file
35
antonov_dmitry_lab_3/lab3.py
Normal file
@@ -0,0 +1,35 @@
|
||||
import pandas as pd
|
||||
from sklearn.metrics import accuracy_score
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
|
||||
# прочитали датасет
|
||||
data = pd.read_csv('dataset.csv')
|
||||
|
||||
# определение признаков
|
||||
# целевая переменная - Target
|
||||
X = data[['Gender', 'Debtor', 'Curricular units 2nd sem (approved)']]
|
||||
y = data['Target'] # Assuming 'Dropout' is the target variable
|
||||
|
||||
# разделили данные на тренировочную и тестовую выборки
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||
|
||||
# создали модель decision tree classifier
|
||||
dt_classifier = DecisionTreeClassifier(random_state=42)
|
||||
dt_classifier.fit(X_train, y_train)
|
||||
|
||||
# получили значения модели для 2ух самых важных признаков
|
||||
feature_importances = dt_classifier.feature_importances_
|
||||
|
||||
top_features_indices = feature_importances.argsort()[-2:][::-1]
|
||||
top_features = X.columns[top_features_indices]
|
||||
|
||||
# вывод результата
|
||||
print("2 самых важных признака:", top_features)
|
||||
|
||||
# получили значения модели для проверки точности
|
||||
predictions = dt_classifier.predict(X_test)
|
||||
|
||||
# вычислили точность модели
|
||||
accuracy = accuracy_score(y_test, predictions)
|
||||
print("точность модели:", accuracy)
|
||||
BIN
antonov_dmitry_lab_3/screens/mydataset1.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
antonov_dmitry_lab_3/screens/mydataset2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
antonov_dmitry_lab_3/screens/titanic.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
40
antonov_dmitry_lab_3/titanic.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import pandas as pd
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
from sklearn.metrics import accuracy_score
|
||||
|
||||
# прочитали датасет
|
||||
data = pd.read_csv("titanic_data.csv")
|
||||
|
||||
# определение признаков
|
||||
features = ['Sex', 'Age', 'sibsp']
|
||||
|
||||
# целевая переменная - выжившие
|
||||
target = 'Survived'
|
||||
|
||||
# разделили данные на тренировочную и тестовую выборки
|
||||
train_data, test_data, train_labels, test_labels = train_test_split(
|
||||
data[features],
|
||||
data[target],
|
||||
test_size=0.2,
|
||||
random_state=42
|
||||
)
|
||||
|
||||
# создали модель decision tree classifier
|
||||
model = DecisionTreeClassifier()
|
||||
|
||||
# натренировали модель
|
||||
model.fit(train_data, train_labels)
|
||||
|
||||
# получили значения модели для проверки точности
|
||||
predictions = model.predict(test_data)
|
||||
|
||||
# вычислили точность модели
|
||||
accuracy = accuracy_score(test_labels, predictions)
|
||||
print("точность модели:", accuracy)
|
||||
|
||||
# нашли два самых важных признака
|
||||
importances = model.feature_importances_
|
||||
indices = (-importances).argsort()[:2]
|
||||
important_features = [features[i] for i in indices]
|
||||
print("два самых важных признака:", important_features)
|
||||