• 机器学习:基于Python 机器学习进行医疗保险价格预测


    在这里插入图片描述

    机器学习:基于Python 机器学习进行医疗保险价格预测

    作者:i阿极

    作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页

    😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

    📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


    大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持



    1、前言

    您一定听说过一些有关医疗保险的广告,这些广告承诺在发生任何医疗紧急情况时提供经济帮助。购买此类保险的人必须每月缴纳保费,保费金额根据各种因素变化很大。
    在本文中,我们将尝试使用 Python 中的机器学习从数据集中提取一些见解,该数据集包含有关购买医疗保险的人的背景以及向这些人收取的保费金额的详细信息。

    2、导入数据和模块

    Python 库使我们可以非常轻松地使用一行代码处理数据并执行典型且复杂的任务。

    Pandas – 该库有助于以 2D 数组格式加载数据帧,并具有多种功能来一次性执行分析任务。
    Numpy – Numpy 数组非常快,可以在很短的时间内执行大量计算。
    Matplotlib / Seaborn – 该库用于绘制可视化效果。
    Sklearn – 该模块包含多个具有预实现功能的库,用于执行从数据预处理到模型开发和评估的任务。

    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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    现在让我们使用 panda 的数据框加载数据集并查看它的前五行。

    df = pd.read_csv('insurance.csv')
    df.head()
    
    • 1
    • 2

    在这里插入图片描述

    现在,让我们检查数据集的形状。

    df.shape
    
    • 1

    该数据集包含 1338 个数据点,具有 6 个独立特征和 1 个目标特征。

    df.info()
    
    • 1

    在这里插入图片描述

    从上面我们可以看到,数据集包含 2 列浮点值、3 列分类值,其余包含整数值。

    我们可以查看数据集中可用的连续数据的描述性统计度量。

    df.describe()
    
    • 1

    在这里插入图片描述

    3、探索性数据可视化分析

    EDA 是一种使用视觉技术分析数据的方法。它用于发现趋势和模式,或借助统计摘要和图形表示来检查假设。在执行此数据集的 EDA 时,我们将尝试查看独立特征之间的关系,即一个特征如何影响另一个特征。

    df.isnull().sum()
    
    • 1

    在这里插入图片描述

    在这里我们可以得出结论,给定的数据集中不存在空值。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    提供给我们的数据在性别和地区列中均匀分布,但在吸烟者列中,我们可以观察到比例为 80:20。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    现在让我们看看上图中显示的一些观察结果:
    与女性相比,男性的费用较高,但差异并不大。
    吸烟者收取的保费大约是非吸烟者收取的三倍。
    给定四个区域的费用大致相同。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    这里可以观察到吸烟者必须支付的费用之间的明显区别。同样在这里,我们也可以观察到,随着一个人年龄的增加,保费也会上涨。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    年龄和 BMI 列中的数据大致遵循正态分布,这对于模型的学习来说是一个很好的点。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    给定数据集的 BMI 列中存在异常值。让我们检查一下,如果删除这些异常值,我们将丢失数据集的多少行。

    df.shape, df[df['bmi']<45].shape
    
    • 1

    我们只会丢失 20 个数据点,并且数据集将不再有任何异常值,因此我们可以做出这样的牺牲。

    df = df[df['bmi']<45]
    
    • 1

    为了分析该数据集特征之间的相关性,我们必须对分类列执行 LabelEncoding。

    for col in df.columns:
        if df[col].dtype == object:
            le = LabelEncoder()
            df[col] = le.fit_transform(df[col])
    
    • 1
    • 2
    • 3
    • 4

    我们画一个热图来分析数据集变量之间的相关性

    plt.figure(figsize=(7, 7))
    sb.heatmap(df.corr() > 0.8,
               annot=True,
               cbar=False)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    从上面的热图可以肯定,里面不存在高度相关的特征。

    4、模型开发

    学术界有很多最先进的机器学习模型,但有些模型更适合某些问题,而有些模型则比其他模型更适合。因此,为了做出这个决定,我们将数据分为训练数据和验证数据。然后我们使用验证数据来选择性能最高的模型。

    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.2,
                                      random_state=22)
    X_train.shape, X_val.shape
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    将数据划分为训练数据和验证数据后,被认为是实现模型稳定快速训练的更好实践。

    scaler = StandardScaler()
    X_train = scaler.fit_transform(X_train)
    X_val = scaler.transform(X_val)
    
    
    • 1
    • 2
    • 3
    • 4

    现在,让我们在训练数据上训练一些最先进的机器学习模型,然后使用验证数据来选择其中最好的模型进行预测。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    在这里,我们使用 MAPE(平均绝对百分比误差指标)来评估模型的性能。MAPE 值为 0.1 意味着预测值与实际值的误差约为 10%。

    总结

    在所有模型中,RandomForestModel给出了平均绝对百分比误差的最小值,这意味着与其他模型相比,该模型做出的预测更接近真实值。

    我们在这里使用的数据集很小,但我们从中得出的结论与现实生活场景中观察到的结果非常相似。如果我们拥有更大的数据集,那么我们将能够了解独立特征与买家收取的溢价之间关系的更深层次模式。


    📢文章下方有交流学习区!一起学习进步!💪💪💪
    📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
    📢你的支持和鼓励是我创作的动力❗❗❗

  • 相关阅读:
    QCC51XX---服务发现协议( SDP)
    智能家居涉及到的12个物联网传感器!
    Spring中Bean的作用域
    Vue笔记_01双向数据绑定原理
    2023 年最佳开源软件
    【Windows】搭建 FTP 服务器
    netstat-网络性能分析常用命令
    AOP基础知识了解
    Lazarus网络编程
    tolua源码分析(七)带out参数的C#函数
  • 原文地址:https://blog.csdn.net/AOAIYI/article/details/131391152