# 医疗花费预测
## 方法介绍
分别通过全手写不调包实现随机森林、全手写不调包实现线性回归、借助 scikit-learn 包实现 GBDT、SVR、LassoRegression、决策树模型来求解该问题,使用 randomizedSearchCV、GridSearchCV、手动调参三种方式进行模型调参,并对 RandomForest、GBDT、DecisionTree、SVR、LinerRegression 模型进行了模型融合,模型融合时尝试使用了直接平均法、加权平均法、stacking 堆叠法进行,同时使用 K 折交叉验证、留一法等多种方法进行模型评判。
方法实现细节和模型结构
数据处理和特征工程
读入数据集以后,通过 describe 方法观察是否数据的大概情况,使用 isnull().sum()方法观察发现数据中不存在空值。测试集较小,仅 1070 行,由于需要尽可能地利用数据,无需舍去数据、无需采样。但在进行检查时发现,数据中存在相同值。通过将数据中 sex、smoker、bmi、age、region、children 属性均相同,且 charges 不同的数据输出如下:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/2065a3eb4fc7438f139ac2b210fbac45.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/fc5e66e86a22a9e4c504808770c88516.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/277bc792640f0ac61f146c64d2d6decc.writebug)
通过训练一个准确率较高的基本模型(此处选取随机森林),使用模型来对这些重复数据的特征进行训练。将 charges 与模型预测结果差别较大的值当做异常值舍去。
对数据做一些可视化容易得知,bmi 对于 charges 的影响大小,与是否吸烟密切相关。吸烟与否,bmi 对于是否 charges 的影响不同,不吸烟时 charges 整体较小,吸烟时,当 bmi 小于 30 时 charges 较小,当 bmi 大于 30 时 charges 较大。由于该题特征较少数据量也并不大,故考虑将 bmi 与 smoker 融合生成一个新的特征 smoker_bmi。当 smoker 为 0 时,smoker_bmi 也为 0;当 smoker 为 1,bmi 小于 30 时,smoker_bmi 为 1;当 smoker 为 1,bmi 大于 30 时,smoker_bmi 为 2。
将 sex、region、smoker 的标签值转为 int 型,便于训练。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/9bdf893d50f29d40fcd4105a039a9a1b.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/80bd87d63fefb900ad79f0cc96dfdea5.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/7a18a97bf610d8ef02fb46ac49766cd8.writebug)
全手写不调包实现随机森林
首先定义一个决策树的结点类,便于随机森林中建树。决策树结点类共包含五个属性,分别表示该结点的分割特征、分割的阈值、左孩子和右孩子、叶子结点的值(仅当该结点为叶子结点时有效)。同时定义一个方法用于查询某个数据对应的叶子结点值。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/ac66a21afdbc30a71d53435ddf943ac5.writebug)
接下来定义随机森林类,该类使用了和 sklearn 里 RandomForestRegressor 库一样的接口,便于使用。共包含 7 个参数、tree 属性和 feature_importances 属性,fit 方法用于训练模型,build_tree 方法用于在训练模型时建立决策树,choose_best_feature 用于在建立决策树时选择最合适的特征进行分裂,predict 为模型预测。参数一共包含 7 个,其中 n_estimators 为决策树的数量,默认为 100;max_depth 为决策树最大深度限制,默认为-1,即不限制决策树最大深度;min_samples_split 为决策树分裂时所需要的最小样本数,默认为 2;min_samples_leaf 为叶子结点的最少样本数,默认为 1;max_features 为特征的采样方式,有 None,sqrt,log2 三种,当选择 sqrt 时,选择的特征数为 int(len(X.columns) ** 0.5);当选择 log2 时,选择的特征数为 int(math.log(len(X.columns)))。默认为 None,即使用所有特征,不采样。mRadio 为行采样比例,默认为 0.8。random_state 为随机数种子,默认为 None。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/ac3d0396c9050696be972db0411fb0ff.writebug)
在 fit 方法中,在行采样和列采样后,进行循环建树。通过调用 build_tree 方法,循环建立 n_estimators 棵决策树,并加决策树加入 tree 队列中。在 build_tree 方法中,只要满足分裂条件(即当前样本数量大于 min_samples_split、分裂后叶子结点样本数量大于 min_samples_leaf,决策树深度小于 max_depth),就调用 choose_best_feature 方法选择最合适的特征并选取分裂阈值进行分裂,同时继续递归调用 build_tree。在 choose_best_feature 方法中,通过计算信息增益,选择信息增益最大的特征及阈值并返回,同时会记录选择的特征,并使该特征的重要程度加一,便于记录特征的重要性。
模型建立完成以后,可通过调用 predict 方法进行预测。在 predict 方法中,会对 tree 序列中的每一个决策树进行调用,将每一棵树的结果取平均值,作为随机森林的预测结果。
通过循环遍历参数,选择出合适的参数后,手写实现的随机森林最高能达到 0.845 的评分。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/84f2f10b7fb5384d43c13b1ae4e0192a.writebug)
全手写不调包实现线性回归
模型表达式为:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/a99912f573e6ce67331586176c3cc121.writebug)
参数的迭代更新公式为:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/afae0ce39864de6532952ad9d475306f.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/6/29/af1035bb95d083ad2d30ccd77b2adf0d.writebug)
对模型进行 5000 次迭代,同时将学习率设置为 0.05。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/05b9dca54644c02200a91ea4d9f5b229.writebug)
此外,还需要对数据进行归一化:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/b780caa4205f1e43a03bbc7dfe24d94f.writebug)
对数据进行了归一化以后,整个数据集上的梯度分布能得到改良,有利于进行线性回归建模。在进行调参以后,手写实现线性回归能达到的最佳分数为 0.746
![](https://www.writebug.com/myres/static/uploads/2022/6/29/b3f19fa7d4b893924100f1a7c358a213.writebug)
借助 scikit-learn 包实现 GBDT、SVR、LassoRegression、决策树
sklearn 包实现 GBDT、SVR、LassoRegression、决策树模型,均只需要直接调用模型即可,实现过程较为简单。
对于 GBDT 而言,调用 sklearn 包中的 GradientBoostingRegressor 库进行训练,在经过调参以后 GBDT 模型准确率能达到 0.860。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/1af39fe900317c943089a35ba9ccc4cf.writebug)
对于 SVR 而言,调用 sklearn 包中的 SVR()库进行训练,在经过调参以后 SVR 模型准确率能达到 0.848。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/ecd100d8deed5054a9cc1a6e52cecf95.writebug)
对于 LassoRegression 而言,调用 sklearn 包中的 Lasso()模型后,在经过调参以后准确率能达到 0.742,模型准确率并不高。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/8fe7ac500886a4b5a3b0a1e34144323f.writebug)
对于决策树模型,调用 sklearn 包中的 DecisionTreeRegresso 方法进行训练,在经过调参以后准确率能达到 0.848。
![](https://www.writebug.com/myres/static/uploads/2022/6/29/25077d21130c1d418544c6663afadd42.writebug)
模型融合——直接平均
在各个模型实现以后,几个主要模型验证集上预测结果的均方误差如下所示:
![](https://www.writebug.com/myres/static/uploads/2022/6/29/899e815d3d2f9f9529e
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+源码 分别通过全手写不调包实现随机森林、全手写不调包实现线性回归、借助 scikit-learn 包实现 GBDT、SVR、LassoRegression、决策树模型来求解该问题,使用 randomizedSearchCV、GridSearchCV、手动调参三种方式进行模型调参,并对 RandomForest、GBDT、DecisionTree、SVR、LinerRegression 模型进行了模型融合,模型融合时尝试使用了直接平均法、加权平均法、stacking 堆叠法进行,同时使用 K 折交叉验证、留一法等多种方法进行模型评判。 读入数据集以后,通过 describe 方法观察是否数据的大概情况,使用 isnull().sum()方法观察发现数据中不存在空值。测试集较小,仅 1070 行,由于需要尽可能地利用数据,无需舍去数据、无需采样。但在进行检查时发现,数据中存在相同值。 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/125542255
资源推荐
资源详情
资源评论
收起资源包目录
基于Python的医疗花费预测.zip (5个子文件)
设计报告.docx 1.39MB
LICENSE 1KB
源代码
医疗花费预测
main.py 33KB
IMDB评论情感预测
main.py 3KB
README.md 18KB
共 5 条
- 1
shejizuopin
- 粉丝: 1w+
- 资源: 1300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页