自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何用 Python 預(yù)測房價走勢?

開發(fā) 后端
買房應(yīng)該是大多數(shù)都會要面臨的一個選擇,當(dāng)前經(jīng)濟(jì)和政策背景下,未來房價會漲還是跌?這是很多人都關(guān)心的一個話題。今天分享的這篇文章,以波士頓的房地產(chǎn)市場為例,根據(jù)低收入人群比例、老師學(xué)生數(shù)量等特征,利用 Python 進(jìn)行了預(yù)測,給大家做一個參考。

 該分享源于Udacity機(jī)器學(xué)習(xí)進(jìn)階中的一個mini作業(yè)項目,用于入門非常合適,刨除了繁瑣的部分,保留了最關(guān)鍵、基本的步驟,能夠?qū)C(jī)器學(xué)習(xí)基本流程有一個最清晰的認(rèn)識。

項目描述

利用馬薩諸塞州波士頓郊區(qū)的房屋信息數(shù)據(jù)訓(xùn)練和測試一個模型,并對模型的性能和預(yù)測能力進(jìn)行測試;

項目分析

數(shù)據(jù)集字段解釋:

  1. RM: 住宅平均房間數(shù)量;
  2. LSTAT: 區(qū)域中被認(rèn)為是低收入階層的比率;
  3. PTRATIO: 鎮(zhèn)上學(xué)生與教師數(shù)量比例;
  4. MEDV: 房屋的中值價格(目標(biāo)特征,即我們要預(yù)測的值);

其實現(xiàn)在回過頭來看,前三個特征應(yīng)該都是挖掘后的組合特征,比如RM,通常在原始數(shù)據(jù)中會分為多個特征:一樓房間、二樓房間、廚房、臥室個數(shù)、地下室房間等等,這里應(yīng)該是為了教學(xué)簡單化了;

MEDV為我們要預(yù)測的值,屬于回歸問題,另外數(shù)據(jù)集不大(不到500個數(shù)據(jù)點),小數(shù)據(jù)集上的回歸問題,現(xiàn)在的我初步考慮會用SVM,稍后讓我們看看當(dāng)時的選擇;

Show Time

Step 1 導(dǎo)入數(shù)據(jù)

注意點:

  1. 如果數(shù)據(jù)在多個csv中(比如很多銷售項目中,銷售數(shù)據(jù)和店鋪數(shù)據(jù)是分開兩個csv的,類似數(shù)據(jù)庫的兩張表),這里一般要連接起來;
  2. 訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)連接起來,這是為了后續(xù)的數(shù)據(jù)處理的一致,否則訓(xùn)練模型時會有問題(比如用訓(xùn)練數(shù)據(jù)訓(xùn)練的模型,預(yù)測測試數(shù)據(jù)時報錯維度不一致);
  3. 觀察下數(shù)據(jù)量,數(shù)據(jù)量對于后續(xù)選擇算法、可視化方法等有比較大的影響,所以一般會看一下;
  4. pandas內(nèi)存優(yōu)化,這一點項目中目前沒有,但是我最近的項目有用到,簡單說一下,通過對特征字段的數(shù)據(jù)類型向下轉(zhuǎn)換(比如int64轉(zhuǎn)為int8)降低對內(nèi)存的使用,這里很重要,數(shù)據(jù)量大時很容易撐爆個人電腦的內(nèi)存存儲;

上代碼:

 

  1. # 載入波士頓房屋的數(shù)據(jù)集 
  2.  
  3. data = pd.read_csv('housing.csv'
  4.  
  5. prices = data['MEDV'
  6.  
  7. features = data.drop('MEDV', axis =1) 
  8.  
  9.  
  10. # 完成 
  11.  
  12.  
  13. print"Boston housing dataset has {} data points with {} variables each.".format(*data.shape) 

Step 2 分析數(shù)據(jù)

加載數(shù)據(jù)后,不要直接就急匆匆的上各種處理手段,加各種模型,先慢一點,對數(shù)據(jù)進(jìn)行一個初步的了解,了解其各個特征的統(tǒng)計值、分布情況、與目標(biāo)特征的關(guān)系,最好進(jìn)行可視化,這樣會看到很多意料之外的東西;

基礎(chǔ)統(tǒng)計運(yùn)算

統(tǒng)計運(yùn)算用于了解某個特征的整體取值情況,它的最大最小值,平均值中位數(shù),百分位數(shù)等等,這些都是最簡單的對一個字段進(jìn)行了解的手段;

上代碼:

 

  1. #目標(biāo):計算價值的最小值 
  2.  
  3. minimum_price = np.min(prices)# prices.min 
  4.  
  5.  
  6. #目標(biāo):計算價值的最大值 
  7.  
  8. maximum_price = np.max(prices)# prices.max 
  9.  
  10.  
  11. #目標(biāo):計算價值的平均值 
  12.  
  13. mean_price = np.mean(prices)# prices.mean 
  14.  
  15.  
  16. #目標(biāo):計算價值的中值 
  17.  
  18. median_price = np.median(prices)# prices.median 
  19.  
  20.  
  21. #目標(biāo):計算價值的標(biāo)準(zhǔn)差 
  22.  
  23. std_price = np.std(prices)# prices.std 

特征觀察

這里主要考慮各個特征與目標(biāo)之間的關(guān)系,比如是正相關(guān)還是負(fù)相關(guān),通常都是通過對業(yè)務(wù)的了解而來的,這里就延伸出一個點,機(jī)器學(xué)習(xí)項目通常來說,對業(yè)務(wù)越了解,越容易得到好的效果,因為所謂的特征工程其實就是理解業(yè)務(wù)、深挖業(yè)務(wù)的過程;

比如這個問題中的三個特征:

  • RM:房間個數(shù)明顯應(yīng)該是與房價正相關(guān)的;
  • LSTAT:低收入比例一定程度上表示著這個社區(qū)的級別,因此應(yīng)該是負(fù)相關(guān);
  • PTRATIO:學(xué)生/教師比例越高,說明教育資源越緊缺,也應(yīng)該是負(fù)相關(guān);

上述這三個點,同樣可以通過可視化的方式來驗證,事實上也應(yīng)該去驗證而不是只靠主觀猜想,有些情況下,主觀感覺與客觀事實是完全相反的,這里要注意;

Step 3 數(shù)據(jù)劃分

為了驗證模型的好壞,通常的做法是進(jìn)行cv,即交叉驗證,基本思路是將數(shù)據(jù)平均劃分N塊,取其中N-1塊訓(xùn)練,并對另外1塊做預(yù)測,并比對預(yù)測結(jié)果與實際結(jié)果,這個過程反復(fù)N次直到每一塊都作為驗證數(shù)據(jù)使用過;

上代碼:

 

  1. # 提示:導(dǎo)入train_test_split 
  2.  
  3. fromsklearn.model_selectionimporttrain_test_split 
  4.  
  5.  
  6. X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=RANDOM_STATE) 
  7.  
  8. printX_train.shape 
  9.  
  10. printX_test.shape 
  11.  
  12. printy_train.shape 
  13.  
  14. printy_test.shape 

Step 4 定義評價函數(shù)

這里主要是根據(jù)問題來定義,比如分類問題用的最多的是準(zhǔn)確率(精確率、召回率也有使用,具體看業(yè)務(wù)場景中更重視什么),回歸問題用RMSE(均方誤差)等等,實際項目中根據(jù)業(yè)務(wù)特點經(jīng)常會有需要去自定義評價函數(shù)的時候,這里就比較靈活;

Step 5 模型調(diào)優(yōu)

通過GridSearch對模型參數(shù)進(jìn)行網(wǎng)格組合搜索最優(yōu),注意這里要考慮數(shù)據(jù)量以及組合后的可能個數(shù),避免運(yùn)行時間過長哈。

上代碼:

 

  1. fromsklearn.model_selectionimportKFold,GridSearchCV 
  2.  
  3. fromsklearn.treeimportDecisionTreeRegressor 
  4.  
  5. fromsklearn.metricsimportmake_scorer 
  6.  
  7.  
  8.  
  9. deffit_model(X, y): 
  10.  
  11. """ 基于輸入數(shù)據(jù) [X,y],利于網(wǎng)格搜索找到最優(yōu)的決策樹模型""" 
  12.  
  13.  
  14. cross_validator = KFold 
  15.  
  16.  
  17. regressor = DecisionTreeRegressor 
  18.  
  19.  
  20. params = {'max_depth':[1,2,3,4,5,6,7,8,9,10]} 
  21.  
  22.  
  23. scoring_fnc = make_scorer(performance_metric) 
  24.  
  25.  
  26. grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cross_validator) 
  27.  
  28.  
  29. # 基于輸入數(shù)據(jù) [X,y],進(jìn)行網(wǎng)格搜索 
  30.  
  31. grid = grid.fit(X, y) 
  32.  
  33.  
  34. # 返回網(wǎng)格搜索后的最優(yōu)模型 
  35.  
  36. returngrid.best_estimator_ 

可以看到當(dāng)時項目中選擇的是決策樹模型,現(xiàn)在看,樹模型在這種小數(shù)據(jù)集上其實是比較容易過擬合的,因此可以考慮用SVM代替,你也可以試試哈,我估計是SVM效果比較好;

學(xué)習(xí)曲線

通過繪制分析學(xué)習(xí)曲線,可以對模型當(dāng)前狀態(tài)有一個基本了解,如下圖:

 

如何用 Python 預(yù)測房價走勢?

 

可以看到,超參數(shù)max_depth為1和3時,明顯訓(xùn)練分?jǐn)?shù)過低,這說明此時模型有欠擬合的情況,而當(dāng)max_depth為6和10時,明顯訓(xùn)練分?jǐn)?shù)和驗證分析差距過大,說明出現(xiàn)了過擬合,因此我們初步可以猜測,優(yōu)質(zhì)參數(shù)在3和6之間,即4,5中的一個,其他參數(shù)一樣可以通過學(xué)習(xí)曲線來進(jìn)行可視化分析,判斷是欠擬合還是過擬合,再分別進(jìn)行針對處理;

小結(jié)

通過以上的幾步,可以非常簡單、清晰的看到一個機(jī)器學(xué)習(xí)項目的全流程,其實再復(fù)雜的流程也是這些簡單步驟的一些擴(kuò)展,而更難的往往是對業(yè)務(wù)的理解,沒有足夠的理解很難得到好的結(jié)果,體現(xiàn)出來就是特征工程部分做的好壞,這里就需要各位小伙伴們奮發(fā)圖強(qiáng)了,路漫漫啊。

項目鏈接

  • 通篇瀏覽可以通過nbviewer來看;
  • 項目源文件、數(shù)據(jù)集文件可以通過GitHub波士頓項目獲取,歡迎Follow、Fork、Star;

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2020-11-17 17:28:29

機(jī)器學(xué)習(xí)技術(shù)人工智能

2011-04-22 15:21:13

宏碁H7531D宏碁投影機(jī)

2021-08-23 11:15:20

Python機(jī)器學(xué)習(xí)bilibili

2021-08-21 14:30:58

機(jī)器學(xué)習(xí)bilibili股價

2021-11-12 15:41:42

LSTM神經(jīng)網(wǎng)絡(luò)人工智能

2022-03-30 15:11:26

Python房價工具

2020-07-14 08:34:07

AI機(jī)器學(xué)習(xí)預(yù)測股價

2018-03-20 15:33:05

深度學(xué)習(xí)加密貨幣

2017-03-24 08:58:23

機(jī)器學(xué)習(xí)算法預(yù)測

2018-03-27 18:12:12

PythonHTML

2020-07-10 09:49:53

數(shù)據(jù)清理數(shù)據(jù)分析查找異常

2023-02-08 07:09:40

PythonChatGPT語言模型

2020-01-19 20:04:14

智慧城市預(yù)測分析物聯(lián)網(wǎng)

2017-06-19 15:12:30

Uber神經(jīng)網(wǎng)絡(luò)事件預(yù)測

2018-12-17 06:21:39

2018-05-17 10:05:24

運(yùn)行iPadPython

2020-05-09 10:38:31

Python透視表數(shù)據(jù)

2010-03-19 16:01:10

千兆交換機(jī)

2020-12-10 10:46:23

PythonExcel圖片

2020-11-06 17:42:02

Python開發(fā)工具
點贊
收藏

51CTO技術(shù)棧公眾號