🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.4特征工程
4.5模型构建
5.实验总结
源代码
1.项目背景
随着全球医疗健康体系的不断完善和人们健康意识的日益提高,医疗保险作为保障民众健康权益的重要工具,其重要性愈发凸显。然而,医疗保险费用的准确预测一直是保险行业面临的一大挑战。传统的医疗保险费用预测方法往往基于简单的统计模型或专家经验,难以全面、准确地反映影响医疗保险费用的多种复杂因素,从而导致预测结果的不准确和不合理。
近年来,随着大数据和人工智能技术的迅猛发展,机器学习和数据挖掘方法逐渐在医疗保险费用预测领域展现出巨大的潜力和应用价值。其中,梯度提升决策树回归算法(Gradient Boosting Decision Tree, GBDT)作为一种先进的集成学习算法,因其强大的拟合能力和良好的泛化性能,在医疗保险费用预测领域引起了广泛关注。
GBDT算法通过将多个弱学习器(如决策树)组合成一个强学习器,能够有效地处理医疗保险费用预测中的非线性关系和复杂交互效应。它不仅能够充分利用历史数据中的信息,还能够自动学习和优化预测模型,从而提高预测的准确性和可靠性。此外,GBDT算法还具有易于实现、鲁棒性强等优点,使得其在医疗保险费用预测领域具有广泛的应用前景。
2.项目简介
2.1项目说明
本研究旨在基于梯度提升决策树回归算法构建医疗保险费用预测模型,通过挖掘和分析历史医疗数据中的有用信息,实现对医疗保险费用的准确预测。该研究不仅有助于提高医疗保险费用预测的准确性和可靠性,还能够为保险公司提供科学的定价依据和风险控制手段,进而促进医疗保险行业的健康发展。
2.2数据说明
数据集概述:
医保数据集包含了影响医疗费用的各种因素,如年龄、性别、BMI、吸烟状况、儿童数量、地区等。该数据集是训练能够预测新投保人医疗费用的机器学习模型的基础。
其目的是揭示导致保险成本增加的关键因素,帮助公司在定价和风险评估方面做出更明智的决策。
该数据集包含 2772 行和 7 列,包括:
age:年龄
sex:性别
bmi:BMI(身体质量指数)
children:家庭孩子数
smoker:是否吸烟
region:地区
charges:费用
2.3技术工具
Python版本:3.9
代码编辑器:jupyter notebook
3.算法原理
GBDT(Gradient Boosting Decision Tree)是一种常见的集成学习算法,其基本原理是利用多个决策树进行集成,从而提高预测性能。在GBDT中,每个决策树都是基于梯度提升(Gradient Boosting)算法构建的,因此GBDT也被称为梯度提升决策树(Gradient Boosting Decision Tree)。
梯度提升算法的基本思路是,首先构建一个简单的模型(如单个决策树),然后对模型进行改进,使其能够更好地拟合数据。在每一轮迭代中,梯度提升算法都会使用当前模型的预测结果与真实值之间的误差来构建一个新的模型,并将其与当前模型相加。这样,模型的预测结果就会逐步接近真实值,从而提高模型的预测性能。
具体来说,GBDT的算法流程如下:
初始化模型:将目标变量的平均值作为初始模型的预测结果。
迭代训练:在每一轮迭代中,执行以下步骤:
a. 计算残差:用当前模型的预测结果与真实值之间的差值作为残差。
b. 构建新模型:使用残差作为目标变量,构建一棵新的决策树模型。
c. 更新模型:将新模型的预测结果与当前模型的预测结果相加,得到更新后的模型。
返回模型:当迭代次数达到设定的值或者模型的性能满足一定的条件时,返回最终的模型。
在GBDT中,每个决策树都是基于回归树(Regression Tree)算法构建的。在构建每个决策树时,通常会采用贪心策略来选择最优的划分点,以最小化预测误差。同时,为了避免过拟合,通常会对决策树进行剪枝操作。
GBDT算法的优点是能够有效地处理非线性关系和高维数据,具有很强的预测能力和鲁棒性。但是,GBDT算法也存在一些缺点,比如对异常值和噪声数据比较敏感,需要进行特殊处理。此外,由于每个决策树都是串行构建的,因此算法的训练速度较慢。
4.项目实施步骤
4.1理解数据
导入数据分析第三方库并加载数据集
查看数据大小
查看数据基本信息
查看数值型变量的描述性统计
查看非数值型变量的描述性统计
4.2数据预处理
统计数据缺失值情况
可以发现没有缺失值
统计数据重复值情况
可以发现共有1435个重复值
删除重复值
4.3探索性数据分析
初始化设置
4.4特征工程
对非数值型变量进行编码处理
4.5模型构建
构建回归模型
评估了各种回归模型对保险收费的预测效果。梯度增强回归R2得分最高为0.90,且其误差也是最小的。
构建分类模型
根据每个值是高于还是低于中位数收费,将连续可变收费转换为二元分类变量charges_category。这允许从回归到分类任务的转变,将数据集分为两个平衡的组:高于和低于中位数收费。在每个类别中具有相等的实例的情况下,对数据集进行分割,有效地训练和测试分类模型,为基于中位数阈值的保险风险分类提供了一种简化的方法。
模型被训练成根据保险费用将个人分为两类:高于或低于中位数。Logistic回归的准确率最高(0.91),KNN分类次之,SVM分类次之。朴素贝叶斯分类准确率最低。逻辑回归的成功表明了强线性关系,有助于有效的基于风险的保险费调整分类。
该图显示了将保险费用分类为高于或低于中位数的ROC曲线。Logistic回归和朴素贝叶斯分类显示出较高的AUC得分,表明表现较好。SVM分类性能稍差,KNN分类性能最差。逻辑回归和朴素贝叶斯分类有效地区分了收费类别,强调了它们在保险任务中的效用。
5.实验总结
通过应用梯度提升决策树回归算法构建医疗保险费用预测模型,并基于历史医疗数据进行训练和验证,我们取得了令人满意的预测准确率,达到了91%。这一结果表明,梯度提升决策树回归算法在医疗保险费用预测领域具有显著的优势和有效性。该模型能够准确地捕捉影响医疗保险费用的多种复杂因素,并对其进行有效的预测和分析。
这一实验结论不仅验证了梯度提升决策树回归算法在医疗保险费用预测中的适用性,也为保险公司提供了一种新的、有效的预测工具。通过利用该模型,保险公司可以更准确地评估风险、制定保费策略,提高定价的公平性和科学性,进一步满足广大客户的健康保险需求。同时,这也为医疗保险行业的数据驱动决策提供了新的思路和方法,有助于推动行业的持续创新和发展。
总的来说,梯度提升决策树回归算法在医疗保险费用预测领域展现出了良好的预测性能和应用潜力,为医疗保险行业的风险管理和业务发展提供了有力的支持。
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
源代码
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')df = pd.read_csv("medical_insurance.csv")
df.head()
df.shape
df.info()
df.describe()
df.describe(include='O')
df.isnull().sum()
df.duplicated().sum()
df.drop_duplicates(inplace=True)
df.duplicated().sum()
# 设置背景色为黑色
plt.style.use('dark_background')
# 设置红色色调
red_palette = sns.dark_palette("red", n_colors=3)
# 可视化1:年龄分布
plt.figure(figsize=(10, 6))
sns.histplot(df['age'], color=red_palette[0])
plt.title('Distribution of Age', color='red')
plt.xlabel('Age', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化2:BMI分布
plt.figure(figsize=(10, 6))
sns.histplot(df['bmi'], color=red_palette[1],kde=True)
plt.title('Distribution of BMI', color='red')
plt.xlabel('BMI', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化3:儿童人数分布
plt.figure(figsize=(10, 6))
sns.countplot(data=df, x='children', palette=red_palette)
plt.title('Distribution of Number of Children', color='red')
plt.xlabel('Number of Children', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化4:性别分布
plt.figure(figsize=(8, 5))
sns.countplot(data=df, x='sex', palette=red_palette)
plt.title('Distribution of Sex', color='red')
plt.xlabel('Sex', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化5:吸烟状况的分布
plt.figure(figsize=(8, 5))
sns.countplot(data=df, x='smoker', palette=red_palette)
plt.title('Distribution of Smoking Status', color='red')
plt.xlabel('Smoker', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化6:区域分布
plt.figure(figsize=(10, 6))
sns.countplot(data=df, x='region', palette=red_palette)
plt.title('Distribution of Region', color='red')
plt.xlabel('Region', color='red')
plt.ylabel('Count', color='red')
plt.show()
# 可视化7:按吸烟状况分列的收费箱线图
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='smoker', y='charges', palette=red_palette)
plt.title('Charges by Smoking Status', color='red')
plt.xlabel('Smoker', color='red')
plt.ylabel('Charges', color='red')
plt.show()
# 可视化8:按区域收费的箱线图
plt.figure(figsize=(12, 6))
sns.boxplot(data=df, x='region', y='charges', palette=red_palette)
plt.title('Charges by Region', color='red')
plt.xlabel('Region', color='red')
plt.ylabel('Charges', color='red')
plt.show()
# 可视化9:按性别排列的小提琴图
plt.figure(figsize=(10, 6))
sns.violinplot(data=df, x='sex', y='charges', palette=red_palette)
plt.title('Charges by Sex', color='red')
plt.xlabel('Sex', color='red')
plt.ylabel('Charges', color='red')
plt.show()
# 可视化10:相关关系热力图
plt.figure(figsize=(12,9))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt=".2f")
plt.show()
# 将性别、吸烟、区域变量进行编码处理
df['sex'].replace(to_replace={'female':0,'male':1},inplace=True)
df['smoker'].replace(to_replace={'no':0,'yes':1},inplace=True)
df['region'].replace(to_replace={'southeast':0,'southwest':1,'northwest':2,'northeast':3},inplace=True)
df.head()
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression, Ridge, LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, r2_score, mean_squared_error, mean_absolute_error, roc_curve, auc
# 准备建模数据
X =df.drop('charges', axis=1)
y = df['charges']
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 准备回归模型
models = {"Linear Regression": LinearRegression(),"Ridge Regression": Ridge(),"Decision Tree Regression": DecisionTreeRegressor(),"Random Forest Regression": RandomForestRegressor(),"Gradient Boosting Regression": GradientBoostingRegressor(),
}
# 训练并评估模型
print("Regression Models Evaluation:")
for name, model in models.items():model.fit(X_train, y_train)predictions = model.predict(X_test)r2_score_model = r2_score(y_test, predictions)mse_score = mean_squared_error(y_test, predictions)mae_score = mean_absolute_error(y_test, predictions)print("Model:", name)print("R2 Score:", r2_score_model)print("MSE Score:", mse_score)print("MAE Score:", mae_score)print()
评估了各种回归模型对保险收费的预测效果。梯度增强回归R2得分最高为0.90,且其误差也是最小的。
根据每个值是高于还是低于中位数收费,将连续可变收费转换为二元分类变量charges_category。这允许从回归到分类任务的转变,将数据集分为两个平衡的组:高于和低于中位数收费。在每个类别中具有相等的实例的情况下,对数据集进行分割,有效地训练和测试分类模型,为基于中位数阈值的保险风险分类提供了一种简化的方法。
# 准备构建分类模型
# 构建一个分类指标,若费用大于中位数则为1,反之则为0
df['charges_category'] = (df['charges'] > df['charges'].median()).astype(int)
y_categorical = df['charges_category']
X_train_cat, X_test_cat, y_train_cat, y_test_cat = train_test_split(X, y_categorical, test_size=0.2, random_state=42)
# 分类模型
class_models = {"Logistic Regression": LogisticRegression(max_iter=1000),"KNN Classification": KNeighborsClassifier(),"SVM Classification": SVC(probability=True),"Naive Bayes Classification": GaussianNB()
}
# 训练并评估模型
print("\nClassification Models Evaluation:")
for name, model in class_models.items():model.fit(X_train_cat, y_train_cat)if name == "SVM Classification":predictions = model.decision_function(X_test_cat)else:predictions = model.predict_proba(X_test_cat)[:, 1]accuracy = accuracy_score(y_test_cat, model.predict(X_test_cat))print(f"{name}: Accuracy = {accuracy:.2f}")
模型被训练成根据保险费用将个人分为两类:高于或低于中位数。Logistic回归的准确率最高(0.91),KNN分类次之,SVM分类次之。朴素贝叶斯分类准确率最低。逻辑回归的成功表明了强线性关系,有助于有效的基于风险的保险费调整分类。
sns.set(font='SimHei')
plt.figure(figsize=(10, 8))
for name, model in class_models.items():if name == "SVM Classification":predictions = model.decision_function(X_test_cat)else:predictions = model.predict_proba(X_test_cat)[:, 1]fpr, tpr, _ = roc_curve(y_test_cat, predictions)roc_auc = auc(fpr, tpr)plt.plot(fpr, tpr, label=f'{name} (area = {roc_auc:.2f})')plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve Comparison')
plt.legend(loc="lower right")
plt.show()
该图显示了将保险费用分类为高于或低于中位数的ROC曲线。Logistic回归和朴素贝叶斯分类显示出较高的AUC得分,表明表现较好。SVM分类性能稍差,KNN分类性能最差。逻辑回归和朴素贝叶斯分类有效地区分了收费类别,强调了它们在保险任务中的效用。