Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 42

Міністерство освіти та науки України

Національний університет «Львівська політехніка»

Інститут комп’ютерних наук та інформаційних технологій

Кафедра систем штучного інтелекту

Звіт до розрахунково-графічної роботи

з дисципліни

«Математичні методи дослідження операцій»

Виконав:

студент групи ШІ – 23

Пешко Максим

Викладач:

Шиманський В. М.

Львів 2024 р.
Зміст пояснювальної записки
Зміст
Вступ....................................................................................................................4

1. Актуальність проблеми............................................................................4

2. Мета дослідження......................................................................................4

3. Задачі дослідження....................................................................................5

Змістовна постановка задачі операційного дослідження..........................6

Формальна постановка задачі.......................................................................9

1. Загальний опис...........................................................................................9

2. Математична модель..............................................................................10

2.1 Позначки та змінні.............................................................................10

2.2 Цільова функція.................................................................................10

2.3 Обмеження...........................................................................................10

3. Алгоритм вирішення..............................................................................10

1. Очищення та підготовка даних:...........................................................10

2. Вибір моделі машинного навчання:....................................................11

3. Навчання моделі:.....................................................................................11

4. Оцінка моделі:..........................................................................................11

5. Аналіз факторів, що впливають на медичні витрати:.....................11

6. Розробка рекомендацій:.........................................................................11

4. Очікувані результати..............................................................................11

5. Вплив та застосування............................................................................12

Аналіз методів та алгоритмів розв'язування задачі................................12

1. Аналіз:........................................................................................................12
2. Переваги лінійної регресії......................................................................12

3. Обґрунтування вибору лінійної регресії.............................................13

4. Алгоритм лінійної регресії.....................................................................13

4.1 Підготовка даних................................................................................13

4.2 Навчання моделі.................................................................................13

4.3 Оцінка моделі......................................................................................13

4.4 Інтерпретація та візуалізація результатів.....................................14

5. Висновок.................................................................................................14

Описання ключових моментів програмної реалізації.............................15

1. Імпорт бібліотек.......................................................................................15

2. Зчитування та підготовка даних..........................................................15

3. Візуальний аналіз даних.........................................................................16

4. Підготовка даних до навчання моделі.................................................16

5. Розділення даних на навчальну та тестову множини......................16

6. Навчання моделі лінійної регресії........................................................17

7. Оцінка моделі...........................................................................................17

8. Перехресна перевірка.............................................................................17

9. Візуалізація результатів.........................................................................17

10. Порівняння різних методів регресії...................................................18

Аналіз та інтерпретація отриманих результатів......................................19

5.1 Огляд Даних...........................................................................................19

5.2 Підготовка Даних..................................................................................19

5.3 Обробка Категоріальних Даних.........................................................23

5.4 Масштабування Даних.........................................................................23


5.5 Розділення Даних...................................................................................23

5.6 Побудова Моделі....................................................................................24

5.7 Коефіцієнти Моделі...............................................................................24

5.8 Оптимізація за Допомогою Градієнтного Спуску...........................25

5.9 Висновки.................................................................................................25

Висновок...........................................................................................................26

Список літератури..........................................................................................27
Вступ

1. Актуальність проблеми
Зростання витрат на охорону здоров'я стає все більшою проблемою для
багатьох країн світу. Ці витрати містять в собі оплату лікарських послуг,
лікарняного стаціонару, медикаментів та інших медичних товарів та
послуг. Аналіз та прогнозування медичних витрат є важливим завданням
для державних органів, страхових компаній, медичних закладів та інших
учасників системи охорони здоров'я.

Традиційні методи прогнозування медичних витрат часто ґрунтуються на


статистичних моделях, які мають певні обмеження. Ці моделі можуть бути
нездатними врахувати складні взаємозв'язки між різними факторами, що
впливають на медичні витрати, та не завжди дають точні прогнози для
індивідуальних пацієнтів.

Машинне навчання пропонує нові можливості для прогнозування


медичних витрат. ML-алгоритми можуть навчатися на великих наборах
даних пацієнтів та виявляти складні закономірності, які неможливо
виявити за допомогою традиційних методів. Це може призвести до більш
точних та індивідуальних прогнозів, що може допомогти покращити
прийняття рішень щодо управління ресурсами в системі охорони здоров'я.

2. Мета дослідження

Метою цього дослідження є розробка та оцінка моделей машинного


навчання для прогнозування медичних витрат.
3. Задачі дослідження

● Вивчити та проаналізувати існуючі методи прогнозування медичних

витрат.
● Описати та підготувати набір даних для прогнозування медичних

витрат.
● Розробити та реалізувати моделі машинного навчання для
прогнозування медичних витрат.
● Оцінити ефективність моделей машинного навчання та порівняти їх

з традиційними методами.
● Зробити висновки та рекомендації щодо використання моделей

машинного навчання для прогнозування медичних витрат.


Змістовна постановка задачі операційного
дослідження

Опис:

У цьому проєкті дослідження ставиться задача розробки моделі


машинного навчання для прогнозування індивідуальних медичних витрат
на основі даних про застрахованих осіб. Ця модель може стати цінним
інструментом для страхових компаній, адже допоможе їм:

● Краще розуміти фактори, які впливають на медичні витрати. Це

знання може бути використано для оцінки ризиків, розробки


тарифних планів та прийняття рішень щодо управління ризиками.
● Розробляти більш справедливі тарифні плани. Завдяки кращому

розумінню факторів, що впливають на медичні витрати, страхові


компанії можуть створювати тарифні плани, які більш точно
відображають індивідуальний ризик кожного застрахованого.
● Знижувати витрати на охорону здоров'я. Ефективне управління

ризиками та розробка більш точних тарифних планів може


допомогти страховим компаніям знизити загальні витрати на
охорону здоров'я.
● Покращувати загальний стан здоров'я населення. Завдяки
кращому розумінню факторів, що впливають на медичні витрати,
страхові компанії можуть розробляти програми та послуги,
спрямовані на профілактику захворювань та покращення загального
стану здоров'я своїх застрахованих.

Дані:

Дані для цього проєкту взяті з файлу insurance.csv. Цей файл містить
інформацію про застрахованих осіб, включаючи:
● Вік: Цей фактор може мати значний вплив на медичні витрати, адже

з віком люди зазвичай потребують більше медичних послуг.


● Індекс маси тіла (ІМТ): ІМТ є мірою ваги та зросту людини і може

бути індикатором ризику розвитку певних захворювань, таких як


серцево-судинні захворювання та діабет, які можуть призвести до
значних медичних витрат.
● Кількість дітей: Наявність дітей може збільшити медичні витрати

застрахованої особи, адже їм також потрібні медичні послуги.


● Статус куріння: Куріння є фактором ризику розвитку багатьох

захворювань, тому курці, як правило, мають вищі медичні витрати,


ніж некурці.
● Регіон проживання: Медичні витрати можуть варіюватися залежно

від регіону проживання через різні фактори, такі як доступність


медичних послуг, вартість життя та рівень захворюваності.
● Медичні витрати за рік: Цей параметр є цільовою змінною, яку

модель машинного навчання має навчитися прогнозувати.

Цілі:

● Розробити та навчити модель машинного навчання для


прогнозування індивідуальних медичних витрат. Модель
повинна бути точною, надійною та здатною узагальнювати нові дані.
● Оцінити точність та надійність моделі. Для цього будуть
використовуватися метрики, такі як R-квадрат, середня квадратична
похибка (MSE) та перехресна перевірка.
● Проаналізувати фактори, які впливають на медичні витрати. Це

буде зроблено за допомогою таких методів, як аналіз важливості


функцій та візуалізація.

Методи:
 Очищення та підготовка даних: Дані будуть очищені від помилок,
пропущених значень та несумісностей.
 Стандартизація чисельних ознак: Чисельні ознаки, такі як вік та ІМТ
(індекс маси тіла), будуть стандартизовані, щоб вони мали
однаковий масштаб.
 Кодування категоріальних ознак: Категоріальні ознаки, такі як
статус куріння та регіон проживання, будуть закодовані за
допомогою one-hot кодування або заміни на числові значення.
 Масштабування цільової змінної: Цільова змінна, charges, буде
також масштабована для покращення якості моделі.
 Поділ даних на тренувальний і тестовий набори: Дані будуть
поділені на тренувальний та тестовий набори, щоб оцінити
продуктивність моделі.
 Побудова моделей: Лінійна регресія та регресійні моделі з
регуляризацією L1 та L2 будуть використані для прогнозування
медичних витрат.
 Оцінка моделей: Моделі будуть оцінені за допомогою метрик, таких
як MSE (середньоквадратична помилка) та R2 (коефіцієнт
детермінації), як на тренувальних, так і на тестових даних.
 Візуалізація результатів: Результати моделювання будуть
візуалізовані за допомогою графіків, таких як scatter plot та box plot,
щоб краще зрозуміти взаємозв'язок між ознаками та цільовою
змінною.
Формальна постановка задачі
1. Загальний опис

Задача: Розробити модель машинного навчання для прогнозування


індивідуальних медичних витрат на основі даних про застрахованих осіб.

Дані:

● insurance.csv: Файл, що містить інформацію про застрахованих осіб,

включаючи:
○ age: Вік

○ bmi: Індекс маси тіла

○ children: Кількість дітей

○ smoker: Статус куріння (курець/некурець)

○ region: Регіон проживання

○ charges: Медичні витрати за рік


2. Математична модель
2.1 Позначки та змінні

● yi: Медичні витрати застрахованої особи i

● xi: Вектор ознак застрахованої особи i, що містить:

○ xi1: Вік

○ xi2: Індекс маси тіла

○ xi3: Кількість дітей

○ xi4: Статус куріння (1 - курець, 0 - некурець)

○ xi5: Регіон проживання (категоріальна змінна)

● f(⋅): Функція прогнозування, що описує зв'язок між

yi та xi

2.2 Цільова функція


Мінімізувати середню квадратичну похибку (MSE):

𝑀𝑆𝐸=1𝑁∑𝑖=1𝑁(𝑦𝑖−𝑓(𝑥𝑖))^2
Де N - загальна кількість застрахованих осіб.

2.3 Обмеження

Немає жодних явних обмежень для цієї задачі.

3. Алгоритм вирішення
1. Очищення та підготовка даних:

1. Видалити пропущені значення та несумісності.


2. Перетворити категоріальні ознаки (регіон) на чисельні за
допомогою кодування (наприклад, one-hot encoding).
3. Стандартизувати чисельні ознаки (вік, ІМТ).
2. Вибір моделі машинного навчання:

1. Використовувати алгоритм машинного навчання, який


добре підходить для задач регресії, наприклад, лінійну
регресію, дерево рішень, випадковий ліс або нейронну
мережу.

3. Навчання моделі:

1. Розділити дані на тренувальний та тестовий набори.


2. Навчити модель на тренувальному наборі.

4. Оцінка моделі:

1. Оцінити точність моделі на тестовому наборі,


використовуючи метрики MSE, R-квадрат та інші.

5. Аналіз факторів, що впливають на медичні витрати:


1. Використовувати методи, такі як аналіз важливості ознак та
візуалізація, щоб визначити, які ознаки найбільше
впливають на медичні витрати.

6. Розробка рекомендацій:
1. Використовувати модель та результати аналізу факторів
для розробки рекомендацій щодо тарифних планів та
стратегій управління ризиками для страхових компаній.

4. Очікувані результати
1. Розроблена та навчена модель машинного навчання, яка
може прогнозувати індивідуальні медичні витрати з
високою точністю.
2. Оцінка точності та надійності моделі за допомогою метрик
MSE, R-квадрат та інших.
3. Виявлені ключові фактори, які впливають на медичні
витрати.
4. Розроблені рекомендації щодо тарифних планів та стратегій
управління ризиками для страхових компаній.

5. Вплив та застосування
Результати цієї задачі можуть мати значний вплив на страхову індустрію:

1. Допоможуть страховим компаніям краще розуміти


фактори, що впливають на медичні витрати.
2. Дозволять розробляти більш справедливі тарифні плани.

Аналіз методів та алгоритмів розв'язування задачі

1. Аналіз:

У цій задачі ми маємо на меті розробити модель машинного навчання для


прогнозування індивідуальних медичних витрат на основі даних про
застрахованих осіб. Згідно з попередніми етапами дослідження, я вирішив
використовувати алгоритм лінійної регресії.

2. Переваги лінійної регресії


Простота: Лінійна регресія є однією з найпростіших моделей машинного
навчання, її легко зрозуміти та інтерпретувати.
Ефективність: Лінійна регресія може бути навчена та підготована, щоб
робити прогнози дуже швидко, що робить її хорошою для задач з
великими наборами даних.
Інтерпретованість: Можна легко зрозуміти, як кожна змінна впливає на
прогноз, аналізуючи коефіцієнти регресії.
3. Обґрунтування вибору лінійної регресії
Зважаючи на переваги та недоліки лінійної регресії, я вважаю, що вона є
хорошим вибором для цієї задачі з таких причин:

Аналіз даних: На основі візуалізації та описової статистики можна


зробити висновок, що зв'язок між медичними витратами та ознаками (вік,
ІМТ, кількість дітей, статус куріння) не є явно нелінійним.
Інтерпретованість: Оскільки лінійна регресія має просту форму, важливі
фактори, що впливають на медичні витрати, можна буде легко визначити
на основі коефіцієнтів регресії.
Швидкість навчання: Завдяки своїй простоті лінійна регресія може бути
навчена та зроблена прогнози дуже швидко, що робить її відповідною для
роботи з великими наборами даних, як у нашому випадку.

4. Алгоритм лінійної регресії

4.1 Підготовка даних


Очистити та підготувати дані, як описано в попередньому розділі.
Розділити дані на тренувальний та тестовий набори.

4.2 Навчання моделі


Використовувати алгоритм лінійної регресії з бібліотеки scikit-learn для
навчання моделі на тренувальному наборі даних.
Отримати коефіцієнти регресії, які описують зв'язок між цільовою зміною
(медичними витратами) та ознаками.

4.3 Оцінка моделі


Оцінити точність моделі на тестовому наборі даних, використовуючи
метрики MSE, R-квадрат та інші.
Проаналізувати залишки моделі, щоб перевірити наявність будь-яких
проблем, таких як гетероскедастичність або автокореляція.

4.4 Інтерпретація та візуалізація результатів


Інтерпретувати коефіцієнти регресії, щоб визначити, які ознаки найбільше
впливають на медичні витрати.
Візуалізувати зв'язок між прогнозами та фактичними значеннями
медичних витрат.

5. Висновок

Лінійна регресія - це простий, але ефективний алгоритм машинного


навчання, який може бути використаний для прогнозування медичних
витрат. Завдяки своїй простоті, інтерпретовності та обчислювальній
ефективності, лінійна регресія робить її чудовим вибором для початкових
досліджень в цій галузі. Однак важливо пам'ятати про обмеження лінійної
регресії та розглянути більш складні алгоритми, якщо дані мають
нелінійні залежності, складні взаємозв'язки або шум.
Описання ключових моментів програмної реалізації

1. Імпорт бібліотек
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

2. Зчитування та підготовка даних


● Зчитується файл insurance.csv за допомогою pd.read_csv

● Використовуються методи head() та describe() для ознайомлення з

даними. Крім того, можна використати методи info() та shape для


отримання додаткової інформації про типи даних та розмірність дата
сету.
● Обираються необхідні стовпчики (columns_of_interest) та
створюється підмножина даних df_subset. Це дозволяє
зосередитися на аналізі конкретних ознак, що впливають на цільову
змінну.
● Відображаються перші рядки даних за допомогою
Print(data.head()). За замовчуванням виводиться перших 5 рядків, але
можна змінити цю кількість за допомогою аргументу n.
3. Візуальний аналіз даних
● Створюються графіки розподілу для кожної ознаки та цільової

змінної за допомогою sns.scatterplot та sns.boxplot. Це допомагає


візуально оцінити зв'язок між змінними, наявність аномальних
значень (випадків) та загальний розподіл даних.

4. Підготовка даних до навчання моделі


● Категоріальна ознака region перетворюється на числові за

допомогою pd.get_dummies. Цей процес називається dummy


кодуванням і дозволяє моделі лінійної регресії працювати з
категоріальними даними.
● Числові ознаки (age, bmi, charges) стандартизуються за
допомогою StandardScaler. Стандартизація переводить усі ознаки до
однакового масштабу, що може покращити збіжність алгоритму
градієнтного спуску під час навчання моделі.
● Текстові значення в категоріальних змінних (smoker, sex)
замінюються на числові (yes -> 1, no -> 0, female -> 1, male -> -1).
Це також підготовка до навчання моделі, оскільки вона працює з
числовими даними. Заміна виконується словником (dictionary) або за
допомогою умовних операторів.

5. Розділення даних на навчальну та тестову множини


● Дані розділяються на навчальну та тестову множини за
допомогою train_test_split зі співвідношенням 80/20. Навчальна
множина використовується для тренування моделі, а тестова - для
оцінки її ефективності на невідомих раніше даних.
● Перевіряються розмірності навчальної та тестової множин. Це

робиться за допомогою атрибуту shape дата фрейму.


6. Навчання моделі лінійної регресії
● Створюється екземпляр класу LinearRegression з бібліотеки scikit-

learn. Це клас для реалізації моделі лінійної регресії.


● Модель навчається на навчальній множині X_train та y_train.

Метод fit моделі використовує алгоритм градієнтного спуску для


пошуку оптимальних коефіцієнтів, що мінімізують функцію втрат.

7. Оцінка моделі
● Оцінюється ефективність моделі на тестовій множині за
допомогою коефіцієнта детермінації (R-squared) та
середньоквадратичної помилки (MSE) з функцій r2_score та
mean_squared_error. R-squared показує, яку частку дисперсії цільової
змінної пояснює модель, значення ближче до 1 означає краще
пояснення.

8. Перехресна перевірка
● Використовується cross_val_score з sklearn.model_selection для

оцінки моделі за допомогою перехресної перевірки. Це метод


багаторазового розбиття даних на навчальні та тестові множини, що
дає більш надійну оцінку ефективності моделі.
● Розраховуються середні значення R2, MSE та CV. Це дає

уявлення про загальну продуктивність моделі на різних


підмножинах даних.

9. Візуалізація результатів
● Створюються графіки залишків та відхилень y_test від y_pred.

Залишки - це різниця між фактичними та прогнозованими


значеннями, їх аналіз може допомогти виявити аномальні значення,
нелінійні залежності або інші проблеми з моделлю.
● Порівнюються y_test та y_pred за допомогою точкової діаграми.

Це дає візуальне уявлення про те, наскільки добре модель прогнозує


цільову зміну.

10. Порівняння різних методів регресії


● Реалізуються алгоритми лінійної регресії з регуляризацією L1 та

L2. Регуляризація використовується для запобігання перенавчання


та покращення узагальнення моделі.
● Оптимізуються параметри регуляризації (lambda_) за допомогою

методу золотого перетину. Цей метод пошуку оптимального


значення параметра, що мінімізує функцію втрат.
● Порівнюються результати моделей з регуляризацією та без неї за

MSE та коефіцієнтами theta. Це допомагає вибрати модель, яка


найкраще підходить для даного завдання.
Аналіз та інтерпретація отриманих результатів

5.1 Огляд Даних


Розглядаючи набір даних `insurance.csv`, що містить інформацію про
страхувальні премії на основі різних факторів. Набір даних містить такі
стовпці: вік (age), стать (sex), індекс маси тіла (BMI), кількість дітей
(children), наявність шкідливої звички паління (smoker), регіон
проживання (region), та страхувальні витрати (charges).

5.2 Підготовка Даних


Спочатку я зчитав дані з файлу та переглянули перші кілька рядків для
перевірки їх коректності:

data = pd.read_csv('insurance.csv')
print(data.head())

Потім я використали бібліотеку Seaborn для створення різних графіків,


щоб візуально оцінити взаємозв'язок між змінними:
Рис. 1 Зв'язки між віком і страховими витратами

Виявлено позитивний кореляційний зв'язок, де збільшення віку


асоціюється зі збільшенням страхових витрат.

Рис. 2 Зв'язки між Статтю і страховими витратами


Графік не вказав на суттєву різницю у витратах між чоловіками та
жінками.

Рис. 3 Зв'язки між Індексом маси тіла і страховими витратами

Позитивний кореляційний зв'язок, де збільшення BMI асоціюється зі


збільшенням страхових витрат.
Рис. 4 Зв'язки між кількістю дітей і страховими витратами

Незначний вплив кількості дітей на страхові витрати.

Рис. 5 Зв'язки між наявністю шкідливої звички й страховими витратами


Паління суттєво збільшує страхові витрати.
Рис. 6 Зв'язки між регіоном й страховими витратами

Незначні відмінності між регіонами.

5.3 Обробка Категоріальних Даних


Категоріальні дані, такі як стать, наявність шкідливої звички та регіон
проживання, були закодовані у числові значення для полегшення
моделювання:

data = pd.get_dummies(data, columns=['region'])


data = data.replace({"yes":1, "no":0})
data = data.replace({"female":1, "male":-1})
data = data.replace({True:1, False:0})

5.4 Масштабування Даних


Для покращення продуктивності моделей машинного навчання, числові
змінні були масштабовані:
from sklearn.preprocessing import StandardScaler
numeric_features = ['age', 'bmi', 'charges']
scaler = StandardScaler()
data[numeric_features] = scaler.fit_transform(data[numeric_features])

5.5 Розділення Даних


Дані були розділені на навчальний та тестовий набори для оцінки
продуктивності моделі:

from sklearn.model_selection import train_test_split


y = data['charges']
X = data.drop('charges', axis=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=1)

5.6 Побудова Моделі


Я використав лінійну регресію для моделювання даних та оцінили
продуктивність моделі:

from sklearn.linear_model import LinearRegression


from sklearn.metrics import mean_squared_error, r2_score
lr = LinearRegression()
lr.fit(X_train, y_train)

Результати моделі:
- R2-score для навчального набору: 0.75
- R2-score для тестового набору: 0.76
- MSE для навчального набору: 0.25
- MSE для тестового набору: 0.24
- Крос-валідація: середнє значення R2-скору: 0.74

Ці результати вказують на те, що модель добре узгоджується з даними та


може ефективно передбачати страхові витрати.

5.7 Коефіцієнти Моделі


Коефіцієнти лінійної регресії вказують на те, як зміна кожної з незалежних
змінних впливає на залежну змінну (страхові витрати):

coef = lr.coef_
print(coef)

Значення коефіцієнтів:
- Вік: 0.30
- Стать: 0.01
- BMI: 0.16
- Кількість дітей: 0.03
- Наявність шкідливої звички: 1.96
- Регіони: значення змінних відносно базового регіону.

5.8 Оптимізація за Допомогою Градієнтного Спуску


Реалізувавши градієнтний спуск для мінімізації функції втрат (MSE) з
використанням золотого перетину для динамічного визначення
оптимального кроку навчання. Я також розглянув регуляризацію L1 та L2,
щоб зменшити перенавчання.

5.9 Висновки
- Вік, BMI та наявність шкідливої звички мають значний вплив на страхові
витрати.
- Регіон проживання має менший, але все ж помітний вплив на витрати.
- Модель лінійної регресії показала хорошу продуктивність, але можуть
бути покращення за допомогою складніших моделей або додаткових
змінних.
- Регуляризація може допомогти зменшити перенавчання та покращити
узгодженість моделі.

Висновок

У рамках цього дослідження провів аналіз та моделювання даних з набору


insurance.csv, що містить інформацію про страхувальні витрати на основі
різних факторів.

Починаючи з огляду даних, я виявив певні зв'язки між факторами та


страховими витратами, такі як позитивна кореляція віку та індексу маси
тіла з витратами, а також значний вплив наявності шкідливої звички
паління. Графічний аналіз допоміг нам краще зрозуміти ці зв'язки.

Далі, я підготував дані для моделювання, використовуючи методи обробки


категоріальних даних та масштабування числових змінних. Побудували
модель лінійної регресії, яка показала хорошу узгодженість з даними та
здатність передбачати страхові витрати.
За допомогою градієнтного спуску та регуляризації і покращив результати
моделі, зменшивши значення MSE і підвищивши точність прогнозів.
Зокрема, застосування регуляризації L2 дозволило зменшити
перенавчання та покращити узгодженість моделі.

У цілому, наша робота показала, що з використанням відповідних методів


аналізу даних та моделювання можна отримати досить точні прогнози
страхових витрат на основі різних факторів. Подальші дослідження
можуть включати експерименти з іншими моделями та методами
оптимізації для досягнення ще кращих результатів.

Список літератури
Назва: Deep Learning

Автори: Ian Goodfellow, Yoshua Bengio, Aaron Courville

Посилання: https://www.deeplearningbook.org/

Назва: Pattern Recognition and Machine Learning

Автори: Christopher Bishop

Посилання: https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/

Назва: Hands-On Machine Learning with Scikit-Learn and TensorFlow

Автор: Aurélien Géron

Посилання:

https://www.oreilly.com/library/view/hands-on-machine-learning/9781492032632/
Назва: Machine Learning: A Probabilistic Perspective

Автор: Kevin P. Murphy

Посилання: https://mitpress.mit.edu/9780262018029/machine-learning/

Назва: The Hundred Most Important Questions in Machine Learning

Автори: David D. Freedman, Carl B. Freedman

Посилання: https://www.amazon.com/machine-learning-interview-questions/s?

k=machine+learning+interview+questions

Додаток А
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,
r2_score
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

data = pd.read_csv('insurance.csv')
df= data
columns_of_interest = ['age', 'bmi', 'children',
'charges']
df_subset = df[columns_of_interest]

data = pd.read_csv('insurance.csv')

print(data.head())

sns.set(style="whitegrid")

plt.figure(figsize=(10, 6))
sns.scatterplot(x='age', y='charges', data=data)
plt.title('Relationship between Age and Charges')
plt.xlabel('Age')
plt.ylabel('Charges')
plt.show()

plt.figure(figsize=(10, 6))
sns.boxplot(x='sex', y='charges', data=data)
plt.title('Relationship between Sex and Charges')
plt.xlabel('Sex')
plt.ylabel('Charges')
plt.show()

plt.figure(figsize=(10, 6))
sns.scatterplot(x='bmi', y='charges', data=data)
plt.title('Relationship between BMI and Charges')
plt.xlabel('BMI')
plt.ylabel('Charges')
plt.show()
plt.figure(figsize=(10, 6))
sns.scatterplot(x='children', y='charges', data=data)
plt.title('Relationship between Children and
Charges')
plt.xlabel('Children')
plt.ylabel('Charges')
plt.show()

plt.figure(figsize=(10, 6))
sns.boxplot(x='smoker', y='charges', data=data)
plt.title('Relationship between Smoker and Charges')
plt.xlabel('Smoker')
plt.ylabel('Charges')
plt.show()

plt.figure(figsize=(10, 6))
sns.boxplot(x='region', y='charges', data=data)
plt.title('Relationship between Region and Charges')
plt.xlabel('Region')
plt.ylabel('Charges')
plt.show()
data = pd.get_dummies(data, columns=['region'])

numeric_features = ['age', 'bmi', 'charges']

scaler = StandardScaler()

data[numeric_features] =
scaler.fit_transform(data[numeric_features])
data = data.replace({"yes":1, "no":0})
data = data.replace({"female":1, "male":-1})
data = data.replace({True:1, False:0})
y = data['charges']
X = data.drop('charges',axis=1)

X_train, X_test, y_train, y_test =


train_test_split(X, y, test_size=0.2, random_state=1)
print("x train: ",X_train.shape)
print("x test: ",X_test.shape)
print("y train: ",y_train.shape)
print("y test: ",y_test.shape)
CV = []
R2_train = []
R2_test = []
MSE_train = []
MSE_test = []

def med_pred_model(model):

model.fit(X_train, y_train)

y_pred_train = model.predict(X_train)
R2_train_model = r2_score(y_train, y_pred_train)
R2_train.append(round(R2_train_model, 2))

y_pred_test = model.predict(X_test)
R2_test_model = r2_score(y_test, y_pred_test)
R2_test.append(round(R2_test_model, 2))

MSE_train_model = mean_squared_error(y_train,
y_pred_train)
MSE_train.append(round(MSE_train_model, 2))

MSE_test_model = mean_squared_error(y_test,
y_pred_test)
MSE_test.append(round(MSE_test_model, 2))

cross_val = cross_val_score(model, X_train,


y_train, cv=5, scoring='r2')
cv_mean = cross_val.mean()
CV.append(round(cv_mean, 2))

print("Train R2-score :", round(R2_train_model,


2))
print("Test R2-score :", round(R2_test_model, 2))
print("Train MSE :", round(MSE_train_model, 2))
print("Test MSE :", round(MSE_test_model, 2))
print("Train CV scores :", cross_val)
print("Train CV mean :", round(cv_mean, 2))

fig, ax = plt.subplots(1, 2, figsize=(10, 4))


ax[0].set_title('Residual Plot of Train samples')
sns.histplot((y_train - y_pred_train), kde=True,
ax=ax[0])
ax[0].set_xlabel('y_train - y_pred_train')

ax[1].set_title('y_test vs y_pred_test')
ax[1].scatter(x=y_test, y=y_pred_test)
ax[1].set_xlabel('y_test')
ax[1].set_ylabel('y_pred_test')

plt.show()
lr = LinearRegression()
med_pred_model(lr)
coef = lr.coef_
print(coef)
X1 = X_train.copy()
y1 = y_train.copy()
X1['bias'] = 1

X1.head(10)

initial_weights = np.zeros(X1.shape[1])

X1.shape, initial_weights.shape
def mse_loss(X, y, theta):

predictions = X.dot(theta)
mse = ((predictions - y) ** 2).mean()
return mse
def gradient(X, y, theta):

predictions = X.dot(theta)
errors = predictions - y
gradient = 2 * X.T.dot(errors) / len(y)
return gradient

def golden_section_search(X, y, current_theta, grad,


tolerance=1e-6):

a, b = 0, 1
phi = (1 + np.sqrt(5)) / 2

def loss(alpha):
return mse_loss(X, y, current_theta - alpha *
grad)

x1 = b - (b - a) / phi
x2 = a + (b - a) / phi

f_values = {}

while abs(b - a) > tolerance:


if x1 not in f_values:
f_values[x1] = loss(x1)
if x2 not in f_values:
f_values[x2] = loss(x2)

if f_values[x1] <= f_values[x2]:


b = x2
x2 = x1
x1 = b - (b - a) / phi
else:
a = x1
x1 = x2
x2 = a + (b - a) / phi

optimal_lr = (a + b) / 2
return optimal_lr

def gradient_descent(X, y, starting_theta,


learning_rate=0.01, tolerance=1e-6,
max_iterations=10000):

theta = starting_theta
for i in range(max_iterations):
grad = gradient(X, y, theta)
learning_rate = golden_section_search(X, y,
theta, grad, tolerance)
theta -= learning_rate * grad
print("Кількість ітерацій:", i + 1)
print("Значення MSE:", mse_loss(X, y, theta))
print('learning rate:', learning_rate)
if np.linalg.norm(grad) < tolerance:
print("Кількість ітерацій:", i + 1)
break
return theta
def mse_loss_l1(X, y, theta, lambda_):
predictions = X.dot(theta)
mse = ((predictions - y) ** 2).mean()
l1_penalty = lambda_ * np.sum(np.abs(theta))
return mse + l1_penalty

def gradient_l1(X, y, theta, lambda_):

predictions = X.dot(theta)
errors = predictions - y
gradient = 2 * X.T.dot(errors) / len(y)
l1_gradient = lambda_ * np.sign(theta)
return gradient + l1_gradient

def golden_section_search(X, y, current_theta, grad,


lambda_, tolerance=1e-6):
a, b = 0, 1
phi = (1 + np.sqrt(5)) / 2

def loss(alpha):
return mse_loss_l1(X, y, current_theta - alpha
* grad, lambda_)

x1 = b - (b - a) / phi
x2 = a + (b - a) / phi

f_values = {}

while abs(b - a) > tolerance:


if x1 not in f_values:
f_values[x1] = loss(x1)
if x2 not in f_values:
f_values[x2] = loss(x2)

if f_values[x1] <= f_values[x2]:


b = x2
x2 = x1
x1 = b - (b - a) / phi
else:
a = x1
x1 = x2
x2 = a + (b - a) / phi

optimal_lr = (a + b) / 2
return optimal_lr

def gradient_descent_L1(X, y, starting_theta,


lambda_, learning_rate=0.01, tolerance=1e-6,
max_iterations=10000):
theta = starting_theta
for i in range(max_iterations):
grad = gradient_l1(X, y, theta, lambda_)
learning_rate = golden_section_search(X, y,
theta, grad, lambda_, tolerance)
theta -= learning_rate * grad
print("Кількість ітерацій:", i + 1)
print("Значення MSE з регуляризацією L1:",
mse_loss_l1(X, y, theta, lambda_))
print('learning rate:', learning_rate)
if np.linalg.norm(grad) < tolerance:
print("Кількість ітерацій:", i + 1)
break
return theta
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

def mse_loss_l2(X, y, theta, lambda_):


predictions = X.dot(theta)
mse = ((predictions - y) ** 2).mean()
l2_penalty = lambda_ * np.sum(theta**2)
return mse + l2_penalty

def gradient_l2(X, y, theta, lambda_):


predictions = X.dot(theta)
errors = predictions - y
gradient = 2 * X.T.dot(errors) / len(y)
l2_gradient = 2 * lambda_ * theta
return gradient + l2_gradient

def golden_section_search(X, y, current_theta, grad,


lambda_, tolerance=1e-6):
a, b = 0, 1
phi = (1 + np.sqrt(5)) / 2 # Золотий перетин

def loss(alpha):
return mse_loss_l2(X, y, current_theta - alpha
* grad, lambda_)

# Початкові точки для золотого перетину


x1 = b - (b - a) / phi
x2 = a + (b - a) / phi

f_values = {} # Локальний кеш для значень функції

while abs(b - a) > tolerance:


if x1 not in f_values:
f_values[x1] = loss(x1)
if x2 not in f_values:
f_values[x2] = loss(x2)

if f_values[x1] <= f_values[x2]:


b = x2
x2 = x1
x1 = b - (b - a) / phi
else:
a = x1
x1 = x2
x2 = a + (b - a) / phi

optimal_lr = (a + b) / 2
return optimal_lr
def gradient_descent_L2(X, y, starting_theta,
lambda_, learning_rate=0.01, tolerance=1e-6,
max_iterations=10000):

theta = starting_theta
for i in range(max_iterations):
grad = gradient_l2(X, y, theta, lambda_)
learning_rate = golden_section_search(X, y,
theta, grad, lambda_, tolerance)
theta -= learning_rate * grad
print("Кількість ітерацій:", i + 1)
print("Значення MSE з регуляризацією L2:",
mse_loss_l2(X, y, theta, lambda_))
print('learning rate:', learning_rate)
if np.linalg.norm(grad) < tolerance:
print("Кількість ітерацій:", i + 1)
break
return theta

starting_theta = np.random.rand(10)

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X1)
y_scaled = scaler.fit_transform(y1.values.reshape(-1,
1)).flatten()
optimal_theta_standard = gradient_descent(X_scaled,
y_scaled, starting_theta)
print()
print("Оптимальні значення параметрів регресії:",
optimal_theta_standard)
print("Значення MSE", mse_loss(X_scaled, y_scaled,
optimal_theta_standard))
optimal_theta_l1 = gradient_descent_L1(X_scaled,
y_scaled, optimal_theta_standard, lambda_=0.1)
print()
print("Оптимальні значення параметрів регресії:",
optimal_theta_l1)
print("Значення MSE з регуляризацією L1:",
mse_loss_l1(X_scaled, y_scaled, optimal_theta_l1,
lambda_=0.1))
optimal_theta_l2 = gradient_descent_L2(X_scaled,
y_scaled, optimal_theta_l1, lambda_=0.1)
print()
print("Оптимальні значення параметрів регресії:",
optimal_theta_l2)
print("Значення MSE з регуляризацією L2:",
mse_loss_l2(X_scaled, y_scaled, optimal_theta_l2,
lambda_=0.1))

You might also like