Compare commits

...

11 Commits

Author SHA1 Message Date
DmitriyAntonov
8c47411bf1 лаба 3 реади1 2023-10-08 10:52:30 +04:00
DmitriyAntonov
401a5454ee лаба 3 реади 2023-10-08 10:49:00 +04:00
DmitriyAntonov
a847058d44 лаба 3 почти 2023-10-07 22:30:34 +04:00
DmitriyAntonov
059d5b0b12 лаба 3 done 2023-09-30 20:35:16 +04:00
DmitriyAntonov
c943260db9 лаба 2 done 2023-09-30 20:26:46 +04:00
DmitriyAntonov
d30caee3db iter5 2023-09-23 21:04:51 +04:00
DmitriyAntonov
0b83c390f5 iter4 2023-09-23 21:01:09 +04:00
DmitriyAntonov
8a288f0abf iter3 2023-09-23 20:53:45 +04:00
DmitriyAntonov
3543ab5163 iter2 2023-09-23 17:42:04 +04:00
DmitriyAntonov
9bf1c4845a iter1 2023-09-23 17:22:03 +04:00
DmitriyAntonov
94a76f47d8 start 2023-09-19 10:23:19 +04:00
22 changed files with 6089 additions and 0 deletions

View 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>

View 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View 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>

File diff suppressed because it is too large Load Diff

View 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View 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)

File diff suppressed because it is too large Load Diff