diff --git a/romanova_adelina_lab_5/1.png b/romanova_adelina_lab_5/1.png new file mode 100644 index 0000000..3845e0a Binary files /dev/null and b/romanova_adelina_lab_5/1.png differ diff --git a/romanova_adelina_lab_5/README.md b/romanova_adelina_lab_5/README.md new file mode 100644 index 0000000..a2469ed --- /dev/null +++ b/romanova_adelina_lab_5/README.md @@ -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) + +## Вывод + +На основе полученных результатов, можно сказать, что классическая модель линейной регрессии является более чем подходящей для решения именно этой конкретной задачи + diff --git a/romanova_adelina_lab_5/lab.py b/romanova_adelina_lab_5/lab.py new file mode 100644 index 0000000..7419ad8 --- /dev/null +++ b/romanova_adelina_lab_5/lab.py @@ -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_}") +