三種回歸模型對朝陽區(qū)房價預(yù)測的效果對比

一:前言

利用上次爬取的朝陽區(qū)房價數(shù)據(jù)诱告,通過簡單線性回歸模型、決策樹回歸模型吠架、xgboost回歸模型來進行房價預(yù)測效果對比芙贫,期間遇到一些問題和解決方法也記錄下來。
目的:練習(xí)相關(guān)sklearn傍药,xgboost模塊和學(xué)習(xí)驗證結(jié)果的方法磺平。


二:運行環(huán)境

  • Anaconda Python 3.6
  • xgboost 0.7
  • scikit-learn 0.19.1
  • pandas 0.20.3

安裝anaconda 后科學(xué)計算相關(guān)庫就有了,但是xgboost安裝沒有拐辽,需要下載軟件編譯xgboost的文件拣挪。這里我推薦一個更直接的方法:到這里下載對應(yīng)版本的xgboost
https://www.lfd.uci.edu/~gohlke/pythonlibs/
然后pip安裝即可,幾秒后你將擁有xgboost模塊俱诸。

pip install xgboost-0.7-cp36-cp36m-win_amd64.whl

三:引入模塊和數(shù)據(jù)

全部代碼存放于: https://github.com/rieuse/Machine_Learning/

  1. 首先來導(dǎo)入相關(guān)模塊菠劝,這里的 learning_curve 用來查看訓(xùn)練的擬合過程,也可以利用validation_curve來確定相關(guān)模型里面的最佳參數(shù)乙埃,比如DecisionTreeRegressord闸英、XGBRegressor中的max_depth需要多次訓(xùn)練找出最佳值。
import pandas as pd
import numpy as np
from sklearn.learning_curve import learning_curve
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from xgboost import XGBRegressor
import matplotlib.pyplot as plt
  1. 下面是導(dǎo)入之前的數(shù)據(jù)介袜,取出合適的數(shù)據(jù)做為訓(xùn)練使用甫何。房屋一些大小,房價數(shù)目遇伞,每平米價格是自變量而價格是因變量辙喂,也就是需要預(yù)測的對象。
row_df = pd.read_csv('house_price.csv')
df = row_df[row_df.iloc[:,1] !='多']
data_X = df[['rooms','halls','size','unit_price']]
data_y = df.price

四:簡單線性回歸模型

引入模塊和數(shù)據(jù)后開始構(gòu)建回歸模型,LinearRegression() 是本次用的線性回歸巍耗,train_sizes=np.linspace(0.0, 1.0, num=30)[1:]這個在可視化訓(xùn)練過程中對應(yīng)曲線多少個位置秋麸。0不取所以使用切片[1:]。cv=10 采用K折交叉驗證 scoring='r2' 表示采用R2的預(yù)測得分計算方法 也可以采用均方誤差炬太。

train_sizes, train_score, test_score = learning_curve(
    LinearRegression(), data_X, data_y, cv=10, scoring='r2',
    train_sizes=np.linspace(0.0, 1.0, num=30)[1:])

下面就是求取訓(xùn)練和測試過程中的預(yù)測得分情況灸蟆,然后show出來。

train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)

plt.plot(train_sizes, train_score_mean, 'o-', color="r",
         label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
        label="Validation")

print(train_score_mean.mean())
print(test_score_mean.mean())

plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()

通過圖示可以看到線性回歸的訓(xùn)練過程中亲族。訓(xùn)練和測試的得分趨于一個較為穩(wěn)定的值
0.925


五:決策樹回歸模型

決策樹的最大深度炒考,經(jīng)過測試發(fā)現(xiàn)16 的時候效果最好,然后采用R2標準來預(yù)測得分情況霎迫。

train_sizes, train_score, test_score = learning_curve(
    DecisionTreeRegressor(max_depth=16), data_X, data_y, cv=10, scoring='r2',
    train_sizes=np.linspace(0.0, 1.0, num=30)[1:])

train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)

plt.plot(train_sizes, train_score_mean, 'o-', color="r",
         label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
        label="Validation")

plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()

通過圖示可以看到?jīng)Q策樹回歸模型的測試的得分趨于 0.97 附近斋枢,效果要比簡單的線性回歸模型好很多了。


六:xgboost回歸模型回歸模型

XGBRegressor 經(jīng)測試每棵樹的最大深度在4效果最好知给,然后采用R2標準來預(yù)測得分情況瓤帚。
這里使用xgboost的過程中遇到一個問題:
AttributeError: 'DMatrix' object has no attribute 'handle'
查看前面報錯的信息后確定是:
ValueError: DataFrame.dtypes for data must be int, float or bool.
應(yīng)該是pandas數(shù)據(jù)類型錯誤所所以在使用xgboost訓(xùn)練的時候修改了數(shù)據(jù)
data_X = df[['rooms','halls','size','unit_price']].astype('int')

train_sizes, train_score, test_score = learning_curve(
    XGBRegressor(max_depth=4), data_X, data_y, cv=10, scoring='r2',
    train_sizes=np.linspace(0.0, 1.0, num=30)[1:])

train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)

plt.plot(train_sizes, train_score_mean, 'o-', color="r",
         label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
        label="Validation")

plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()

通過圖示可以看到xgboost回歸模型的測試的得分趨于 0.99 附近,效果要比簡單的線性回歸模型和決策樹回歸模型好很多涩赢。

七:總結(jié)

該項目代碼以及數(shù)據(jù)源全部存放于 github.com/rieuse/Machine_Learning
通過三個回歸模型的建立戈次,本地調(diào)試出最佳參數(shù)(決策樹和xgboost 的max_depth)然后進行預(yù)測,發(fā)現(xiàn)決策樹的效果比一遍的線性回歸模型好一些谒主,但是xgboost的預(yù)測效果更好朝扼。還有很多未知的知識等著學(xué)習(xí),加油霎肯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擎颖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子观游,更是在濱河造成了極大的恐慌搂捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懂缕,死亡現(xiàn)場離奇詭異允跑,居然都是意外死亡,警方通過查閱死者的電腦和手機搪柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門聋丝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人工碾,你說我怎么就攤上這事弱睦。” “怎么了渊额?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵况木,是天一觀的道長垒拢。 經(jīng)常有香客問我,道長火惊,這世上最難降的妖魔是什么求类? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮屹耐,結(jié)果婚禮上尸疆,老公的妹妹穿的比我還像新娘。我一直安慰自己张症,他們只是感情好仓技,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布鸵贬。 她就那樣靜靜地躺著俗他,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阔逼。 梳的紋絲不亂的頭發(fā)上兆衅,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音嗜浮,去河邊找鬼羡亩。 笑死,一個胖子當著我的面吹牛危融,可吹牛的內(nèi)容都是我干的畏铆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吉殃,長吁一口氣:“原來是場噩夢啊……” “哼辞居!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛋勺,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓦灶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抱完,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贼陶,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年巧娱,在試婚紗的時候發(fā)現(xiàn)自己被綠了碉怔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡禁添,死狀恐怖撮胧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情上荡,我是刑警寧澤趴樱,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布馒闷,位于F島的核電站,受9級特大地震影響叁征,放射性物質(zhì)發(fā)生泄漏纳账。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一捺疼、第九天 我趴在偏房一處隱蔽的房頂上張望疏虫。 院中可真熱鬧,春花似錦啤呼、人聲如沸卧秘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翅敌。三九已至,卻和暖如春惕蹄,著一層夾襖步出監(jiān)牢的瞬間蚯涮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工卖陵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遭顶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓泪蔫,卻偏偏與公主長得像棒旗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撩荣,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容