Compare commits

...

9 Commits

Author SHA1 Message Date
DmitriyAntonov
de0b7d831a лаба 2 реади 2023-10-07 22:02:25 +04:00
DmitriyAntonov
fc35bc8158 лаба 2 степ2 2023-09-30 21:07:59 +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
17 changed files with 4809 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,84 @@
# Лаб 2
Ранжирование признаков
Выполните ранжирование признаков с помощью указанных по варианту моделей.
Отобразите получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
Проведите анализ получившихся результатов.
Какие четыре признака оказались самыми важными по среднему значению?
(Названия\индексы признаков и будут ответом на задание).
# Вариант 3
Линейная регрессия (LinearRegression) , Сокращение признаков
Случайными деревьями (Random Forest Regressor), Линейная корреляция
(f_regression)
Я использовал датасет Predict students' dropout and academic success
https://www.kaggle.com/datasets/thedevastator/higher-education-predictors-of-student-retention
Он используется мной по заданию на курсовую работу
# Запуск
Выполнением скрипта файла (вывод в консоль).
# Модели:
1. Линейная регрессия (LinearRegression)
1. Сокращение признаков cлучайными деревьями (Random Forest Regressor)
1. Линейная корреляция (f_regression)
# Пояснения
<div>
Выбор наиболее подходящего метода ранжирования объектов зависит от специфики набора данных и требований
к модели.
Линейная регрессия - это простой и понятный метод, который может быть использован для предсказания значений.
Он хорошо работает, если зависимость между переменными является линейной.
Однако, если данные содержат сложные нелинейные зависимости, линейная регрессия может
оказаться не очень эффективной.
Уменьшение признаков с помощью случайных деревьев (Random Forest Regressor) - это мощный метод,
который способен обрабатывать сложные взаимосвязи в данных, даже если они нелинейные.
Он основан на идее создания ансамбля деревьев решений, каждое из которых дает свой голос за
наиболее подходящий ответ. Случайные леса обычно дают хорошие результаты и являются устойчивыми
к переобучению.
Линейная корреляция или f_regression - это статистический метод, который используется для измерения
степени связи между двумя переменными. Он может помочь определить, есть ли вообще связь между переменными,
но не подходит для ранжирования объектов.
</div>
### 4 самых важных признака в среднем:
1. Признак: Curricular units 2nd sem (approved), Оценка: 0.8428
2. Признак: Tuition fees up to date, Оценка: 0.4797
3. Признак: Curricular units 1st sem (approved), Оценка: 0.2986
4. Признак: Curricular units 2nd sem (grade), Оценка: 0.2778
### 4 самых важных для lr_scores линейной регрессии:
1. 0.3917 'Tuition fees up to date'
2. 0.2791 'International'
3. 0.2075 'Curricular units 2nd sem (approved)'
4. 0.1481 'Debtor'
### 4 самых важных для rf_scores рандом forests:
1. 0.4928 'Curricular units 2nd sem (approved)'
2. 0.061 'Tuition fees up to date'
3. 0.0458 'Curricular units 2nd sem (grade)'
4. 0.0308 'Curricular units 1st sem (grade)'
### 4 самых важных для f_regression:
1. 2822.104 'Curricular units 2nd sem (approved)'
2. 2093.3315 'Curricular units 2nd sem (grade)'
3. 1719.4229 'Curricular units 1st sem (approved)'
4. 1361.6144 'Curricular units 1st sem (grade)'
### Объяснение:
<div>
В общем, выбор между линейной регрессией и случайными лесами зависит от характеристик данных.
Если данные имеют линейную зависимость, то линейная регрессия будет предпочтительнее.
Если данные содержат сложные, возможно нелинейные взаимосвязи, то Random Forest может быть лучшим выбором.
В любом случае, важно провести предварительное исследование данных и тестирование различных моделей,
чтобы выбрать наиболее подходящую.
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,106 @@
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import f_regression
from sklearn.preprocessing import MinMaxScaler
# загрузка dataset
data = pd.read_csv('dataset.csv')
# разделение dataset на тренировочную и тестовую выборки
X = data.drop(['Target'], axis=1)
y = data['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Тренировка моделей
# Линейная регрессия
lr = LinearRegression()
lr.fit(X_train, y_train)
# Сокращение признаков случайными деревьями с помощью Random Forest Regressor
rf = RandomForestRegressor()
rf.fit(X_train, y_train)
# Ранжирование признаков использую каждую модель/метод
# Получение абсолютных значений коэффициентов в качестве оценок важности признаков
lr_scores = abs(lr.coef_)
# Получение оценок важности объектов из модели Random Forest Regressor
rf_scores = rf.feature_importances_
# Отображение итоговых оценок по каждой колонке
feature_names = X.columns.tolist()
# показать оценки рангов по модели линейной регрессии
print("оценки линейной регрессии:")
for feature, score in zip(feature_names, lr_scores):
print(f"{feature}: {round(score, 4)}")
# оценки метода рандомных лесов
print("\nоценки Random Forest:")
for feature, score in zip(feature_names, rf_scores):
print(f"{feature}: {round(score, 4)}")
# вычисление значений оценки для f_regression
f_scores, p_values = f_regression(X, y)
# оценки f_regression
print("\nоценки f_regression:")
for feature, score in zip(feature_names, f_scores):
print(f"{feature}: {round(score, 4)}")
# использую MinMaxScaler для точных средних значений рангов
scaler = MinMaxScaler()
lr_scores_scaled = scaler.fit_transform(lr_scores.reshape(-1, 1)).flatten()
rf_scores_scaled = scaler.fit_transform(rf_scores.reshape(-1, 1)).flatten()
f_scores_scaled = scaler.fit_transform(f_scores.reshape(-1, 1)).flatten()
# вычисление средних оценок для каждого признака
average_scores = {}
for feature in feature_names:
average_scores[feature] = (lr_scores_scaled[feature_names.index(feature)] +
rf_scores_scaled[feature_names.index(feature)] +
f_scores_scaled[feature_names.index(feature)]) / 3
# получаем среднюю оценку признаков
sorted_features = sorted(average_scores.items(), key=lambda x: x[1], reverse=True)
# получаем самых важных признака
top_4_features = sorted_features[:4]
# отображаем 4 самые важные
print("\n4 самых важных признака в среднем:")
for feature, score in top_4_features:
print(f"Признак: {feature}, Оценка: {round(score, 4)}")
# отображаем самых важных признака для каждого метода/модели
top_lr_indices = np.argsort(lr_scores)[-4:][::-1]
top_rf_indices = np.argsort(rf_scores)[-4:][::-1]
top_f_indices = np.argsort(f_scores)[-4:][::-1]
top_lr_features = [feature_names[i] for i in top_lr_indices]
top_rf_features = [feature_names[i] for i in top_rf_indices]
top_f_features = [feature_names[i] for i in top_f_indices]
top_lr_features_score = [lr_scores[i] for i in top_lr_indices]
top_rf_features_score = [rf_scores[i] for i in top_rf_indices]
top_f_features_score = [f_scores[i] for i in top_f_indices]
print("\n4 самых важных для lr_scores:")
print(top_lr_features)
for i in top_lr_features_score:
print(round(i, 4))
print("\n4 самых важных для rf_scores:")
print(top_rf_features)
for i in top_rf_features_score:
print(round(i, 4))
print("\n4 самых важных для f_scores:")
print(top_f_features)
for i in top_f_features_score:
print(round(i, 4))