Professional Documents
Culture Documents
Пояснювальна Записка
Пояснювальна Записка
з дисципліни
Виконав:
студент групи ШІ – 23
Пешко Максим
Викладач:
Шиманський В. М.
Львів 2024 р.
Зміст пояснювальної записки
Зміст
Вступ....................................................................................................................4
1. Актуальність проблеми............................................................................4
2. Мета дослідження......................................................................................4
3. Задачі дослідження....................................................................................5
1. Загальний опис...........................................................................................9
2. Математична модель..............................................................................10
2.3 Обмеження...........................................................................................10
3. Алгоритм вирішення..............................................................................10
3. Навчання моделі:.....................................................................................11
4. Оцінка моделі:..........................................................................................11
6. Розробка рекомендацій:.........................................................................11
4. Очікувані результати..............................................................................11
5. Вплив та застосування............................................................................12
1. Аналіз:........................................................................................................12
2. Переваги лінійної регресії......................................................................12
5. Висновок.................................................................................................14
1. Імпорт бібліотек.......................................................................................15
7. Оцінка моделі...........................................................................................17
8. Перехресна перевірка.............................................................................17
9. Візуалізація результатів.........................................................................17
5.9 Висновки.................................................................................................25
Висновок...........................................................................................................26
Список літератури..........................................................................................27
Вступ
1. Актуальність проблеми
Зростання витрат на охорону здоров'я стає все більшою проблемою для
багатьох країн світу. Ці витрати містять в собі оплату лікарських послуг,
лікарняного стаціонару, медикаментів та інших медичних товарів та
послуг. Аналіз та прогнозування медичних витрат є важливим завданням
для державних органів, страхових компаній, медичних закладів та інших
учасників системи охорони здоров'я.
2. Мета дослідження
витрат.
● Описати та підготувати набір даних для прогнозування медичних
витрат.
● Розробити та реалізувати моделі машинного навчання для
прогнозування медичних витрат.
● Оцінити ефективність моделей машинного навчання та порівняти їх
з традиційними методами.
● Зробити висновки та рекомендації щодо використання моделей
Опис:
Дані:
Дані для цього проєкту взяті з файлу insurance.csv. Цей файл містить
інформацію про застрахованих осіб, включаючи:
● Вік: Цей фактор може мати значний вплив на медичні витрати, адже
Цілі:
Методи:
Очищення та підготовка даних: Дані будуть очищені від помилок,
пропущених значень та несумісностей.
Стандартизація чисельних ознак: Чисельні ознаки, такі як вік та ІМТ
(індекс маси тіла), будуть стандартизовані, щоб вони мали
однаковий масштаб.
Кодування категоріальних ознак: Категоріальні ознаки, такі як
статус куріння та регіон проживання, будуть закодовані за
допомогою one-hot кодування або заміни на числові значення.
Масштабування цільової змінної: Цільова змінна, charges, буде
також масштабована для покращення якості моделі.
Поділ даних на тренувальний і тестовий набори: Дані будуть
поділені на тренувальний та тестовий набори, щоб оцінити
продуктивність моделі.
Побудова моделей: Лінійна регресія та регресійні моделі з
регуляризацією L1 та L2 будуть використані для прогнозування
медичних витрат.
Оцінка моделей: Моделі будуть оцінені за допомогою метрик, таких
як MSE (середньоквадратична помилка) та R2 (коефіцієнт
детермінації), як на тренувальних, так і на тестових даних.
Візуалізація результатів: Результати моделювання будуть
візуалізовані за допомогою графіків, таких як scatter plot та box plot,
щоб краще зрозуміти взаємозв'язок між ознаками та цільовою
змінною.
Формальна постановка задачі
1. Загальний опис
Дані:
включаючи:
○ age: Вік
○ xi1: Вік
yi та xi
𝑀𝑆𝐸=1𝑁∑𝑖=1𝑁(𝑦𝑖−𝑓(𝑥𝑖))^2
Де N - загальна кількість застрахованих осіб.
2.3 Обмеження
3. Алгоритм вирішення
1. Очищення та підготовка даних:
3. Навчання моделі:
4. Оцінка моделі:
6. Розробка рекомендацій:
1. Використовувати модель та результати аналізу факторів
для розробки рекомендацій щодо тарифних планів та
стратегій управління ризиками для страхових компаній.
4. Очікувані результати
1. Розроблена та навчена модель машинного навчання, яка
може прогнозувати індивідуальні медичні витрати з
високою точністю.
2. Оцінка точності та надійності моделі за допомогою метрик
MSE, R-квадрат та інших.
3. Виявлені ключові фактори, які впливають на медичні
витрати.
4. Розроблені рекомендації щодо тарифних планів та стратегій
управління ризиками для страхових компаній.
5. Вплив та застосування
Результати цієї задачі можуть мати значний вплив на страхову індустрію:
1. Аналіз:
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
7. Оцінка моделі
● Оцінюється ефективність моделі на тестовій множині за
допомогою коефіцієнта детермінації (R-squared) та
середньоквадратичної помилки (MSE) з функцій r2_score та
mean_squared_error. R-squared показує, яку частку дисперсії цільової
змінної пояснює модель, значення ближче до 1 означає краще
пояснення.
8. Перехресна перевірка
● Використовується cross_val_score з sklearn.model_selection для
9. Візуалізація результатів
● Створюються графіки залишків та відхилень y_test від y_pred.
data = pd.read_csv('insurance.csv')
print(data.head())
Результати моделі:
- R2-score для навчального набору: 0.75
- R2-score для тестового набору: 0.76
- MSE для навчального набору: 0.25
- MSE для тестового набору: 0.24
- Крос-валідація: середнє значення R2-скору: 0.74
coef = lr.coef_
print(coef)
Значення коефіцієнтів:
- Вік: 0.30
- Стать: 0.01
- BMI: 0.16
- Кількість дітей: 0.03
- Наявність шкідливої звички: 1.96
- Регіони: значення змінних відносно базового регіону.
5.9 Висновки
- Вік, BMI та наявність шкідливої звички мають значний вплив на страхові
витрати.
- Регіон проживання має менший, але все ж помітний вплив на витрати.
- Модель лінійної регресії показала хорошу продуктивність, але можуть
бути покращення за допомогою складніших моделей або додаткових
змінних.
- Регуляризація може допомогти зменшити перенавчання та покращити
узгодженість моделі.
Висновок
Список літератури
Назва: Deep Learning
Посилання: https://www.deeplearningbook.org/
Посилання: https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/
Посилання:
https://www.oreilly.com/library/view/hands-on-machine-learning/9781492032632/
Назва: Machine Learning: A Probabilistic Perspective
Посилання: https://mitpress.mit.edu/9780262018029/machine-learning/
Посилання: 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'])
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)
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))
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
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 = {}
optimal_lr = (a + b) / 2
return optimal_lr
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
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 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 = {}
optimal_lr = (a + b) / 2
return optimal_lr
def loss(alpha):
return mse_loss_l2(X, y, current_theta - alpha
* grad, lambda_)
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))