你一定听说过一些关于医疗保险的广告,承诺在任何医疗紧急情况下提供经济帮助。一个谁购买这种类型的保险必须每月支付保费,这个保费金额根据各种因素变化很大。
在本文中,我们将尝试从一个数据集中提取一些见解,该数据集包含有关购买医疗保险的人的背景,这些人收取的保费金额的详细信息,以及使用Python中的机器学习。
导入库和数据集
Python库使我们能够非常容易地处理数据,并通过一行代码执行典型和复杂的任务。
- Pandas -此库有助于以2D阵列格式加载数据帧,并具有多种功能,可一次性执行分析任务。
- Numpy - Numpy数组非常快,可以在很短的时间内执行大型计算。
- Matplotlib/Seaborn -这个库用于绘制可视化。
- Sklearn -该模块包含多个库,这些库具有预实现的功能,可以执行从数据预处理到模型开发和评估的任务。
- XGBoost -这包含eXtreme Gradient Boosting机器学习算法,这是帮助我们实现高精度预测的算法之一。
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')
现在,让我们使用panda的数据框架来加载数据集,并查看它的前五行。
df = pd.read_csv('medical_insurance.csv')
df.head()
df.shape
"""
(1338, 7)
"""
该数据集包含1338个数据点,具有6个独立特征和1个目标特征。
df.info()
从上面我们可以看到,数据集包含2列浮点值,3列分类值,其余包含整数值。
df.describe()
我们可以查看数据集中可用的连续数据的描述性统计度量。
探索性数据分析
EDA是一种使用可视化技术分析数据的方法。它用于发现趋势和模式,或在统计摘要和图形表示的帮助下检查假设。在执行该数据集的EDA时,我们将尝试查看独立特征之间的关系,即一个特征如何影响另一个特征。
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()
向我们提供的数据在性别和地区栏中平均分布,但在吸烟者栏中,我们可以观察到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()
现在让我们看看上面图表中显示的一些观察结果:
- 与女性相比,男性的收费较高,但差异并不大。
- 向吸烟者收取的保险费大约是向非吸烟者收取的保险费的三倍。
- 在给定的四个区域中,收费大致相同。
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.distplot(df[col])
plt.show()
年龄和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()
在给定数据集的BMI列中存在异常值。让我们检查一下,如果我们删除这些离群值,我们将丢失数据集的多少行。
df.shape, df[df['bmi']<45].shape
"""
((1338, 7), (1318, 7))
"""
我们只会丢失20个数据点,数据集将没有任何异常值,所以我们可以做出这种牺牲。
df = df[df['bmi']<45]
要分析此数据集的特征之间的相关性,我们必须执行分类列的LabelEncoding。
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.2,
random_state=22)
X_train.shape, X_val.shape
"""
((1054, 6), (264, 6))
"""
在将数据划分为训练数据和验证数据之后,认为实现模型的稳定和快速训练是一种更好的实践。
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))
输出:
LinearRegression() :
Training Error : 0.4188805629224119
Validation Error : 0.4504495878121591
XGBRegressor() :
Training Error : 0.2423798632758146
Validation Error : 0.2968607102447037
RandomForestRegressor() :
Training Error : 0.11874416980772626
Validation Error : 0.24169452488917798
AdaBoostRegressor() :
Training Error : 0.6049583785013588
Validation Error : 0.620496923849186
Lasso() :
Training Error : 0.418841845707845
Validation Error : 0.45044188913851757
Ridge() :
Training Error : 0.4190871910460788
Validation Error : 0.45082076456283665
在这里,我们使用了MAPE,这是平均绝对百分比误差度量来评估模型的性能。MAPE的值为0.1意味着预测值与实际值的误差约为10%。
总结
在所有模型中,随机森林给出的平均绝对百分比误差值最小,这意味着与其他模型相比,该模型的预测接近真实的值。
我们在这里使用的数据集仍然很小,我们从中得出的结论与在现实生活中观察到的非常相似。如果我们有一个更大的数据集,那么我们将能够在独立特征与买家收取的保费之间的关系中了解更深层次的模式。