лаба 2 степ2

This commit is contained in:
DmitriyAntonov 2023-09-30 21:07:59 +04:00
parent c943260db9
commit fc35bc8158
3 changed files with 65 additions and 184 deletions

View File

@ -11,94 +11,46 @@
# Вариант 3
Данные: make_classification (n_samples=500, n_features=2,
n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)
Линейная регрессия (LinearRegression) , Сокращение признаков
Случайными деревьями (Random Forest Regressor), Линейная корреляция
(f_regression)
# Запуск
Выполнением скрипта файла (вывод в консоль + рисует графики).
Выполнением скрипта файла (вывод в консоль).
# Модели:
1. Линейная регрессия
1. Полиномиальная регрессия (со степенью 3)
1. Гребневая полиномиальная регрессия (со степенью 3, alpha = 1.0)
1. Линейная регрессия (LinearRegression)
1. Сокращение признаков cлучайными деревьями (Random Forest Regressor)
1. Линейная корреляция (f_regression)
# Графики
# Пояснения
<div>
Качество каждой модели может быть оценено на основе среднеквадратичной ошибки (MSE).
Более низкая MSE указывает на лучшее соответствие данным.
Однако выбор модели зависит от набора данных и лежащей в основе взаимосвязи между объектами и целевой переменной.
Выбор наиболее подходящего метода ранжирования объектов зависит от специфики набора данных и требований
к модели.
Линейная регрессия: Линейная регрессия предполагает линейную зависимость между признаками и целевой переменной.
Это хорошо работает, когда взаимосвязь линейна, а шум в наборе данных минимален.
Лучше всего сработала на наборе лун. Хуже всего на кругах.
На линейном наборе показала себя на равне с остальными.
Линейная регрессия - это простой и понятный метод, который может быть использован для предсказания значений.
Он хорошо работает, если зависимость между переменными является линейной.
Однако, если данные содержат сложные нелинейные зависимости, линейная регрессия может
оказаться не очень эффективной.
Полиномиальная и гребневая показали примерно одинаково на всех наборах.
Уменьшение признаков с помощью случайных деревьев (Random Forest Regressor) - это мощный метод,
который способен обрабатывать сложные взаимосвязи в данных, даже если они нелинейные.
Он основан на идее создания ансамбля деревьев решений, каждое из которых дает свой голос за
наиболее подходящий ответ. Случайные леса обычно дают хорошие результаты и являются устойчивыми
к переобучению.
Полиномиальная регрессия (степень=3):
Полиномиальная регрессия обеспечивает более гибкую подгонку за счет полинома более высокого порядка(кубическая кривая).
Она может выявить более сложные взаимосвязи между объектами и целевой переменной.
Она может сработать лучше, чем линейная регрессия, если истинная взаимосвязь нелинейна.
Гребневая регрессия (степень= 3, альфа=1,0):
В случае полиномиальной регрессии с регуляризацией (альфа=1,0) модель добавляет коэффициент регуляризации
для управления сложностью обучения. Регуляризация помогает предотвратить переобучение, когда набор
данных содержит шум или когда он ограничен.
Линейная корреляция или f_regression - это статистический метод, который используется для измерения
степени связи между двумя переменными. Он может помочь определить, есть ли вообще связь между переменными,
но не подходит для ранжирования объектов.
</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>
Итоговая модель подбирается учитывая зависимость в данных,
как правило полиномиальная регрессия справляется лучше, а коэф регуляризации в гребневой регрессии помогает избежать
переобучения.
В общем, выбор между линейной регрессией и случайными лесами зависит от характеристик данных.
Если данные имеют линейную зависимость, то линейная регрессия будет предпочтительнее.
Если данные содержат сложные, возможно нелинейные взаимосвязи, то Random Forest может быть лучшим выбором.
В любом случае, важно провести предварительное исследование данных и тестирование различных моделей,
чтобы выбрать наиболее подходящую.
</div>

View File

@ -1,50 +0,0 @@
import numpy as np
from sklearn.datasets import make_regression
from sklearn.feature_selection import RFECV, f_regression
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
# генерируем исходные данные: 100 строк-наблюдений и 10 столбцов-признаков
X, y = make_regression(n_samples=100, n_features=10, random_state=42)
# линейная модель
linear_reg = LinearRegression()
linear_reg.fit(X, y)
linear_ranking_lr = np.abs(linear_reg.coef_)
# cокращение признаков cлучайными деревьями (Random Forest Regressor)
rf_reg = RandomForestRegressor()
rfecv = RFECV(estimator=rf_reg)
rfecv.fit(X, y)
rfecv_ranking = rfecv.ranking_
# линейная корреляция (f_regression)
f_reg, _ = f_regression(X, y)
linear_corr_ranking = f_reg
# ранжирование признаков и вычисление средней оценки
all_rankings = np.vstack((linear_ranking_lr, rfecv_ranking, linear_corr_ranking))
average_ranking = np.mean(all_rankings, axis=0)
# средние показатели четырех наиболее важных характеристик
most_important_indices = np.argsort(average_ranking)[-4:]
# результаты
print("ранги линейной модели:")
print(linear_ranking_lr)
print("")
print("ранги после сокращения признаков Random Forest:")
print(rfecv_ranking)
print("")
print("ранги линейнейной корреляции (f_regression):")
print(linear_corr_ranking)
print("")
print("ранги по средней оценке:")
print(average_ranking)
print("")
print("4 выделенных главных признака:")
print(most_important_indices)

View File

@ -1,71 +1,50 @@
from operator import itemgetter
from sklearn.feature_selection import f_regression
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.preprocessing import MinMaxScaler
import numpy as np
from sklearn.datasets import make_regression
from sklearn.feature_selection import RFECV, f_regression
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
# генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
np.random.seed(0)
size = 750
X = np.random.uniform(0, 1, (size, 14))
# Задаем функцию-выход: регрессионную проблему Фридмана
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
# Добавляем зависимость признаков
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
# генерируем исходные данные: 100 строк-наблюдений и 10 столбцов-признаков
X, y = make_regression(n_samples=100, n_features=10, random_state=42)
# линейная модель
lr = LinearRegression()
lr.fit(X, Y)
# гребневая модель
ridge = Ridge(alpha=7)
ridge.fit(X, Y)
# Лассо
lasso = Lasso(alpha=.05)
lasso.fit(X, Y)
linear_reg = LinearRegression()
linear_reg.fit(X, y)
linear_ranking_lr = np.abs(linear_reg.coef_)
names = ["x%s" % i for i in range(1, 15)]
# cокращение признаков cлучайными деревьями (Random Forest Regressor)
rf_reg = RandomForestRegressor()
rfecv = RFECV(estimator=rf_reg)
rfecv.fit(X, y)
rfecv_ranking = rfecv.ranking_
# линейная корреляция (f_regression)
f_reg, _ = f_regression(X, y)
linear_corr_ranking = f_reg
def rank_to_dict(ranks, names):
ranks = np.abs(ranks)
minmax = MinMaxScaler()
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
ranks = map(lambda x: round(x, 2), ranks)
return dict(zip(names, ranks))
# ранжирование признаков и вычисление средней оценки
all_rankings = np.vstack((linear_ranking_lr, rfecv_ranking, linear_corr_ranking))
average_ranking = np.mean(all_rankings, axis=0)
# средние показатели четырех наиболее важных характеристик
most_important_indices = np.argsort(average_ranking)[-4:]
ranks = {}
ranks["Linear reg"] = rank_to_dict(lr.coef_, names)
ranks["Ridge"] = rank_to_dict(ridge.coef_, names)
ranks["Lasso"] = rank_to_dict(lasso.coef_, names)
# результаты
print("ранги линейной модели:")
print(linear_ranking_lr)
print("")
# Создаем пустой список для данных
mean = {}
# «Бежим» по списку ranks
for key, value in ranks.items():
# «Пробегаемся» по списку значений ranks, которые являются парой имя:оценка
for item in value.items():
# имя будет ключом для нашего mean
# если элемента с текущим ключем в mean нет - добавляем
if item[0] not in mean:
mean[item[0]] = 0
# суммируем значения по каждому ключу-имени признака
mean[item[0]] += item[1]
# находим среднее по каждому признаку
for key, value in mean.items():
res = value / len(ranks)
mean[key] = round(res, 2)
# сортируем и распечатываем список
mean = sorted(mean.items(), key=itemgetter(1), reverse=True)
print("MEAN")
print(mean)
print("ранги после сокращения признаков Random Forest:")
print(rfecv_ranking)
print("")
for key, value in ranks.items():
ranks[key] = sorted(value.items(), key=itemgetter(1), reverse=True)
for key, value in ranks.items():
print(key)
print(value)
print("ранги линейнейной корреляции (f_regression):")
print(linear_corr_ranking)
print("")
f, pval = f_regression(X, Y, center=True)
print("ранги по средней оценке:")
print(average_ranking)
print("")
print("4 выделенных главных признака:")
print(most_important_indices)