健康保险是一种覆盖医疗费用的保险类型。购买了健康保险的人通过支付一定的保险费用来获得保险保障。有许多因素决定了健康保险的费用,例如年龄,年轻人相比老年人更不太可能有重大健康问题。因此,治疗老年人的费用比年轻人要高。这就是为什么老年人需要支付比年轻人更高的保险费用。
当然,除了年龄,许多其他因素也会影响健康保险的费用。
在本文中,将通过实例一步一步了解如何使用Python应用机器学习进行健康保险费用预测。
数据预处理及分析
本文的数据源包含以下数据:
- 个人年龄
- 性别
- 体重指数(BMI)
- 子女数量
- 是否吸烟
- 居住地区
- 保险费用
以下是数据源概览,数据文件名为:Health_insurance.csv
:
导入数据集和所需的Python库:
import numpy as np
import pandas as pd
# 加载数据
data = pd.read_csv("Health_insurance.csv")
print(data.head())
检查一下这个数据集是否包含任何空值:
print(data.isnull().sum())
数据集准备好了。在对这些数据有了初步印象后,数据集中有比较特殊的“吸烟”列,它表示个人是否吸烟。这是数据集中的一个重要特征,因为吸烟的人比不吸烟的人更有可能遇到重大健康问题。看看吸烟和不吸烟人群的分布情况:
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")
根据上述可视化,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())
预处理后的数据如下:
居住地区的分布情况:
# 居住地区的分布情况:
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")
看不出有啥特别的关系,还是一样先将数据进行数值化处理。
data["region"] = data["region"].astype('category').cat.codes
print(data.head())
处理完之后的数据如下
现在让我们看看数据集中这些特征之间的相关性:
print(data.corr())
以热力图形式看下:
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')
健康保险费用预测模型
基本的数据预处理完成后,让我们来训练一个用于预测健康保险费用的机器学习模型。
在使用了不同的机器学习算法后,随机森林算法是这项任务表现最好的算法。因此,本文将使用随机森林回归算法来训练模型。
首先,从之前的特征关系来看,地区跟费用之间的相关性基本为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]
将测试集的特征与预测结果结合后输出如下:
# 将测试集的特征与预测结果结合
results = pd.DataFrame(xtest, columns=["age", "sex", "bmi", "smoker"])
results["Actual Charges"] = ytest
results["Predicted Charges"] = ypred_forest
# 查看前几行数据
print(results.head())
总结
以上内容展示了一个简单的机器学习流程,用于预测健康保险费用,现在我们回顾下具体的实现步骤:
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())
: 显示预测结果的前五行。
以上完整的展示了一个完整的机器学习流程,包括数据预处理、特征选择、模型训练和预测。目标是通过age
、sex
、bmi
、smoker
等特征,使用随机森林回归模型来预测健康保险的费用(charges
)。