Python房價分析(二)隨機森林分類模型

目錄

1 數據預處理

1.1 房價數據介紹

1.2 數據預處理

1.2.1?缺失值處理

1.2.2異常值處理

1.2.3 數據歸一化

1.2.4 分類特征編碼

2 隨機森林模型

2.1?模型概述

2.2 建模步驟

2.3 參數搜索過程

3模型評估

3.1 模型評估結果

3.2 混淆矩陣

3.3 繪制房價類別三分類的ROC曲線和AUC數值

3.4 特征重要性可視化

總結


往期精彩內容:

房價分析(0)反爬蟲機制_python爬取房價數據-CSDN博客

Python房價分析(一)pyton爬蟲-CSDN博客

Python房價分析(三)支持向量機SVM分類模型-CSDN博客

1 數據預處理

1.1 房價數據介紹

房價數據來源于上期Python爬蟲所獲取的數據

Python房價分析(一)pyton爬蟲-CSDN博客

本文采用宜昌市二手房數據進行講解,數據如圖所示,共3000條樣本,有區域、街道、房型、朝向、面積、樓層數、裝修類型、房屋結構、收藏數、價格 10個特征。

1.2 數據預處理

數據的偏離程度以及數據之間的關聯性會拉大整體數據標準差、造成統計偏見以及使數據帶有指向性偏好,這都會影響到我們最終模型和分析的結果,造成偏差,可見在進行統計與計算前對數據處理的必要性與重要性。

1.2.1?缺失值處理

????????對于給定的二手房數據中,可能某些特征存在一定的缺失值,當個別樣本缺失某些指標數據,模型的訓練就難以進行,若不對其進行缺失值填補則做分析時會被剔除進而不能參與最終的各項排名和綜合評價,影響后續的數據分析。

????????因此,基于本數據相關特征指標的缺失數量占總數據的比重較小,為了不丟棄大量隱藏在刪除對象中的信息,避免數據發生偏離,我們對數值型指標的缺失值進行0值填充,對于分類特征的缺失值,將“nan”(缺失值)視為有效的特征值,并為其創建指示符特征。

其中可選的插補策略包括

  • 平均值mean

  • 中位數median

  • 眾數most_frequency

  • 固定值constant

1.2.2異常值處理

對于異常值,不是刪除“異常數據”,而是將這些數據“拉回”到正常的值,本文通過確定指標的上下限,然后對于超過或者低于限值的數據均為限值,其上下限數值通過MAD(mean absolute deviation)即絕對值差中位數法判斷,來處理因子數據集中的異常值。

#對大于97.5%分位數的因子值,或小于2.5%分位數的因子值進行調整  容易理解,去除兩頭,只需調節參數,量化中較常用
def extreme_percentile(series,min=0.025,max=0.975):p = series.quantile([min,max])                  # 得到上下限的值return series.clip(p.iloc[0],p.iloc[1])  # 超出上下限的值,賦值為上下限

1.2.3 數據歸一化

由于數據集中大多數特征指標不滿足正態分布,不能采用常規的z-score 標準化。而數據集經過異常值處理后,減小了數據歸一化受離群點影響,我們采用Min-Max歸一化即極差法,將數據集中列數值縮放到0和1之間,來處理量綱的問題。

講解一下為什么需要歸一化

  • 歸一化后加快了梯度下降求最優解的速度:如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂;

  • 歸一化有可能提高精度:一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特征值域范圍非常大,那么距離計算就主要取決于這個特征,從而與實際情況相悖(比如這時實際情況是值域范圍小的特征更重要)

哪些機器學習算法不需要(需要)做歸一化?

  • 概率模型(樹形模型)不需要歸一化,因為它們不關心變量的值,而是關心變量的分布和變量之間的條件概率,如決策樹、RF;

  • 像Adaboost、SVM、LR、Knn、KMeans之類的最優化問題就需要歸一化。

1.2.4 分類特征編碼

對于數據集中的多分類特征變量,把不能量化的多分類變量量化,使得每個啞變量對模型的影響都細化,從而提高模型精準率。分類變量編碼能夠加速參數的更新速度;使得一個很大權值管理一個特征,拆分成了許多小的權值管理這個特征多個表示,降低了特征值擾動對模型的影響,模型具有更好的魯棒性。因此,我們采用OneHot獨熱編碼來為其創建分類類別特征。

from sklearn.preprocessing import OneHotEncoder
# 構造數據
X_train = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox'], ['female', 'from China', 'uses Safari']]
# 編碼器
encoder = OneHotEncoder()
encoder = encoder.fit(X_train)
# 編碼
X = [['female', 'from Europe', 'uses Safari']]
X_transform = encoder.transform(X) 
X_transform.toarray()     # 默認返回的是稀疏矩陣, 用toarray()方法可以轉為np.array格式
>> array([[1., 0., 0., 1., 0., 0., 1.]])

2 隨機森林模型

2.1?模型概述

隨機森林是一種集成算法(Ensemble Learning),它是屬于Bagging類型。由于采用了集成算法,機器訓練后得到的結果會比那些只通過單個算法得到的結果更加準確,它可以用來解決分類和回歸問題[1]。隨機森林需要進行模擬和迭代,它通過隨機抽取樣本和特征,建立多棵相互不關聯的決策樹,每棵決策樹都能通過抽取的樣本和特征得出一個預測結果,通過綜合所有樹的結果取平均值,得到整個森林的回歸預測結果。具體算法結構如圖所示。

隨機森林有眾多優點,如:對特征很多的數據也可以適用 , 不用降維,不需要做特征選擇;可以輸出特征的重要性排序,方便邏輯解釋;可以判斷出不同特征之間的相互影響;訓練速度比較快;不容易過擬合;可以適用不平衡的數據等[2]。另外, 隨機森林不僅能處理離散型數據,還能處理連續型數據,而且不需要將數據集規范化。基于以上優點,選取隨機森林模型來對二手房價格進行分類與預測。

2.2 建模步驟

Step1.特征變量和目標變量提取,我們分析利用二手房價高、中、低三分類作為目標變量,把區域、街道、樓房名稱、戶型、朝向、建筑面積、樓層、裝修、結構、關注作為特征變量;

Step2.先對特征數據集進行標準化處理,然后進行訓練集和測試集數據劃分,本文將原始數據集進行分割,將訓練集與測試集進行劃分,將前70%的數據作為訓練集,后30%的數據作為測試集;

導入相關包

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier  # 隨機森林分類
from sklearn.model_selection import train_test_split,GridSearchCV,cross_val_score
from sklearn.metrics import accuracy_score # 引入準確度評分函數
from sklearn.metrics import mean_squared_error
from sklearn.metrics import confusion_matrix, accuracy_score,classification_report
from sklearn import preprocessing
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')

讀取 預處理后的 數據

# 讀取 預處理后的 數據
price_classify_data = pd.read_csv('yichang_deal.csv')
X = price_classify_data[['zone_label','street_label','type_label','toward_label','area','floor_label','decorate_label','structure_label','follow']]Y = price_classify_data['price_label']
# 標準化
X = preprocessing.scale(X)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=200)  # 隨機數種子

Step3.利用Python的開源機器學習庫scikit-learn構建分類模型,采用隨機森林回歸方法進行建模,并通過設置不同決策樹數量來評估隨機森林方法的分類能力。

2.3 參數搜索過程

首先我們對最重要的超參數n_estimators即決策樹數量進行調試,通過不同數目的樹情況下,在訓練集和測試集上的均方根誤差來判斷

以及最優參數和最高得分進行分析,如下所示。

###調n_estimators參數
ScoreAll = []
for i in range(90,200,10):DT = RandomForestClassifier(n_estimators = i,random_state = 1) #,criterion = 'entropy'score = cross_val_score(DT,X_train,Y_train,cv=6).mean()ScoreAll.append([i,score])
ScoreAll = np.array(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] ##這句話看似很長的,其實就是找出最高得分對應的索引
print("最優參數以及最高得分:",ScoreAll[max_score])  
plt.figure(figsize=[20,5])
plt.plot(ScoreAll[:,0],ScoreAll[:,1],'r-o',label='最高得分',color='orange')
plt.xlabel('n_estimators參數')
plt.ylabel('分數')
plt.grid()
plt.legend()
plt.show()

很明顯,決策樹個數設置在130的時候回歸森林預測模型的測試集均方根誤差最小,得分最高,效果最顯著。因此,我們通過網格搜索進行小范圍搜索,構建隨機森林預測模型時選取的決策樹個數為130。

在確定決策樹數量大概范圍后,搜索決策樹的最大深度的最高得分,如下所示。

# 探索max_depth的最佳參數
ScoreAll = []  
for i in range(10,30,3):  DT = RandomForestClassifier(n_estimators = 130,random_state = 1,max_depth =i ) #,criterion = 'entropy'  score = cross_val_score(DT,X_train,Y_train,cv=10).mean()  ScoreAll.append([i,score])  
ScoreAll = np.array(ScoreAll)  max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] 
print("最優參數以及最高得分:",ScoreAll[max_score])    
plt.figure(figsize=[20,5])  
plt.plot(ScoreAll[:,0],ScoreAll[:,1]) 
plt.xlabel('max_depth最佳參數')
plt.ylabel('分數')
plt.grid()
plt.legend() 
plt.show()  

決策樹的深度為22。

網格搜索調參:

通過網格搜索,我們對最終的模型超參數進行分析,得出重要超參數如表所示。采用10折交叉驗證,節點分裂評價準則為基尼系數,決策樹數量為128,內部節點分裂的最小樣本數為2,葉子節點的最小樣本數為1,樹的最大深度為22,葉子節點的最大數量為50。有放回采樣為True,袋外數據測試為False,劃分時考慮的最大特征比例為默認值。

2.4 模型訓練與分類

model = RandomForestClassifier(n_estimators=128,max_depth=22,random_state=1) # min_samples_leaf=11
model.fit(X_train,Y_train)score = model.score(X_test,Y_test)
print('模型分數:',score)
# 計算在訓練集和測試集上的預測均方根誤差
model_lab = model.predict(X_train)
model_pre = model.predict(X_test)
train_mse = mean_squared_error(Y_train,model_lab)
test_mse = mean_squared_error(Y_test,model_pre)
print('訓練數據集上的均方根誤差:',train_mse)
print('測試數據集上的均方根誤差:',test_mse)# 模型使用與評估
y_pred = model.predict(X_test)
print("準確率: %.3f" % accuracy_score(Y_test, y_pred))

3模型評估

3.1 模型評估結果

模型評估結果如表所示,表中展示了訓練集和測試集的分類評價指標,通過量化指標來衡量隨機森林對訓練、測試數據的分類效果。準確率:預測正確樣本占總樣本的比例,準確率越大越好;召回率:實際為正樣本的結果中,預測為正樣本的比例,召回率越大越好;精確率:預測出來為正樣本的結果中,實際為正樣本的比例,精確率越大越好;F1:精確率和召回率的調和平均,精確率和召回率是互相影響的,雖然兩者都高是一種期望的理想情況,然而實際中常常是精確率高、召回率就低,或者召回率低、但精確率高。若需要兼顧兩者,那么就可以用F1指標。隨機森林的精確率較高。隨機森林分類模型分數結果為0.818.

3.2 混淆矩陣

# 混淆矩陣
from sklearn.metrics import confusion_matrix
import matplotlib.ticker as tickercm = confusion_matrix(Y_test, y_pred,labels=[0,1,-1])
print('混淆矩陣:\n', cm)
labels=['-1','0','1']
from sklearn.metrics import ConfusionMatrixDisplay
cm_display = ConfusionMatrixDisplay(cm,display_labels=labels).plot()

以熱力圖的形式展示了隨機森林分類模型結果的混淆矩陣

3.3 繪制房價類別三分類的ROC曲線和AUC數值

模型ROC曲線和AUC數值如圖16所示,圖16中的橙色線為參考,即在不使用模型的情況下,Sensitivity 和1-Specificity之比恒等于1。通過繪制ROC曲線,重要的是計算折線下的面積,即圖中的陰影部分,這個面積稱為AUC。在做模型評估時,希望AUC的值越大越好,通常情況下,當AUC在0.8以上時,模型就基本可以接受了。在AUC>0.5的情況下,AUC越接近于1,說明模型效果越好;AUC在 0.5~0.7時有較低準確性,AUC在0.7~0.9時有一定準確性,AUC在0.9以上時有較高準確性;AUC=0.5時,跟隨機猜測一樣,模型沒有分類價值;AUC<0.5時,比隨機猜測還差。然而隨機森林分類模型三種分類的AUC值都在0.90以上,說明模型分類效果明顯,有較高準確性。

3.4 特征重要性可視化

features = X.columns
importances = model.feature_importances_
df = pd.DataFrame()
df['特征'] = features
df['重要性'] = importances
df = df.sort_values('重要性',ascending=False)
# df.iloc[2,1] = df.iloc[2,1]+0.2
xx = df['特征']
yy = df['重要性']
colors = ['darkgreen','gold','red','navy','orange','lime','plum','sienna']
plt.figure(figsize=(15,5))
plt.barh(xx,yy,0.4,color=colors,alpha=0.8)#color參數傳入顏色列表,可以在一幅圖中顯示不同顏色
plt.xlabel('Importance score')
plt.ylabel('variable')
plt.title('RandomForestRegressor')
plt.grid()
plt.show()

分類標簽對房價的影響中,街道位置對房價的影響重要性最大,區域和建造面積重要性其次,相比較,房子的構造和戶型以及房子朝向對房價的影響重要性較小,裝修、關注度以及樓層層次對房價的影響重要性適中。

總結

通過對宜昌市二手房數據的分析,我們探討了影響房價的重要因素,并對房價進行分類,熟悉了python中numpy和pandas等高級數據處理包的應用,并掌握了數據分析的步驟和流程。經過機器學習中對隨機森林模型的研究,進一步加深了對機器學習的了解,熟悉了隨機森林模型的原理和在python中的使用方法,并加深了對機器學習模型常用評價指標的了解,每種算法都有其各自的優點和使用場景,沒有最好的算法,只有更好的數據。

參考資料

[1]李超.機器學習模型在股票價格時間序列分析中的應用與比較[J].電子世界,2021(09):66-70.

[2]李巖. 基于隨機森林的滬深300預測研究[J]. 品牌研究,2022(2):108-110.

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

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

相關文章

面試官:性能測試瓶頸調優你是真的會嗎?

引言&#xff1a;性能瓶頸調優 在實際的性能測試中&#xff0c;會遇到各種各樣的問題&#xff0c;比如 TPS 壓不上去等&#xff0c;導致這種現象的原因有很多&#xff0c;測試人員應配合開發人員進行分析&#xff0c;盡快找出瓶頸所在。 理想的性能測試指標結果可能不是很高&…

Linux內核--內存管理(六)補充--進程頁表

目錄 一、引言 二、頁表 ------>2.1、頁表的大小 ------>2.2、頁表起始地址 ------>2.3、CPU調度 ------>2.4、用戶態訪問虛擬地址 ------>2.5、頁表組成部分 ------------>2.5.1、進程用戶態頁表 ------------>2.5.2、內核態頁表 ------>2.…

c++學習之異常

前言 早在c語言的時候&#xff0c;就已經有處理錯誤的方式了&#xff0c;第一種方式太過暴力&#xff0c;就是斷言&#xff0c;程序發生錯誤&#xff0c;直接終止退出&#xff0c;這樣的報錯對于真正開發應用等太過暴力。第二種方式&#xff0c;就是返回errno&#xff0c;其實&…

Latex公式中矩陣的方括號和圓括號表示方法

一、背景 在使用Latex寫論文時&#xff0c;不可避免的涉及到矩陣公式。有的期刊要求矩陣用方括號&#xff0c;有的期刊要求矩陣用圓括號。因此&#xff0c;特記錄一下Latex源碼在兩種表示方法上的區別&#xff0c;以及數組和方程組的擴展。 二、矩陣的方括號表示 首先所有的…

OpenGLES:glReadPixels()獲取相機GLSurfaceView預覽數據并保存

Android現行的Camera API2機制可以通過onImageAvailable(ImageReader reader)回調從底層獲取到Jpeg、Yuv和Raw三種格式的Image&#xff0c;然后通過保存Image實現拍照功能&#xff0c;但是卻并沒有Api能直接在上層直接拿到實時預覽的數據。 Android Camera預覽的實現是上層下發…

Java學習筆記——instanceof關鍵字

instanceof關鍵字&#xff1a; 作用&#xff1a;保證對象向下轉型的安全性在對象向下轉型前判斷某一對象實例是否屬于某個類 判斷時&#xff0c;如果對象是null&#xff0c;則 instanceof 判斷結果為 false

Spring Boot 整合kafka:生產者ack機制和消費者AckMode消費模式、手動提交ACK

目錄 生產者ack機制消費者ack模式手動提交ACK 生產者ack機制 Kafka 生產者的 ACK 機制指的是生產者在發送消息后&#xff0c;對消息副本的確認機制。ACK 機制可以幫助生產者確保消息被成功寫入 Kafka 集群中的多個副本&#xff0c;并在需要時獲取確認信息。 Kafka 提供了三種…

ei源刊和ei會議的幾個區別

1、含義不同 公開發表論文&#xff0c;可以在期刊上刊登&#xff0c;也可以在會議上宣讀。ei源刊對應的是期刊&#xff0c;是指被ei檢索收錄的工程類的期刊。ei會議對應的是會議&#xff0c;是指被ei檢索收錄的會議。 2、檢索類型不同 期刊和會議都能被ei檢索&#xff0c;但…

Tr0ll

信息收集 探測主機存活信息&#xff1a; nmap -sn --min-rate 10000 192.168.182.0/24Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-14 15:45 CST Nmap scan report for 192.168.182.1 Host is up (0.00026s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…

qt 雙緩沖機制

在圖形編程中&#xff0c;雙緩沖機制是一種常用的技術&#xff0c;用于減少圖形繪制時的閃爍和抖動。它的基本思想是將圖形繪制到一個后臺緩沖中&#xff0c;然后一次性將后臺緩沖的內容顯示到屏幕上。 在 Qt 中&#xff0c;雙緩沖機制可以通過QPainter的begin()和end()方法來實…

Linux環境下socket本地通信

最近項目有用到了socket本地通信&#xff0c;故復習一下。之前都是基于本地虛擬機的ip地址通信的&#xff0c;現在項目&#xff0c;Linux單板上面有2個進程需要通信&#xff0c;故用到了本地socket通信&#xff0c;主要其實就是用了sockfd,文件描述符&#xff0c;也叫句柄。 服…

java接入gpt開發

前情提要 本次文章使用編譯器為IDEA2020 使用GPT模型為百度旗下的千帆大模型 如果是個人用或者不流傳出去&#xff0c;可以無腦入&#xff0c;因為會免費送20塊錢&#xff08;夠用上萬次&#xff09; 代金卷查看 正式教程&#xff1a; 百度智能云控制臺 (baidu.com) 按照步…

JMS(Java Message Service)使用指南

介紹 JMS即Java消息服務&#xff08;Java Message Service&#xff09;應用程序接口&#xff0c;是一個Java平臺中關于面向消息中間件&#xff08;MOM&#xff09;的API&#xff0c;用于在兩個應用程序之間&#xff0c;或分布式系統中發送消息&#xff0c;進行異步通信。它是一…

基于單片機智能病床呼叫系統設計

**單片機設計介紹&#xff0c;基于單片機智能病床呼叫系統設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于單片機的智能病床呼叫系統是一種利用單片機技術設計的醫療設備&#xff0c;它能夠幫助病人在住院期間快速、方便…

國內大廠機器人賽道產品

大疆 大疆無人機自然不必說&#xff0c;除此之外大疆搞機甲大師&#xff0c;教育機器人。 字節 當前字節在機器人領域只是初步探索階段&#xff0c;目前尚未發布相關產品&#xff08;截止至23.12&#xff09;。 管理層想法&#xff1a; 跟已有業務做結合&#xff0c;服務好…

Java設計模式分類

java的設計模式大體上分為三大類&#xff1a; 創建型模式&#xff08;5種&#xff09;&#xff1a;工廠方法模式&#xff0c;抽象工廠模式&#xff0c;單例模式&#xff0c;建造者模式&#xff0c;原型模式。 結構型模式&#xff08;7種&#xff09;&#xff1a;適配器模式&am…

傳感器(一) :IMU / 陀螺儀模塊

IMU / 陀螺儀模塊 一、概述二、注意參數2.1 陀螺儀芯片標準&#xff08;MPU6050)2.2 參數說明 三、IMU模式使用注意事項3.1 IMU模塊安裝注意事項3.2 為什么IMU要安裝在機器中心位置 四、常見陀螺儀芯片品牌 一、概述 IMU全稱為慣性測量單元&#xff0c;可以通過測量物體在三維空…

Linux實用操作

一、各類小技巧&#xff08;快捷鍵&#xff09; 1.1 ctrl c 強制停止 Linux某些程序的運行&#xff0c;如果想要強制停止它&#xff0c;可以使用快捷鍵ctrl c 命令輸入錯誤&#xff0c;也可以通過快捷鍵ctrl c&#xff0c;退出當前輸入&#xff0c;重新輸入 1.2 ctrl d…

Leetcode刷題筆記——摩爾投票法

摩爾投票法的核心思想為對拼消耗。 摩你媽&#xff0c;學不會&#xff01;&#xff01;&#xff01;&#xff01; 229. 多數元素 II - 力扣&#xff08;LeetCode&#xff09;

ReLU(Rectified Linear Unit)和Sigmoid激活函數

ReLU&#xff08;Rectified Linear Unit&#xff09;和Sigmoid都是神經網絡中常用的激活函數。 特點&#xff1a; ReLU是一種簡單而有效的激活函數。它對于正數部分直接返回輸入&#xff0c;對于負數部分返回零。這種非線性轉換有助于網絡學習更復雜的表示。ReLU在許多深度學習…