Merge pull request 'romanova_adelina_lab_5 is ready' (#279) from romanova_adelina_lab_5 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/279
This commit is contained in:
commit
ac68008d93
BIN
romanova_adelina_lab_5/1.png
Normal file
BIN
romanova_adelina_lab_5/1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
79
romanova_adelina_lab_5/README.md
Normal file
79
romanova_adelina_lab_5/README.md
Normal file
@ -0,0 +1,79 @@
|
||||
# Лабораторная работа №5. Вариант 21
|
||||
|
||||
## Тема:
|
||||
Регрессия
|
||||
|
||||
## Модель:
|
||||
|
||||
LinearRegression
|
||||
|
||||
## Как запустить программу:
|
||||
Установить *python, numpy, matplotlib, sklearn*
|
||||
```
|
||||
python lab.py
|
||||
```
|
||||
|
||||
## Какие технологии использовались:
|
||||
Язык программирования Python, библиотеки numpy, matplotlib, sklearn
|
||||
|
||||
Среда разработки VSCode
|
||||
|
||||
# Что делает лабораторная работа:
|
||||
|
||||
Поскольку артериальное давление пациента в состоянии покоя является важным медицинским показателем, оно было выбрано для предсказания на основе доступных признаков, таких как возраст, пол и других.
|
||||
|
||||
Внедрение линейной регрессии в решение задачи прогнозирования артериального давления в состоянии покоя приносит несколько ключевых преимуществ.
|
||||
|
||||
Линейная регрессия является мощным инструментом в области статистики и машинного обучения, широко применяемым для анализа и моделирования связей между зависимыми и независимыми переменными. Ее основная цель — построить линейную функцию, наилучшим образом приближающую отношение между входными данными и целевой переменной. Это позволяет предсказывать значения целевой переменной на основе новых входных данных.
|
||||
|
||||
### Описание:
|
||||
```LinearRegression``` - метод наименьших квадратов (MSE) – это основной принцип LinearRegression. Он стремится минимизировать сумму квадратов разностей между фактическими и предсказанными значениями. Этот алгоритм предоставляет аналитическое решение для определения коэффициентов линейной модели, что делает его эффективным и простым для понимания.
|
||||
|
||||
Процесс обучения линейной регрессии требует выполнения следующих шагов:
|
||||
|
||||
1. Получить исходные данные
|
||||
|
||||
2. Выбрать целевое значение, которые нужно предсказывать
|
||||
|
||||
3. Обработать данные таким образом, чтобы все признаки имели только числовой формат, и добавить нормализацию, или иначе, стандартизацию данных
|
||||
|
||||
4. 4. Провести обучение выбранной модели на подготовленных данных
|
||||
|
||||
Обработка данных происходит с помощью функции ```str_features_to_numeric```:
|
||||
|
||||
```
|
||||
def str_features_to_numeric(data):
|
||||
# Преобразовывает все строковые признаки в числовые.
|
||||
|
||||
# Определение категориальных признаков
|
||||
categorical_columns = []
|
||||
numerics = ['int8', 'int16', 'int32', 'int64', 'float16', 'float32', 'float64']
|
||||
features = data.columns.values.tolist()
|
||||
for col in features:
|
||||
if data[col].dtype in numerics: continue
|
||||
categorical_columns.append(col)
|
||||
|
||||
# Кодирование категориальных признаков
|
||||
for col in categorical_columns:
|
||||
if col in data.columns:
|
||||
le = LabelEncoder()
|
||||
le.fit(list(data[col].astype(str).values))
|
||||
data[col] = le.transform(list(data[col].astype(str).values))
|
||||
|
||||
return data
|
||||
```
|
||||
|
||||
Далее происходит нормализация с помощью ```StandardScaler```.
|
||||
|
||||
В качестве целевого признака был выбран артериальное давление в состоянии покоя ```trestbps```- артериальное давление в состоянии покоя (в мм рт. ст. при поступлении в больницу). Обработанные данные поступают на вход обучения модели линейной регресии:
|
||||
|
||||
![](1.png "")
|
||||
|
||||
- reg.score_ - отображает точность работы модели
|
||||
- reg.coef_ - отображает коэффициенты при признаках расположенных по порядку
|
||||
- reg.intercept_ - показывает параметр смещения (в английской литературе bias)
|
||||
|
||||
## Вывод
|
||||
|
||||
На основе полученных результатов, можно сказать, что классическая модель линейной регрессии является более чем подходящей для решения именно этой конкретной задачи
|
||||
|
87
romanova_adelina_lab_5/lab.py
Normal file
87
romanova_adelina_lab_5/lab.py
Normal file
@ -0,0 +1,87 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
import seaborn as sns
|
||||
import sklearn
|
||||
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
|
||||
|
||||
|
||||
from sklearn.preprocessing import (LabelEncoder,
|
||||
StandardScaler,
|
||||
MinMaxScaler,
|
||||
RobustScaler)
|
||||
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold, learning_curve, ShuffleSplit
|
||||
|
||||
|
||||
def str_features_to_numeric(data):
|
||||
# Преобразовывает все строковые признаки в числовые.
|
||||
|
||||
# Определение категориальных признаков
|
||||
categorical_columns = []
|
||||
numerics = ['int8', 'int16', 'int32', 'int64', 'float16', 'float32', 'float64']
|
||||
features = data.columns.values.tolist()
|
||||
for col in features:
|
||||
if data[col].dtype in numerics: continue
|
||||
categorical_columns.append(col)
|
||||
|
||||
# Кодирование категориальных признаков
|
||||
for col in categorical_columns:
|
||||
if col in data.columns:
|
||||
le = LabelEncoder()
|
||||
le.fit(list(data[col].astype(str).values))
|
||||
data[col] = le.transform(list(data[col].astype(str).values))
|
||||
|
||||
return data
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = pd.read_csv("..//heart_disease_uci.csv")
|
||||
data['target'] = data['trestbps']
|
||||
data = data.drop(columns=['id', 'dataset', 'trestbps'])
|
||||
|
||||
data_wo_null = data.dropna()
|
||||
print(len(data_wo_null))
|
||||
|
||||
encoded_data_wo_null = str_features_to_numeric(data_wo_null)
|
||||
print(len(encoded_data_wo_null))
|
||||
|
||||
# Model standartization
|
||||
# The standard score of a sample x is calculated as:
|
||||
# z = (x - мат.ож.) / (стандартное отклонение)
|
||||
scaler = StandardScaler()
|
||||
new_data = pd.DataFrame(scaler.fit_transform(encoded_data_wo_null), columns = encoded_data_wo_null.columns)
|
||||
|
||||
dataset = data_wo_null.copy() # original data
|
||||
target_name = 'target'
|
||||
target = data_wo_null.pop(target_name)
|
||||
|
||||
test_train_split_part = 0.2
|
||||
random_state = 42
|
||||
|
||||
train, valid, train_target, valid_target = train_test_split(new_data, target,
|
||||
test_size=test_train_split_part,
|
||||
random_state=random_state)
|
||||
|
||||
reg = LinearRegression().fit(train, train_target)
|
||||
|
||||
print("---"*15, " LinearRegression ", "---"*15)
|
||||
print(f"Accuracy: {reg.score(valid, valid_target)}")
|
||||
print(f"коэффициенты: {reg.coef_}")
|
||||
print(f"Смещение относительно начала координат (bias): {reg.intercept_}")
|
||||
|
||||
SGD_reg = SGDRegressor(max_iter=1000, tol=1e-3)
|
||||
SGD_reg.fit(train, train_target)
|
||||
|
||||
print("---"*15, " SGDRegressor ", "---"*15)
|
||||
print(f"Accuracy: {SGD_reg.score(valid, valid_target)}")
|
||||
print(f"коэффициенты: {SGD_reg.coef_}")
|
||||
print(f"Смещение относительно начала координат (bias): {SGD_reg.intercept_}")
|
||||
|
||||
Ridge_clf = Ridge(alpha=1.0)
|
||||
Ridge_clf.fit(train, train_target)
|
||||
|
||||
print("---"*15, " Ridge ", "---"*15)
|
||||
print(f"Accuracy: {Ridge_clf.score(valid, valid_target)}")
|
||||
print(f"коэффициенты: {Ridge_clf.coef_}")
|
||||
print(f"Смещение относительно начала координат (bias): {Ridge_clf.intercept_}")
|
||||
|
Loading…
Reference in New Issue
Block a user