代码实战保险花销预测

文章目录

  • 摘要
  • 项目地址
  • 实战代码(初级版)
  • 实战代码(进阶版)

摘要

  • 本文介绍了一个完整的机器学习流程项目,重点涵盖了多元线性回归的建模与评估方法。项目详细讲解了特征工程中的多项实用技巧,包括:通过np.log变换使数据符合正态分布、离散型数据的one-hot编码处理、缺失值处理、数据标准化归一化、以及多项式回归升维等关键技术。此外,项目还特别介绍了使用正则化方法提高模型泛化能力的重要技巧。该研究为机器学习实践者提供了一个全面的技术参考,特别是在数据预处理和模型优化方面具有较高的实用价值。

项目地址

  • 人工智能学习代码库

实战代码(初级版)

建模评估
特征处理
数据准备
模型训练
模型评估
离散化非数值列
分离特征和目标
缺失值填充
数据集划分
数据标准化
多项式特征扩展
数据读取与初始化
EDA数据探索
开始
绘制原数据分布
绘制对数变换后分布
特征工程
初始化Ridge模型
训练模型
计算对数变换RMSE/MSE
计算还原后RMSE
输出评估结果
结束
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 设置显示宽度: 解决数据显示不完整
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.width', None)        # 自动调整显示宽度# 1 读取数据
data =pd.read_csv("./data/insurance.csv")
print(data.head(3))# 2 EDA数探索
# 2.1 原数据右偏
plt.hist(data["charges"])
plt.title("原数据 'charges' 的分布")
plt.xlabel("charges")
plt.ylabel("频数")
plt.show()# 2.2 矫正后的数据
plt.hist(np.log(data["charges"]))
plt.title("对数变换后的 'charges' 的分布")
plt.xlabel("log(charges)")
plt.ylabel("频数")
plt.show()# 3 特征工程# 3.1 非数值型的列离散化
data=pd.get_dummies(data,columns=["sex","smoker","region"])
data.head(3)# 3.2 删除目标列 花销一列
x=data.drop("charges",axis=1)
y=data['charges']# 3.3 缺失值填充
x.fillna(0,inplace=True)
y.fillna(0,inplace=True)
# 3.4 数据切分 训练集(70%)和测试集(30%)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)# 3.5 标准归一化(均值归一化+方差归一化) 确保训练集和测试集的均值和方差相同
scaler=StandardScaler(with_mean=True,with_std=True).fit(x_train)
# 对训练集进行拟合并转换
x_train_scaled = scaler.transform(x_train)
# 对测试集进行转换(使用训练集的均值和标准差)
x_test_scaled = scaler.transform(x_test)# 3.6 升维 增加Y的维度或因素 利用线性模型做回归
polynomial_features = PolynomialFeatures(degree=2, include_bias=False)
x_train_scaled = polynomial_features.fit_transform(x_train_scaled)
x_test_scaled = polynomial_features.fit_transform(x_test_scaled)# 4 模型训练 Ridge=LinearRegression+L2正则化reg=Ridge(alpha=10.0)
reg.fit(x_train_scaled,np.log1p(y_train)) #np.log1p对log函数的优化
y_predict=reg.predict(x_test_scaled)# 5 模型评估
'''
RMSE(均方根误差)和 MSE(均方误差)是常用的模型评估指标,用于衡量模型预测值与真实值之间的差异。''''''
对数变换后的 RMSE 
重要性:这些指标衡量了模型在对数变换后的目标变量上的预测误差。对数变换通常用于处理右偏分布的数据,使其更接近正态分布。因此,这些指标可以帮助你了解模型在对数空间中的表现。
适用场景:当你希望模型在对数空间中表现良好时,这些指标非常重要。
'''# 计算训练集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
rmse_train_log = np.sqrt(mean_squared_error(y_true=np.log1p(y_train), y_pred=reg.predict(x_train_scaled)))
print(f"训练集上对数变换后的 RMSE: {rmse_train_log}")# 计算测试集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
rmse_test_log = np.sqrt(mean_squared_error(y_true=np.log1p(y_test), y_pred=y_predict))
print(f"测试集上对数变换后的 RMSE: {rmse_test_log}")# 计算训练集上对数变换后的真实值与预测值之间的均方误差(MSE)
mse_train_log = mean_squared_error(y_true=np.log1p(y_train), y_pred=reg.predict(x_train_scaled))
print(f"训练集上对数变换后的 MSE: {mse_train_log}")# 计算测试集上对数变换后的真实值与预测值之间的均方误差(MSE)
mse_test_log = mean_squared_error(y_true=np.log1p(y_test), y_pred=y_predict)
print(f"测试集上对数变换后的 MSE: {mse_test_log}")'''
还原后的 RMSE
重要性:这些指标衡量了模型在原始目标变量上的预测误差。还原后的 RMSE 更直观地反映了模型在实际数据尺度上的表现。
适用场景:当你希望模型在原始数据尺度上表现良好时,这些指标非常重要。
'''# 计算训练集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
rmse_train_exp = np.sqrt(mean_squared_error(y_true=y_train, y_pred=np.exp(reg.predict(x_train_scaled))))
print(f"训练集上还原后的 RMSE: {rmse_train_exp}")# 计算测试集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
rmse_test_exp = np.sqrt(mean_squared_error(y_true=y_test, y_pred=np.exp(y_predict)))
print(f"测试集上还原后的 RMSE: {rmse_test_exp}")

在这里插入图片描述
在这里插入图片描述

   age     sex    bmi  children smoker     region     charges
0   19  female  27.90         0    yes  southwest  16884.9240
1   18    male  33.77         1     no  southeast   1725.5523
2   28    male  33.00         3     no  southeast   4449.4620
训练集上对数变换后的 RMSE: 0.35492916766241805
测试集上对数变换后的 RMSE: 0.3896820204464227
训练集上对数变换后的 MSE: 0.12597471405753685
测试集上对数变换后的 MSE: 0.1518520770592062
训练集上还原后的 RMSE: 4940.399449726374
测试集上还原后的 RMSE: 5243.354576700596

实战代码(进阶版)

建模评估
特征处理
数据准备
模型训练
模型评估
删除低相关列
连续值离散化
One-Hot编码
分离特征和目标
缺失值填充
数据集划分
多项式特征扩展
数据读取与初始化
EDA数据探索
开始
绘制费用分布
绘制对数变换分布
性别影响分析
区域影响分析
吸烟影响分析
孩子数量影响分析
特征工程
初始化Ridge模型
训练模型
计算对数变换RMSE
计算还原后RMSE
输出评估结果
结束
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题# 设置显示宽度: 解决数据显示不完整
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.width', None)        # 自动调整显示宽度# 1 读取数据
data = pd.read_csv("./data/insurance.csv")
print("原数据:")
print(data.head(3))# 2 EDA数探索
# 2.1 原数据右偏
plt.hist(data["charges"])
plt.title("原数据 'charges' 的分布")
plt.xlabel("charges")
plt.ylabel("频数")
plt.show()# 2.2 矫正后的数据
plt.hist(np.log(data["charges"]))
plt.title("对数变换后的 'charges' 的分布")
plt.xlabel("log(charges)")
plt.ylabel("频数")
plt.show()# 2.2 性别对花费的影响分析
sns.kdeplot(data.loc[data.sex == "male", "charges"], label='male')
sns.kdeplot(data.loc[data.sex == "female", "charges"], label='female')
plt.legend(title="性别对花费的影响分析")
plt.show()# 2.3 区域对花费的影响分析
sns.kdeplot(data.loc[data.region == "northwest", "charges"], label='northwest')
sns.kdeplot(data.loc[data.region == "northeast", "charges"], label='northeast')
sns.kdeplot(data.loc[data.region == "southwest", "charges"], label='southwest')
sns.kdeplot(data.loc[data.region == "southeast", "charges"], label='southeast')
plt.legend(title="区域对花费的影响分析")
plt.show()# 2.4 吸烟对花费的影响分析
sns.kdeplot(data.loc[data.smoker == "yes", "charges"], label='smoker')
sns.kdeplot(data.loc[data.smoker == "no", "charges"], label='no smoker')
plt.legend(title="吸烟对花费的影响分析")
plt.show()# 2.5 孩子个数对花费的影响分析
sns.kdeplot(data.loc[data.children == 0, "charges"], label='no children')
sns.kdeplot(data.loc[data.children == 1, "charges"], label='one children')
sns.kdeplot(data.loc[data.children == 2, "charges"], label='two children')
sns.kdeplot(data.loc[data.children == 3, "charges"], label='three children')
sns.kdeplot(data.loc[data.children == 4, "charges"], label='four children')
sns.kdeplot(data.loc[data.children == 5, "charges"], label='five children')
plt.legend(title="孩子个数对花费的影响分析")
plt.show()# 3 特征工程
# 3.1 删除系数相关低的列 region、sex
data = data.drop(["region",  "sex"], axis=1)
print("删除系数相关低的列 region、sex")
print(data.head(3))# 3.2 降噪 连续值变为离散值
def greater(df, bmi, num_child):df['bmi'] = 'over' if df['bmi'] >= bmi else 'under'df['children'] = 'no' if df['children'] == num_child else 'yes'return dfdata = data.apply(greater, axis=1, args=(30, 0))# 3.3 非数值型的列离散化
data = pd.get_dummies(data)
print("bmi,num_child连续值变为离散值")
print(data.head(3))# 3.4 删除目标列 花销一列
x = data.drop("charges", axis=1)
y = data['charges']# 3.5 缺失值填充
x.fillna(0, inplace=True)
y.fillna(0, inplace=True)# 3.6 数据切分 训练集(70%)和测试集(30%)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)# 3.7 升维 增加Y的维度 利用线性模型做回归
polynomial_features = PolynomialFeatures(degree=2, include_bias=False)
x_train_poly = polynomial_features.fit_transform(x_train)
x_test_poly = polynomial_features.fit_transform(x_test)# 4 模型训练 Ridge=LinearRegression+L2正则化
reg = Ridge(alpha=10.0)reg.fit(x_train_poly, np.log1p(y_train))  # np.log1p对log函数的优化
y_predict = reg.predict(x_test_poly)# 5 模型评估
# 计算训练集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
print("计算训练集上对数变换后的真实值与预测值之间的均方根误差(RMSE)")
print(np.sqrt(mean_squared_error(y_true=np.log1p(y_train), y_pred=reg.predict(x_train_poly))))# 计算测试集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
print("计算测试集上对数变换后的真实值与预测值之间的均方根误差(RMSE)")
print(np.sqrt(mean_squared_error(y_true=np.log1p(y_test), y_pred=y_predict)))# 计算训练集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
print("计算训练集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)")
print(np.sqrt(mean_squared_error(y_true=y_train, y_pred=np.exp(reg.predict(x_train_poly)))))# 计算测试集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
print("计算测试集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)")
print(np.sqrt(mean_squared_error(y_true=y_test, y_pred=np.exp(y_predict))))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原数据:age     sex    bmi  children smoker     region     charges
0   19  female  27.90         0    yes  southwest  16884.9240
1   18    male  33.77         1     no  southeast   1725.5523
2   28    male  33.00         3     no  southeast   4449.4620
删除系数相关低的列 region、sexage    bmi  children smoker     charges
0   19  27.90         0    yes  16884.9240
1   18  33.77         1     no   1725.5523
2   28  33.00         3     no   4449.4620
bmi,num_child连续值变为离散值age     charges  bmi_over  bmi_under  children_no  children_yes  smoker_no  smoker_yes
0   19  16884.9240     False       True         True         False      False        True
1   18   1725.5523      True      False        False          True       True       False
2   28   4449.4620      True      False        False          True       True       False
计算训练集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
0.38316517904805586
计算测试集上对数变换后的真实值与预测值之间的均方根误差(RMSE)
0.3812317453220069
计算训练集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
4746.576620613462
计算测试集上真实值与预测值(经过指数变换还原)之间的均方根误差(RMSE)
4899.862272153837

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RS232 串行通信:C++ 实现指南

文章目录 一、RS232 简介1. 电气特性2. 传输速率3. 传输距离 二、在 C 中实现 RS232 通信1. Windows 平台(1)打开串行端口(2)配置串行通信参数(3)发送数据(4)接收数据(5&…

Linux指令合集

一、VI的使用 命令行模式:默认此模式,从输入模式回到命令行模式:esc , esc按完,insert消失 输入模式:按 i 进入 , 看到insert就能编辑代码 退出vi 保存代码 命令行模式下 按&#xf…

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…

从多个Excel批量筛查数据后合并到一起

这篇文章将讲解如何批量的从多个Excel文件中筛选出需要的数据,最后合并到一张新的Excel。 全程0代码图形化界面操作。 准备数据 这里准备了3个测试文件,每个文件的格式是一样的 现在我们需要筛选出每个文件里面,基金简称包含“南方远见”&a…

Debian GNU/Linux的新手入门介绍

Debian GNU/Linux:起源、基本介绍与发行版对比 一、起源与发展历程 Debian GNU/Linux 是现存最古老的 Linux 发行版之一,由 Ian Murdock 于 1993 年 8 月 16 日创立。其名称结合了他的女友(后成为妻子)Debra 和他自己的名字 Ian…

Sentinel源码—7.参数限流和注解的实现一

大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …

多数据源配置(MyBatis-Plus vs AbstractRoutingDataSource)

MyBatis-Plus vs AbstractRoutingDataSource MyBatis-Plus多数据源配 1.添加依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> <…

聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥

目录 一、什么是临界区&#xff1f; 二、Mutex类简介 三、Mutex的基本用法 解释&#xff1a; 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释&#xff1a; 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …

stm32week12

stm32学习 九.stm32与HAL库 2.HAL库框架 总架构&#xff1a; 文件介绍&#xff1a; ppp是某一外设&#xff0c;ex是拓展功能 HAL库API函数和变量命名规则&#xff1a; HAL库对寄存器位操作的相关宏定义&#xff1a; HAL库的回调函数&#xff1a; 3.STM32启动过程 MDK编译过…

opencv HSV的具体描述

色调H&#xff1a; 使用角度度量&#xff0c;取值范围为0\~360&#xff0c;从红色开始按逆时针方向计算&#xff0c;红色为0&#xff0c;绿色为120&#xff0c;蓝色为240。它们的补色是&#xff1a;黄色为60&#xff0c;青色为180&#xff0c;紫色为300。通过改变H的值&#x…

Java Lambda表达式指南

一、Lambda表达式基础 1. 什么是Lambda表达式&#xff1f; 匿名函数&#xff1a;没有名称的函数函数式编程&#xff1a;可作为参数传递的代码块简洁语法&#xff1a;替代匿名内部类的更紧凑写法 2. 基本语法 (parameters) -> expression 或 (parameters) -> { statem…

面向对象设计中的类的分类:实体类、控制类和边界类

目录 前言1. 实体类&#xff08;Entity Class&#xff09;1.1 定义和作用1.2 实体类的特点1.3 实体类的示例 2. 控制类&#xff08;Control Class&#xff09;2.1 定义和作用2.2 控制类的特点2.3 控制类的示例 3. 边界类&#xff08;Boundary Class&#xff09;3.1 定义和作用3…

C# 封装教程

原文&#xff1a;C# 封装_w3cschool &#xff08;注&#xff1a;本文为教程文章&#xff0c;请勿标记为付费文章&#xff01;特此声明&#xff09; 封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中&#xff0c;封装是…

量化交易 - RSRS(阻力支撑相对强度)- 正确用法 - 年均收益18%

经过研究&#xff0c;发现RSRS的正确用法其实是需要用到两个数据&#xff0c;分别是 n: 一阶拟合样本数&#xff0c;m:求均值方差样本数&#xff0c;其中n比较小 如18&#xff0c;m比较大 如1100 经过调优后&#xff0c;收益率显著上升&#xff01; 如下图&#xff1a; &…

Oracle expdp的 EXCLUDE 参数详解

Oracle expdp的 EXCLUDE 参数详解 EXCLUDE 是 Oracle Data Pump Export (expdp) 工具中的一个关键参数&#xff0c;用于指定在导出过程中要排除的对象或对象类型。 一、基本语法 expdp username/password DUMPFILEexport.dmp DIRECTORYdpump_dir EXCLUDEobject_type[:name_c…

如何使用3DMAX插件PFSpliner将3D对象转化为艺术样条线?

什么是粒子流源(Particle Flow)是3DMAX的一个功能极其强大的粒子系统。它采用事件驱动模型,使用一个名为“粒子视图”的特殊对话框。在“粒子视图”中,您可以将描述粒子属性(如形状、速度、方向和一段时间内的旋转)的单个运算符组合成称为事件的组。每个操作符都提供一组…

【python】 循环语句(while)

1、循环语句 语法&#xff1a; while 条件:......... #只有条件为真时&#xff0c;才会执行while中的内容。 1.1循环语句基本使用 示例1&#xff1a; print("开始") while 1>2:print("人生得意须尽欢") print("结束") #输出结果&#…

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于OOA-CN…

20250421在荣品的PRO-RK3566开发板的Android13下频繁重启RKNPU fde40000.npu: Adding to iommu gr

20250421在荣品的PRO-RK3566开发板的Android13下频繁重启RKNPU fde40000.npu: Adding to iommu gr 2025/4/21 14:50 缘起&#xff1a;电池没电了&#xff0c;导致荣品的PRO-RK3566的核心板频繁重启。 内核时间4s就重启。100%复现。 PRO-RK3566 Android13启动到这里 复位&#…

动态监控进程

1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法&#xff1a; top [选项] 选项说明 ⭐️僵死进程&#xff1a;内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…