數據分析學習筆記4:加州房價預測

一、實驗概述

????????本實驗旨在利用機器學習技術,基于加州房價數據集(California Housing Dataset)構建一個房價預測模型。實驗涵蓋了從數據加載、探索性數據分析(EDA)、數據預處理到模型構建與評估的完整流程。核心任務是利用房屋的各項特征(如收入中位數、房齡、平均房間數等)來預測房價中位數(MEDV)。

二、數據來源

? ? ? ? 數據集為機器學習經典數據集:加州房價預測,可以從?sklearn.datasets?直接使用?fetch_california_housing?函數加載。

三、實驗過程

1.相關庫與初始數據加載

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.linear_model import Ridge
from sklearn.linear_model import ElasticNet
from sklearn.model_selection import GridSearchCV# 加載數據集
california = fetch_california_housing()
data = pd.DataFrame(california.data, columns=california.feature_names)
data['MEDV'] = california.target  # X = data.drop('MEDV', axis=1)
y = data['MEDV']

2.數據探索 (EDA)

????????本實驗通過簡單的統計和可視化對數據進行了初步探索:繪制了特征 (data) 和目標變量 (target) 的分布直方圖與特征之間的相關性熱力圖,并對缺失值進行檢測。

#(2)數據探索
#數據缺失值檢測
df_X = pd.DataFrame(X, columns=feature_names)
df_y = pd.DataFrame(y, columns=["Target"])
print(df_X.isnull().sum())
print(df_y.isnull().sum())#數據異常值檢測
for col in df_X.columns:plt.figure(figsize=(6, 4))sns.boxplot(x=df_X[col])plt.title(f'Boxplot of {col}')plt.show()  #特征的基本統計信息
#print(cleaned_df_X.describe())  
cleaned_df_X = pd.DataFrame(cleaned_df_X, columns=feature_names)  # 將 ndarray 轉換為 DataFrame
cleaned_df_y = pd.DataFrame(cleaned_df_y, columns=["Target"])
cleaned_data = pd.concat([cleaned_df_X, cleaned_df_y], axis=1)# 合并特征和目標變量
corr_matrix = cleaned_data.corr()# 計算相關性矩陣
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix,annot=True,     # 顯示數值
)
plt.title("特征與目標變量的相關性熱力圖")
plt.show()

?輸出結果如下:

????????可以看出,原始數據無缺失值,部分變量異常值樣本數量較多,后續需要進行基于Z-score方法的異常值處理。由熱力圖可知,部分變量的相關性十分明顯,如變量 Latitude 與變量 Longitude 具有強負相關性,變量AvgRooms 與變量 Medlnc 具有強正相關性。故擬合模型應采用具有正則化的模型進行。

3. 數據預處理

? ? ? ? 主要進行異常值處理、標準化數據、測試訓練集的劃分的任務。

#(3)數據清洗
z_scores_X = stats.zscore(df_X)
z_scores_y = stats.zscore(df_y)
abs_z_scores_X = np.abs(z_scores_X)
abs_z_scores_y = np.abs(z_scores_y)  #處理異常值
def remove_outliers_iqr(df, factor=1.5):df_cleaned = df.copy()for col in df.columns:Q1 = df[col].quantile(0.25)Q3 = df[col].quantile(0.75)IQR = Q3 - Q1lower_bound = Q1 - factor * IQRupper_bound = Q3 + factor * IQRdf_cleaned = df_cleaned[(df_cleaned[col] >= lower_bound) & (df_cleaned[col] <= upper_bound)]return df_cleanedcleaned_df_X = remove_outliers_iqr(df_X)
cleaned_df_y = y[cleaned_df_X.index]
print("原始樣本數量:", len(df_X))
print("清洗后樣本數量:", len(cleaned_df_X))# 標準化 X
scaler = StandardScaler()
X_scaled = scaler.fit_transform(cleaned_df_X)
y_scaled = cleaned_df_y# 按照 80% 訓練集,20% 測試集劃分
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=7)print("訓練集特征維度:", X_train.shape)
print("測試集特征維度:", X_test.shape)
print("訓練集目標維度:", y_train.shape)
print("測試集目標維度:", y_test.shape)

輸出結果如下:

????????可以看出,進行基于Z-score方法的異常值處理之后,樣本數量由20940下降至16842,為后續模型構建的準確性打下基礎。

4. 模型構建

????????本實驗采用線性回歸、LASSO回歸、嶺回歸、彈性網回歸4類方法進行模型的構建,并以均方誤差 (Mean Squared Error, MSE)與決定系數 (R2 Score)作為模型的評估指標,最終選取效果最優的模型作為最終應用模型。

#(5)線性回歸
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error,r2_score
LR = LinearRegression()
LR.fit(X_train,y_train)
# 預測
y_pred_linear = LR.predict(X_test)#評價
# 模型評估
print("Linear Regression:")
print("MSE:", mean_squared_error(y_test, y_pred_linear))
print("R^2 Score:", r2_score(y_test,y_pred_linear))#(6) LASSO 回歸(帶 L1 正則化)
from sklearn.linear_model import Lassolasso = Lasso(alpha=0.3, max_iter=10000)
lasso.fit(X_train, y_train)# 預測
y_pred_lasso = lasso.predict(X_test)# 模型評估
print("LASSO Regression:")
print("MSE:", mean_squared_error(y_test, y_pred_lasso))
print("R^2 Score:", r2_score(y_test, y_pred_lasso))
print("Coefficients:", lasso.coef_)#(7) 嶺回歸(帶 L2 正則化)
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0, max_iter=10000)
ridge.fit(X_train, y_train)# 預測
y_pred_ridge = ridge.predict(X_test)# 模型評估
print("Ridge Regression:")
print("MSE:", mean_squared_error(y_test, y_pred_ridge))
print("R^2 Score:", r2_score(y_test, y_pred_ridge))
print("Coefficients:", ridge.coef_)#(8) 彈性網回歸(L1 + L2 正則化)
from sklearn.linear_model import ElasticNetelastic_net = ElasticNet(alpha=1.0, l1_ratio=0.2, max_iter=10000)
elastic_net.fit(X_train, y_train)
# 預測
y_pred_elastic = elastic_net.predict(X_test)# 模型評估
print("Elastic Net Regression:")
print("MSE:", mean_squared_error(y_test, y_pred_elastic))
print("R^2 Score:", r2_score(y_test, y_pred_elastic))
print("Coefficients:", elastic_net.coef_)

輸出結果如下:

????????可以看出,在初始為調參的情況下,線性回歸模型與嶺回歸模型在測試集上取得了最佳的預測性能(最低的 RMSE 和最高的 R2 Score),這表明集成學習方法能夠有效學習加州房價數據中的復雜模式和特征交互。

5.模型參數調優(可視化對比)

由于線性回歸模型與嶺回歸參數較少,初始模型已是最優模型,故對LASSO回歸模型與彈性網模型進行參數調優。

#(9)lasso、彈性網模型參數調優
# 1、LASSO 模型
from sklearn.model_selection import GridSearchCVparam_grid_lasso = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0]}# LASSO 回歸參數范圍
lasso = Lasso(max_iter=10000)# 網格搜索
grid_lasso = GridSearchCV(lasso, param_grid_lasso, scoring='neg_mean_squared_error', cv=5)
grid_lasso.fit(X_train, y_train)# 最佳參數和最佳模型
best_lasso = grid_lasso.best_estimator_
y_pred_lasso_best = best_lasso.predict(X_test)print("LASSO - Best params:", grid_lasso.best_params_)
print("MSE after tuning:", mean_squared_error(y_test, y_pred_lasso_best))
print("R^2 Score after tuning:", r2_score(y_test, y_pred_lasso_best))# 2、ElasticNet 模型
param_grid_elastic = {'alpha': [0.001, 0.01, 0.1, 1.0, 10.0],'l1_ratio': [0.1, 0.3, 0.5, 0.7, 0.9]
}#ElasticNet 參數范圍elastic_net = ElasticNet(max_iter=10000)# 網格搜索
grid_elastic = GridSearchCV(elastic_net, param_grid_elastic, scoring='neg_mean_squared_error', cv=5)
grid_elastic.fit(X_train, y_train)# 最佳模型
best_elastic = grid_elastic.best_estimator_
y_pred_elastic_best = best_elastic.predict(X_test)print("ElasticNet - Best params:", grid_elastic.best_params_)
print("MSE after tuning:", mean_squared_error(y_test, y_pred_elastic_best))
print("R^2 Score after tuning:", r2_score(y_test, y_pred_elastic_best))plt.figure(figsize=(10, 10))# 調參前 LASSO
plt.subplot(2, 2, 1)
plt.scatter(y_test, y_pred_lasso, alpha=0.6)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('LASSO (Before Tuning)')
plt.xlabel('True Values')
plt.ylabel('Predictions')# 調參后 LASSO
plt.subplot(2, 2, 2)
plt.scatter(y_test, y_pred_lasso_best, alpha=0.6)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('LASSO (After Tuning)')
plt.xlabel('True Values')
plt.ylabel('Predictions')# 調參前 ElasticNet
plt.subplot(2, 2, 3)
plt.scatter(y_test, y_pred_elastic, alpha=0.6)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('ElasticNet (Before Tuning)')
plt.xlabel('True Values')
plt.ylabel('Predictions')# 調參后 ElasticNet
plt.subplot(2, 2, 4)
plt.scatter(y_test, y_pred_elastic_best, alpha=0.6)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linestyle='--')
plt.title('ElasticNet (After Tuning)')
plt.xlabel('True Values')
plt.ylabel('Predictions')plt.tight_layout()
plt.show()

輸出結果如下:

????????可以看出,相對初始模型,參數調優后的LASSO模型與彈性網模型在測試集的評價大幅上升,效果與線性回歸和嶺回歸相差無幾。

四、 結論

????????本實驗成功完成了加州房價預測的任務。通過數據加載、清洗、探索性分析和特征工程,為模型訓練準備了高質量的數據。通過嘗試不同的回歸模型,發現選擇的4類模型在該數據集上表現相差無幾,都可以相對準確地預測房價中位數。

改進方向:

  1. 進一步的特征工程:?可以嘗試創建特征之間的交互項或多項式特征,或許能進一步提升模型性能。

  2. 嘗試其他模型:?可以嘗試使用梯度提升樹(如?XGBoost,?LightGBM)等更強大的集成模型。

  3. 深入分析誤差:?分析預測誤差較大的樣本點,找出這些樣本的共同特征,有助于理解模型的局限性并指導下一步的優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920426.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

openEuler Embedded 的 Yocto入門 : 2. 構建一個Hello,world!

獲取BitBake 官方下載 git clone https://git.yoctoproject.org/poky cd poky/bitbake國內鏡像下載&#xff08;推薦&#xff09; git clone https://gitee.com/openeuler/yocto-poky.git -b v3.3.6 cd yocto-poky/bitbake配置BitBake環境 export PATH/path/to/bitbake/bin:$PA…

人工智能物聯網(AIoT)的技術邏輯、核心價值與典型應用場景解析

一、AIoT 技術&#xff1a;從 “連接” 到 “智能” 的底層邏輯 在企業數字化轉型過程中&#xff0c;“數據” 常被視為核心資產&#xff0c;但如何讓海量數據產生實際價值&#xff0c;卻成為多數組織的難題。根據 Gartner 2024 年發布的調查數據&#xff0c;87% 的組織商業智…

SpringBoot系列之實現高效批量寫入數據

Spring Boot 實現高效批量插入數據的實踐指南 在實際開發中&#xff0c;我們經常會遇到需要批量插入大量數據到數據庫的場景。如果使用傳統的單條插入方式&#xff0c;不僅效率低下&#xff0c;還會給數據庫帶來巨大壓力。本文將介紹如何使用 Spring Boot 實現高效 批量數據插入…

SQL語言基礎知識(2)

在學會創建數據庫之后&#xff0c;在數據庫中需要創建表&#xff08;實體以表的形式存在&#xff09;&#xff0c;以及對表中存儲的數據記錄進行定義&#xff0c;相當于 Java 語言中對類編寫其屬性。在定義前我們需要了解 SQL 語言有哪些數據類型。一、數據類型1.1 數據值類型1…

響應式編程框架Reactor【1】

文章目錄一、Reactor 框架概述與理論基礎1.1 響應式編程&#xff08;Reactive Programming&#xff09;是什么&#xff1f;1.2 Reactive Streams 規范1.3 響應式編程與 Reactor 的誕生1.4 Reactor核心特性1.5 Reactor與其它響應式框架比較二、Reactor核心類型2.1 Reactor 核心概…

【LeetCode】29. 兩數相除(Divide Two Integers)

文章目錄29. 兩數相除&#xff08;Divide Two Integers&#xff09;1. 題目重述與約束解析2. 算法選擇與總體設計3. 核心難點與關鍵技巧4. 解法一&#xff1a;快倍增&#xff08;重復加倍減法&#xff09;4.1 思路4.2 流程圖4.3 正確性要點5. 解法二&#xff1a;位移長除法&…

智能物聯網(AIoT)核心技術落地路徑與企業數字化轉型適配方案

一、行業現狀&#xff1a;AIoT 落地潛力與企業轉型痛點并存根據中國信通院《2023 年中國物聯網發展白皮書》數據&#xff0c;截至 2023 年&#xff0c;我國物聯網設備連接數已突破 300 億&#xff0c;龐大的設備基數為企業數字化轉型奠定了技術基礎。但與之形成鮮明對比的是&am…

前端文件下載的三種方式:URL、二進制與 Base64 的深度解析

前言在 Web 應用開發中&#xff0c;文件下載是一個常見的功能需求。從簡單的圖片保存到復雜的報表導出&#xff0c;前端開發者需要根據后端返回的數據格式選擇合適的處理方式。本文探討三種主流的文件下載方式 —— 基于 URL、二進制數據和 Base64 編碼的實現原理、區別對比及通…

B站 XMCVE Pwn入門課程學習筆記(8)

這個視頻講的比較難&#xff0c;我花了比較長時間來分析&#xff0c;甚至一個點反復很多次&#xff0c;這也是在學PWN的過程中不可避免的&#xff0c;需要堅持和毅力pwn3:沒有system&#xff0c;通過ROP調用write的plt入口&#xff0c;執行write函數&#xff0c;并且將gots里的…

AMGCL介紹和使用

文章目錄一、AMGCL 簡介1.1 什么是 AMG&#xff1f;1.2 AMGCL 特點二、安裝與配置2.1 獲取源碼2.2 編譯依賴&#xff08;可選&#xff09;三、基本使用示例3.1 構造稀疏矩陣&#xff08;以 1D Poisson 為例&#xff09;四、核心組件介紹4.1 后端&#xff08;Backend&#xff09…

AI解決生活小事系列——用AI給我的電腦做一次“深度體檢”

哈嘍&#xff0c;大家好&#xff0c;這里是Ai極客團長&#xff0c;我打算做一個用AI解決生活實際問題的系列專欄。 決定做這個系列的初衷很簡單&#xff1a;現在打開手機、電腦&#xff0c;到處都是 "AI 改變世界" 的宏大敘事&#xff0c;但對普通人來說&#xff0c…

JavaWeb 30 天入門:第二十一天 ——AJAX 異步交互技術

在前二十天的學習中&#xff0c;我們掌握了 JavaWeb 開發的核心技術&#xff0c;包括 Servlet、JSP、會話管理、過濾器、監聽器、文件操作、數據庫交互、連接池、分頁與排序等。今天我們將學習一項徹底改變 Web 應用交互方式的技術 ——AJAX&#xff08;Asynchronous JavaScrip…

從枯燥C++到趣味音樂:我的Windows系統底層探索之旅

一段穿越計算機抽象層次的旅程&#xff0c;從高級語言到底層硬件&#xff0c;探索代碼如何創造美妙旋律第一章&#xff1a;初學C的枯燥與靈感閃現 當我第一次打開《C Primer Plus》這本厚重的教程時&#xff0c;面對那些晦澀的語法規則和抽象概念&#xff0c;確實感到有些枯燥乏…

taro+vue3+vite項目 tailwind 踩坑記,附修復后的模板源碼地址

tailwind 踩坑記 這&#xff0c;是taro官網地址&#xff1a;taro引入tailwind的教程 我完全按照上面的步驟來&#xff0c;結果根本無效&#xff08;文檔太過時了&#xff09; 我后來又按照 weapp-tailwindcss 的官方文檔做了一番修正&#xff1a; weapp-tailwindcss Taro (所…

LCEDA電氣規則

MARK點普通問題 鋪銅太靠近MARK點放置一個禁止區域&#xff0c;圓形編輯封裝

無人機Remote ID:天空中的數字車牌與未來空域管理

一架沒有牌照的汽車上路會被交管部門處罰,那么一架沒有“數字車牌”的無人機升空呢?隨著無人機Remote ID技術的推廣,未來天空中的每架無人機都將擁有自己的身份標識。 近年來,無人機呈爆炸式增長,從航拍攝影到物流配送,從農業植保到應急救援,應用場景不斷拓展。但隨著無…

自下而上的樹形dp

最大獨立集 1.藍橋舞會 link:1.藍橋舞會 - 藍橋云課 分析&#xff1a; code #include <bits/stdc.h> using namespace std; using ll long long; const ll MAXN 1e5 7; ll hpy[MAXN], fa[MAXN], dp[MAXN][2]; vector<ll> sons[MAXN];void dfs(ll u, ll fa) {…

Docker 詳解+示例

介 紹Docker 是一個開源的容器化平臺&#xff0c;它的核心目標是解決 “軟件在不同環境下運行不一致” 的問題&#xff0c;實現 “一次構建&#xff0c;到處運行” 。它基于 Linux 內核的底層技術&#xff0c;將應用程序及其依賴&#xff08;如庫文件、配置、運行環境等&#x…

洛谷 P2568 GCD-提高+/省選?

題目描述 給定正整數 nnn&#xff0c;求 1≤x,y≤n1\le x,y\le n1≤x,y≤n 且 gcd?(x,y)\gcd(x,y)gcd(x,y) 為素數的數對 (x,y)(x,y)(x,y) 有多少對。 輸入格式 只有一行一個整數&#xff0c;代表 nnn。 輸出格式 一行一個整數表示答案。 輸入輸出樣例 #1 輸入 #1 4輸…

軟件測試覆蓋率與質量保障專業經驗分享報告

測試覆蓋率的核心維度與評估標準 多維度定義與核心內涵 測試覆蓋率是衡量軟件測試完整性的關鍵指標體系,分為測試覆蓋率(黑盒視角:需求驗證程度)和代碼覆蓋率(白盒視角:代碼執行占比)兩大基礎類型。現代測試覆蓋體系已擴展至產品覆蓋、風險覆蓋、平臺/設備覆蓋、數據覆…