当前位置: 首页 > news >正文

代码实战保险花销预测

文章目录

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

摘要

  • 本文介绍了一个完整的机器学习流程项目,重点涵盖了多元线性回归的建模与评估方法。项目详细讲解了特征工程中的多项实用技巧,包括:通过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.xdnf.cn/news/73225.html

相关文章:

  • AXOP38802: 400nA 超低功耗通用双通道运算放大器
  • JumpServer多用户VNC桌面配置指南:实现多端口远程访问
  • KDD2024 | BCGNN解读
  • 读文献先读图:韦恩图怎么看?
  • 第 2 篇:初探时间序列 - 可视化与基本概念
  • 【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码
  • JFrog Artifactory 制品库命令行操作指南
  • Java虚拟机之GC收集器对比解读
  • 多线程初阶(1.2)
  • 爬虫学习——Item封装数据与Item Pipeline处理数据
  • 垂直机械硬盘与叠瓦机械硬盘的区别及数据恢复难度
  • Kubeflow 快速入门实战(三) - Qwen2.5 微调全流程
  • 影刀RPA - 简单易用且功能强大的自动化工具
  • mybatis plus 多条件查询注意查询条件顺序
  • 2025年渗透测试面试题总结-拷打题库09(题目+回答)
  • LangChain4j-第二篇 |实现声明式 AI 服务 AiService:简化 AI 集成新范式
  • Linux Wlan-四次握手(eapol)框架流程
  • Transformer到MoE:聚客AI大模型核心技术栈完全指南
  • 第一篇:从哲学到管理——实践论与矛盾论如何重塑企业思维
  • c++基础·列表初始化
  • Linux系统-cat命令/more命令/less命令
  • Kubernetes集群超配节点容量
  • MCP的发展历程
  • 批量创建同名文件夹并整理文件至对应文件夹
  • Day5-UFS总结
  • 基于vue框架的电脑配件网上商城18xsv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • aws文件存储服务——S3介绍使用代码集成
  • 第5章:MCP框架详解
  • Python 之 __file__ 变量导致打包 exe 后路径输出不一致的问题
  • skyreels