使用 Python 中的机器学习进行医疗保险价格预测

pythonmachine learningnumpy更新于 2024/10/1 11:24:17

与许多其他行业一样,预测分析在金融和保险行业也非常有用。使用这种机器学习技术,我们可以找到有关任何保险单的有用信息,从而节省大量资金。在这里,我们将使用这种预测分析方法处理医疗保险数据集。

这里的问题陈述是,我们有一个具有某些属性的人的数据集。使用 Python 中的机器学习,我们必须从这个数据集中找出相关信息,还必须预测一个人必须支付的保险价格。

算法

步骤 1 - 导入 numpy、pandas、matplotlib、seaborn 和 sklearn 等库,并将数据集加载为 pandas 数据框。

步骤 2 − 为了清理数据,首先检查是否有空值。如果发现空值,则查找各个特征之间的关系并估算空值。如果没有,那么我们就可以开始了。

步骤 3 − 现在执行 EDA,即检查各个独立变量之间的关系。

步骤 4 − 查找异常值并进行调整。

步骤 5− 绘制热图以找出高度相关的变量。

步骤 6 − 将数据集拆分为测试集和训练集,并使用 StandardScaler 对数据进行规范化。

步骤 7 − 现在在这些数据上训练一些机器学习模型,并使用 mape 检查哪个模型最有效最好。

示例

在此示例中,我们将采用您可以在此处找到的医疗保险数据集,然后,我们将执行预测一个人必须为某种医疗保险支付的保险价格所需的各种步骤。

#导入所需的库
import numpy as np
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
  
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.metrics import mean_absolute_percentage_error as mape
from sklearn.linear_model import LinearRegression, Lasso, Ridge
from xgboost import XGBRegressor
from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor
  
import warnings
warnings.filterwarnings('ignore')

#加载并打印数据集
df = pd.read_csv('insurance_dataset.csv')
df.head()
df.shape
df.info()
df.describe()

#检查空值
df.isnull().sum()

#查看独立特征之间的关系
#饼图
features = ['sex', 'smoker', 'region']
  
plt.subplots(figsize=(20, 10))
for i, col in enumerate(features):
    plt.subplot(1, 3, i + 1)
  
    x = df[col].value_counts()
    plt.pie(x.values, labels=x.index, autopct='%1.1f%%')
  
plt.show()

#条形图
features = ['sex', 'children', 'smoker', 'region']

plt.subplots(figsize=(20, 10))
for i, col in enumerate(features):
    plt.subplot(2, 2, i + 1)
    df.groupby(col).mean()['charges'].plot.bar()
plt.show()

#图
features = ['age', 'bmi']
  
plt.subplots(figsize=(17, 7))
for i, col in enumerate(features):
    plt.subplot(1, 2, i + 1)
    sb.distplot(df[col])
plt.show()

#散点图
features = ['age', 'bmi']

plt.subplots(figsize=(17, 7))
for i, col in enumerate(features):
    plt.subplot(1, 2, i + 1)
    sb.scatterplot(data=df, x=col, y='charges', hue='smoker')
plt.show()

#检查异常值
features = ['age', 'bmi']

plt.subplots(figsize=(17, 7))
for i, col in enumerate(features):
    plt.subplot(1, 2, i + 1)
    sb.boxplot(df[col])
plt.show()

#调整异常值
df.shape, df[df['bmi']<45].shape
df = df[df['bmi']<50]
for col in df.columns:
    if df[col].dtype == object:
        le = LabelEncoder()
        df[col] = le.fit_transform(df[col])
        
#使用热图查看高度相关的变量
plt.figure(figsize=(7, 7))
sb.heatmap(df.corr() > 0.8, annot=True, cbar=False)
plt.show()

#将数据集拆分为训练集和测试集
features = df.drop(['charges'], axis=1)
target = df['charges']

X_train, X_val,\
    Y_train, Y_val = train_test_split(features, target, test_size=0.1, random_state=22)

X_train.shape, X_val.shape

#拟合数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)

#查找各种模型的性能
models = [LinearRegression(), XGBRegressor(),
          RandomForestRegressor(), AdaBoostRegressor(),
          Lasso(), Ridge()]
  
for i in range(6):
    models[i].fit(X_train, Y_train)
  
    print(f'{models[i]} : ')
    pred_train = models[i].predict(X_train)
    print('Training Error : ', mape(Y_train, pred_train))
  
    pred_val = models[i].predict(X_val)
    print('Validation Error : ', mape(Y_val, pred_val))
    print()

导入所需的库后,数据集将存储到 Python 数据框中。然后,代码检查数据集中的空值,并相应地绘制饼图和条形图,以可视化数据集中性别、地区和吸烟者列的分布和比例。

然后,显示直方图和散点图,以可视化年龄和体重指数与费用变量的分布和关系。检查年龄和体重指数列,并通过过滤掉极值进行修改。之后,将性别、吸烟者和地区列中的值转换为数字形式,并创建热图以可视化数据集中各列之间的关系。

然后将数据集分为训练集和验证集。根据训练集和验证集上的平均绝对百分比误差训练和评估各种回归模型。

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1338 entries, 0 to 1337
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   age       1338 non-null   int64  
 1   sex       1338 non-null   object 
 2   bmi       1338 non-null   float64
 3   children  1338 non-null   int64  
 4   smoker    1338 non-null   object 
 5   region    1338 non-null   object 
 6   charges   1338 non-null   float64
dtypes: float64(2), int64(2), object(3)
memory usage: 73.3+ KB

LinearRegression() −

Training Error :  0.42160312973300035
Validation Error :  0.36819643775368394

XGBRegressor() −

Training Error :  0.07414118093426757
Validation Error :  0.43487251393507226

RandomForestRegressor() −

Training Error :  0.11931475932482996
Validation Error :  0.33574049059141486

AdaBoostRegressor() −

Training Error :  0.6166709629183661
Validation Error :  0.5758503954769271

Lasso() −

Training Error :  0.42160217445355996
Validation Error :  0.36821456297631355

Ridge() −

Training Error :  0.42182509871430085
Validation Error :  0.3685041955294438

您可以看到 XGBRegressor 给出的 MAPE(平均绝对百分比误差)值最小。这意味着该模型预测的价格非常接近实际价格,因此可以被视为该项目的最佳模型。

结论

要进行医疗保险价格预测,您还可以使用任何其他模型,如 K 最近邻 (KNN)、支持向量机 (SVM)、随机森林 (RF) 和朴素贝叶斯等。此外,这里的数据大多经过预处理。但是,您可以根据需要自行预处理。此外,也可以以相同的方式对具有其他几个特征的数据集进行类似的预测。


有用资源