代碼實戰保險花銷預測

文章目錄

  • 摘要
  • 項目地址
  • 實戰代碼(初級版)
  • 實戰代碼(進階版)

摘要

  • 本文介紹了一個完整的機器學習流程項目,重點涵蓋了多元線性回歸的建模與評估方法。項目詳細講解了特征工程中的多項實用技巧,包括:通過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.pswp.cn/news/902293.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902293.shtml
英文地址,請注明出處:http://en.pswp.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;內存沒有釋放,但是進程已經停止工作了,需要及時清理 交互操作說明 應用案…