【机器学习实例】随机森林回归模型预测健康保险费用

健康保险是一种覆盖医疗费用的保险类型。购买了健康保险的人通过支付一定的保险费用来获得保险保障。有许多因素决定了健康保险的费用,例如年龄,年轻人相比老年人更不太可能有重大健康问题。因此,治疗老年人的费用比年轻人要高。这就是为什么老年人需要支付比年轻人更高的保险费用。
当然,除了年龄,许多其他因素也会影响健康保险的费用。
在本文中,将通过实例一步一步了解如何使用Python应用机器学习进行健康保险费用预测。
在这里插入图片描述

数据预处理及分析

本文的数据源包含以下数据:

  1. 个人年龄
  2. 性别
  3. 体重指数(BMI)
  4. 子女数量
  5. 是否吸烟
  6. 居住地区
  7. 保险费用

以下是数据源概览,数据文件名为:Health_insurance.csv
image.png
导入数据集和所需的Python库:

import numpy as np
import pandas as pd

# 加载数据
data = pd.read_csv("Health_insurance.csv")
print(data.head())

image.png

检查一下这个数据集是否包含任何空值:

print(data.isnull().sum())

image.png

数据集准备好了。在对这些数据有了初步印象后,数据集中有比较特殊的“吸烟”列,它表示个人是否吸烟。这是数据集中的一个重要特征,因为吸烟的人比不吸烟的人更有可能遇到重大健康问题。看看吸烟和不吸烟人群的分布情况:

import plotly.express as px

data = data
figure = px.histogram(data, x = "sex", color = "smoker", title= "Number of Smokers")
figure.show()

如果浏览器无法输出图表,将 figure.show()替换为如下代码本地文件输出。

import plotly.offline as py
py.plot(figure,filename="filename.html")

image.png
根据上述可视化,547名女性和517名男性不吸烟,而115名女性和159名男性吸烟。在训练机器学习模型时使用这个特征非常重要,因为这两列包含字符串值,所以现在用0和1替换“性别”和“吸烟”列的值:

# 预处理步骤(性别、吸烟映射)
data["sex"] = data["sex"].map({"female": 0, "male": 1})
data["smoker"] = data["smoker"].map({"no": 0, "yes": 1})
print(data.head())

预处理后的数据如下:
image.png
居住地区的分布情况:

# 居住地区的分布情况:
import plotly.express as px
pie = data["region"].value_counts()
regions = pie.index
population = pie.values
fig = px.pie(data, values=population, names=regions)
# fig.show()
py.plot(fig,filename="filename.html")

image.png
看不出有啥特别的关系,还是一样先将数据进行数值化处理。

data["region"] = data["region"].astype('category').cat.codes
print(data.head())

处理完之后的数据如下
image.png
现在让我们看看数据集中这些特征之间的相关性:

print(data.corr())

image.png
以热力图形式看下:

import plotly.graph_objects as go
# 使用 plotly 绘制热图
fig = go.Figure(data=go.Heatmap(z=corr_matrix.values,
                                x=corr_matrix.columns,
                                y=corr_matrix.columns,
                                colorscale='Viridis'))
fig.update_layout(title='Correlation Matrix')
# fig.show()
py.plot(fig, filename='filename.html')

image.png

健康保险费用预测模型

基本的数据预处理完成后,让我们来训练一个用于预测健康保险费用的机器学习模型。
在使用了不同的机器学习算法后,随机森林算法是这项任务表现最好的算法。因此,本文将使用随机森林回归算法来训练模型。
首先,从之前的特征关系来看,地区跟费用之间的相关性基本为0,所以地区我们就不用作为预测模型的特征了,提取除地区外的特征和标签如下:

# 提取特征和标签
x = np.array(data[["age", "sex", "bmi", "smoker"]])
y = np.array(data["charges"])

接着我们引入train_test_split划分训练集和测试集并分别保存到不同的文件:

from sklearn.model_selection import train_test_split
# 划分训练集和测试集
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=42)

# 将训练集保存为 CSV 文件
train_data = pd.DataFrame(xtrain, columns=["age", "sex", "bmi", "smoker"])
train_data["charges"] = ytrain
train_data.to_csv("train_data.csv", index=False)

# 将测试集保存为 CSV 文件
test_data = pd.DataFrame(xtest, columns=["age", "sex", "bmi", "smoker"])
test_data["charges"] = ytest
test_data.to_csv("test_data.csv", index=False)

引入随机森林回归模型RandomForestRegressor进行训练并进行预测。

from sklearn.ensemble import RandomForestRegressor
# 加载训练数据
train_data = pd.read_csv("train_data.csv")
xtrain = train_data[["age", "sex", "bmi", "smoker"]]
ytrain = train_data["charges"]

# 初始化并训练随机森林回归模型
forest = RandomForestRegressor()
forest.fit(xtrain, ytrain)

# 进行预测
ypred_forest = forest.predict(xtest)
print(ypred_forest[:5])

预测数据前5条如下:

[ 9287.4134732  5414.7367034 28296.687698   9660.7297404 34776.6317339]

image.png
将测试集的特征与预测结果结合后输出如下:

# 将测试集的特征与预测结果结合
results = pd.DataFrame(xtest, columns=["age", "sex", "bmi", "smoker"])
results["Actual Charges"] = ytest
results["Predicted Charges"] = ypred_forest
# 查看前几行数据
print(results.head())

image.png

总结

以上内容展示了一个简单的机器学习流程,用于预测健康保险费用,现在我们回顾下具体的实现步骤:

1. 导入必要的库

import numpy as np
import pandas as pd
  • numpy: 一个支持大量维度数组与矩阵运算的库,此外它还提供了许多高级的数学函数和随机生成函数。
  • pandas: 一个用于数据操作与分析的库,特别适用于结构化数据(如表格)。

2. 加载并查看数据

data = pd.read_csv("Health_insurance.csv")
print(data.head())
  • pd.read_csv(): 用于从CSV文件中读取数据,并将其存储为一个DataFrame,这是pandas中最常用的数据结构。
  • data.head(): 显示数据集的前五行,以便对数据有个初步的了解。

3. 检查缺失值

data.isnull().sum()
  • isnull(): 检查数据中的缺失值(即空值或NaN)。

4. 将分类变量转换为数值

data["sex"] = data["sex"].map({"female": 0, "male": 1})
data["smoker"] = data["smoker"].map({"no": 0, "yes": 1})
data["region"] = data["region"].astype('category').cat.codes
  • map(): 用于将性别(sex)和是否吸烟(smoker)这两个分类变量映射为数值。
    • sex: 将"female"映射为0,"male"映射为1。
    • smoker: 将"no"映射为0,"yes"映射为1。
  • astype('category').cat.codes: 将区域(region)列转换为分类类型,并编码为整数(如0, 1, 2, 3),每个类别(如’southwest’, 'southeast’等)都会映射到一个唯一的整数。

5. 准备特征和标签数据

x = np.array(data[["age", "sex", "bmi", "smoker"]])
y = np.array(data["charges"])
  • x: 选择数据中的四个特征(age, sex, bmi, smoker),并将它们转换为numpy数组。这个数组将作为模型的输入特征。
  • y: 选择目标变量(charges),即我们要预测的保险费用,并将其转换为numpy数组。这个数组将作为模型的标签(输出)。

6. 划分训练集和测试集

from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=42)
  • train_test_split(): 将数据集分为训练集和测试集。
    • test_size=0.2: 20%的数据用于测试,80%的数据用于训练。
    • random_state=42: 固定随机种子以保证结果的可重复性。

7. 训练随机森林回归模型

from sklearn.ensemble import RandomForestRegressor
forest = RandomForestRegressor()
forest.fit(xtrain, ytrain)
  • RandomForestRegressor: 导入并初始化随机森林回归模型。随机森林是一种集成学习算法,通过训练多个决策树并取平均值来提高预测性能。
  • fit(): 在训练集(xtrain, ytrain)上训练模型。

8. 预测并显示结果

ypred = forest.predict(xtest)
data = pd.DataFrame(data={"Predicted Premium Amount": ypred})
print(data.head())
  • predict(): 使用训练好的模型在测试集(xtest)上进行预测,得到预测值ypred
  • pd.DataFrame(): 将预测结果转换为DataFrame,便于显示和进一步操作。
  • print(data.head()): 显示预测结果的前五行。

以上完整的展示了一个完整的机器学习流程,包括数据预处理、特征选择、模型训练和预测。目标是通过agesexbmismoker等特征,使用随机森林回归模型来预测健康保险的费用(charges)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值