0


采用支持向量回归(SVR)和随机森林回归预测两种机器学习方法对房价进行预测(附完整代码)

   大家好,我是带我去滑雪,每天教你一个小技巧!  

   本文分别采用支持向量回归(SVR)和随机森林回归预测两种机器学习方法对房价进行预测。随机将数据分为训练集和测试集,比例为8:2,数据和代码均在文末。

1、数据展示

  本文利用Python爬取到的房价信息做数据可视化,爬取数据的文章见:

https://blog.csdn.net/qq_45856698/article/details/129367419?spm=1001.2014.3001.5501

   将*x1* (房屋的卧室数量)、*x2* (房屋的客厅数量)、*x3* (房屋面积)、*x4* (房屋装修情况)、*x5* (有无电梯)、*x6* (房屋所在楼层位置)、*x7* (房屋附近有无地铁)、*x8* (关注度)、*x9* (看房次数)作为特征变量,分别预测y(每平方米价格)和*y1* (房屋总价)。

2、支持向量回归(SVR)

2.1 基本原理

   SVR(Support Vector Regression,支持向量回归)在做拟合时采用了支持向量机的思想来对数据进行回归分析。给定训练数据集:

90f8c64f0c4e4c9783372778edf6ceef.png

2.2 支持向量回归(SVR)预测房价

   支持向量机的理论基础(凸二次规划)决定了它最终求得的为全局最优值而不是局部最优值,也保证了它对未知样本的良好泛化能力支持向量机是建立在统计学习理论基础之上的新一代机器学习算法,支持向量机的优势主要体现在解决线性不可分问题,它通过引入核函数,巧妙地解决了在高维空间中的内积运算,从而很好地解决了非线性分类问题。对于核函数的选择,本文分别对RBF核(径向基核)、POLY核(多项式核)、Sigmoid核进行了测试,测试结果发现 RBF核效果最好,故本文选取RBF核作为支持向量机的核函数。

(1)预测y(每平方米价格)

  支持向量回归(SVR)的部分预测结果见表1,模型预测值与真实值的比较见图1,模型的评价指标见表2,代码见附件。

表1 SVR部分预测结果表

真实值

预测值

真实值

预测值

真实值

预测值

43066

42154

33207

30524

32800

31980

25359

28207

53158

34241

25664

28511

41568

46833

34000

27752

25782

35538

26516

32545

46280

42385

39119

31872

36408

46340

23883

31611

50567

46447

59009

43743

23870

31312

30000

40338

47038

47569

47574

29933

30975

32763

51502

63952

74906

71099

28747

32352

40630

35673

58329

43405

30590

37024

38017

48810

56915

37197

42719

49262

28584

52414

24337

37558

30607

30393

58269

37492

41096

27468

28727

34081

22728

25701

25089

29508

53968

50215

500a8d6e3cd247a29677cebe73308f99.png

表2 模型预测效果评价指标

gif.latex?R%5E%7B2%7D

RMSE

MAE

0.7492

14164.27

10469.42

  通过表6-2 可以看到,使用支持向量回归(SVR)预测y(每平方米价格),其预测效果较好,![gif.latex?R%5E%7B2%7D](https://latex.csdn.net/eq?R%5E%7B2%7D)达到了0.7492。 

(2)预测 y1(房屋总价)

   支持向量回归(SVR)的部分预测结果见表3,模型预测值与真实值的比较见图2,模型的评价指标见表4,代码见附件。

表3 SVR部分预测结果表

真实值

预测值

真实值

预测值

真实值

预测值

230

246

193

183

570

486

350

392

235

257

215

251

175

224

230

292

730

799

750

752

325

366

225

256

769

554

235

248

195

219

508

503

280

301

480

445

880

990

440

357

600

530

258

279

458

238

320

324

460

542

510

471

380

450

328

598

250

150

530

354

315

214

280

286

158

23

200

323

580

392

580

375

152

223

730

566

570

486

ca188c3e28ea4ec2a7934f7c764d6c63.png

表4 模型预测效果评价指标

gif.latex?R%5E%7B2%7D

RMSE

MAE

0.4465

172.41

110.89

   通过表4可以看到,使用支持向量回归(SVR)预测 y1 (房屋总价),其预测效果较差,![gif.latex?R%5E%7B2%7D](https://latex.csdn.net/eq?R%5E%7B2%7D) 只达到了0.4465。

3、随机森林回归

3.1 基本原理

    随机森林回归算法(Random Forest Regression)是随机森林(Random Forest)的重要应用分支。随机森林回归模型通过随机抽取样本和特征,建立多棵相互不关联的决策树,通过并行的方式获得预测结果。每棵决策树都能通过抽取的样本和特征得出一个预测结果,通过综合所有树的结果取平均值,得到整个森林的回归预测结果。

3.2 随机森林回归预测房价

(1)预测y(每平方米价格)

    部分预测结果见表5,模型预测值与真实值的比较见图3,模型的评价指标见表6,特征变量重要性程度见图4。

表5 部分预测结果表

真实值

预测值

真实值

预测值

真实值

预测值

43066

41603

44095

48083

48572

49060

41568

44930

47538

40109

33885

33400

47038

49869

39167

43594

34039

33163

51502

53119

32800

38749

69263

47932

40630

38450

25664

33913

60798

50518

38017

35283

25782

32425

29289

47061

36527

38607

39119

30230

29771

44685

33207

35792

50567

46673

37479

33603

53158

36441

30000

38889

38937

43056

34000

34300

30975

42002

17390

33836

46280

38148

28747

38848

25376

38680

23883

34620

30590

38215

40141

33607

23870

30230

42719

47383

28667

27297

871ecc1e7bdd4a8788c0def3a0c54fa7.png

8a7f1e45077e43739bc125641a0e7986.png

表6模型预测效果评价指标

gif.latex?R%5E%7B2%7D

RMSE

MAE

0.792

12502.87

9700.34

   通过图4可以看到,使用随机森林回归预测y(每平方米价格),特征变量的重要程度从高到低依次是x7 (房屋附近有无地铁)、x5 (有无电梯)、x3 (房屋面积)、x8 (关注度)、x4 (房屋装修情况)、x9 (看房次数)、x1 (房屋的卧室数量)、x2 (房屋的客厅数量)。通过表6可以发现,使用随机森林回归预测y(每平方米价格),其预测效果较好,![gif.latex?R%5E%7B2%7D](https://latex.csdn.net/eq?R%5E%7B2%7D) 达到了0.792。

(2)预测 y1(房屋总价)

   随机森林回归部分预测结果见表7,模型预测值与真实值的比较见图5,模型的评价指标见表8。

表7 部分预测结果表

真实值

预测值

真实值

预测值

真实值

预测值

880

888

195

207

950

846

258

246

480

460

125

157

460

463

600

582

160

204

328

551

320

239

285

386

315

190

380

399

500

1371

200

394

530

465

285

324

152

204

158

176

560

882

370

398

580

409

323

269

305

324

270

263

200

227

350

363

110

154

570

331

420

293

193

168

270

323

357

393

215

296

415

368

398

327

155

196

250

589

5459d07650af41ebabc21a0baa390f67.png

a6238f89e78f43c9a7abf23c0f5106ef.png

表8模型预测效果评价指标

gif.latex?R%5E%7B2%7D

RMSE

MAE

0.7596

12502.87

9700.33

    通过图6可以看到,使用随机森林回归预测 *y*1 (房屋总价),特征变量的重要程度从高到低依次是*x*3 (房屋面积)、*x*8 (关注度)、*x*7 (房屋附近有无地铁)、*x*5 (有无电梯)、*x*9 (看房次数)、*x*1 (房屋的卧室数量)、*x*4 (房屋装修情况)、*x*6 (房屋所在楼层位置)、*x*2 (房屋的客厅数量)。通过表6-8可以发现,使用随机森林回归预测*y*1 (房屋总价),其预测效果较好,![gif.latex?R%5E%7B2%7D](https://latex.csdn.net/eq?R%5E%7B2%7D)达到了0.7596。

(1)支持向量回归预测房价

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn import preprocessing

from sklearn.preprocessing import StandardScaler

from sklearn.svm import LinearSVR

from sklearn.svm import SVR

from sklearn.ensemble import RandomForestRegressor

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

from sklearn.metrics import mean_absolute_error

from sklearn.metrics import r2_score

get_ipython().run_line_magic('matplotlib', 'inline')

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

from IPython.core.interactiveshell import InteractiveShell

InteractiveShell.ast_node_interactivity = 'all'

import warnings

warnings.filterwarnings("ignore")

# 数据集划分与数据标准化

data = pd.read_excel(r'E:\工作\硕士\学习\统计软件python\期末作业\清洗后数据.xlsx')

data

X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state = 1234)

将数据随机划分成80%训练集和20%测试集

train, test = train_test_split(data, test_size=0.2, random_state = 1234)

train = train.reset_index(drop = True)

test = test.reset_index(drop = True)

train

test

X_train, X_test = train.iloc[:,:-2], test.iloc[:,:-2]

Y_train, Y_test = train.iloc[:,-2], test.iloc[:,-2]

Y1_train, Y1_test = train.iloc[:,-1], test.iloc[:,-1]

数据标准化(主要是为了构建支持向量机做准备)

scaler = StandardScaler()

x_scaler = scaler.fit(X_train)

x_train = x_scaler.fit_transform(X_train)

x_test = x_scaler.fit_transform(X_test)

y_scaler = scaler.fit(Y_train.values.reshape(-1,1))

y_train = y_scaler.fit_transform(Y_train.values.reshape(-1,1))

y_test = y_scaler.fit_transform(Y_test.values.reshape(-1,1))

y1_scaler = scaler.fit(Y1_train.values.reshape(-1,1))

y1_train = y1_scaler.fit_transform(Y1_train.values.reshape(-1,1))

y1_test = y1_scaler.fit_transform(Y1_test.values.reshape(-1,1))

## 支持向量机

### 对y

#### RBF_SVR

rbf_svr = SVR(kernel = "rbf", C = 100, epsilon = 0.1)

rbf_svr.fit(x_train, y_train)

预测

rbf_svr_pred = rbf_svr.predict(x_test)

y_scaler = scaler.fit(Y_train.values.reshape(-1,1))

y_scaler.fit_transform(Y_train.values.reshape(-1,1))

rbf_svr_pred = y_scaler.inverse_transform(rbf_svr_pred.reshape(-1,1))

模型评价

rbf_svr_rmse = np.sqrt(mean_squared_error(Y_test,rbf_svr_pred)) #RMSE

rbf_svr_mae = mean_absolute_error(Y_test,rbf_svr_pred) #MAE

rbf_svr_r2 = r2_score(Y_test, rbf_svr_pred) # R2

print("R^2 of RBF_SVR: ", rbf_svr_r2)

print("The RMSE of RBF_SVR: ", rbf_svr_rmse)

print("The MAE of RBF_SVR: ", rbf_svr_mae)

输出预测值和真实值矩阵

rbf_svr_pred_true = pd.concat([pd.DataFrame(rbf_svr_pred), pd.DataFrame(Y_test)], axis = 1)

rbf_svr_pred_true.columns = ['预测值', '真实值']

rbf_svr_pred_true.to_excel(r' E:\工作\硕士\学习\统计软件python\期末作业\径向基核支持向量机预测y.xlsx', index = False)

比较图

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(rbf_svr_pred, color = 'b', label = '预测值')

plt.plot(Y_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

#### POLY_SVR

poly_svr = SVR(kernel="poly", degree=2, C=100, epsilon=0.1, gamma="scale")

poly_svr.fit(x_train, y_train)

预测y

poly_svr_pred = poly_svr.predict(x_test)

y_scaler = scaler.fit(Y_train.values.reshape(-1,1))

y_scaler.fit_transform(Y_train.values.reshape(-1,1))

poly_svr_pred = y_scaler.inverse_transform(poly_svr_pred.reshape(-1,1))

模型评价

poly_svr_rmse = np.sqrt(mean_squared_error(Y_test,poly_svr_pred)) #RMSE

poly_svr_mae = mean_absolute_error(Y_test,poly_svr_pred) #MAE

poly_svr_r2 = r2_score(Y_test, poly_svr_pred) # R2

print("R^2 of POLY_SVR: ", poly_svr_r2)

print("The RMSE of POLY_SVR: ", poly_svr_rmse)

print("The MAE of PLOY_SVR: ", poly_svr_mae)

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(poly_svr_pred, color = 'b', label = '预测值')

plt.plot(Y_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

### 对y1

#### RBF_SVR

rbf1_svr = SVR(kernel = "rbf", C = 100, epsilon = 0.1)

rbf1_svr.fit(x_train, y1_train)

预测y1

rbf1_svr_pred = rbf1_svr.predict(x_test)

y1_scaler = scaler.fit(Y1_train.values.reshape(-1,1))

y1_train = y1_scaler.fit_transform(Y1_train.values.reshape(-1,1))

rbf1_svr_pred = y1_scaler.inverse_transform(rbf1_svr_pred.reshape(-1,1))

模型评价

rbf1_svr_rmse = np.sqrt(mean_squared_error(Y1_test,rbf1_svr_pred)) #RMSE

rbf1_svr_mae = mean_absolute_error(Y1_test,rbf1_svr_pred) #MAE

rbf1_svr_r2 = r2_score(Y1_test, rbf1_svr_pred) # R2

print("R^2 of RBF_SVR: ", rbf1_svr_r2)

print("The RMSE of RBF_SVR: ", rbf1_svr_rmse)

print("The MAE of RBF_SVR: ", rbf1_svr_mae)

输出预测值和真实值矩阵

rbf1_svr_pred_true = pd.concat([pd.DataFrame(rbf1_svr_pred), pd.DataFrame(Y1_test)], axis = 1)

rbf1_svr_pred_true.columns = ['预测值', '真实值']

rbf1_svr_pred_true.to_excel(r' E:\工作\硕士\学习\统计软件python\期末作业\径向基核支持向量机预测y1.xlsx', index = False)

画图

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(rbf1_svr_pred, color = 'b', label = '预测值')

plt.plot(Y1_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

#### POLY_SVR

poly1_svr = SVR(kernel="poly", degree=3, C=100, epsilon=0.1, gamma="scale")

poly1_svr.fit(x_train, y1_train)

预测

poly1_svr_pred = poly1_svr.predict(x_test)

y1_scaler = scaler.fit(Y1_train.values.reshape(-1,1))

y1_train = y1_scaler.fit_transform(Y1_train.values.reshape(-1,1))

poly1_svr_pred = y1_scaler.inverse_transform(poly1_svr_pred.reshape(-1,1))

模型评价

poly1_svr_rmse = np.sqrt(mean_squared_error(Y1_test,poly1_svr_pred)) #RMSE

poly1_svr_mae = mean_absolute_error(Y1_test,poly1_svr_pred) #MAE

poly1_svr_r2 = r2_score(Y1_test, poly1_svr_pred) # R2

print("R^2 of POLY_SVR: ", poly1_svr_r2)

print("The RMSE of POLY_SVR: ", poly1_svr_rmse)

print("The MAE of POLY_SVR: ", poly1_svr_mae)

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(poly1_svr_pred, color = 'b', label = '预测值')

plt.plot(Y1_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

(2)随机森林回归预测房价

模型建立与预测

随机森林

对y

rf = RandomForestRegressor(n_estimators = 1000, max_depth = 6, random_state = 1234)

rf.fit(X_train, Y_train)

rf_pred = rf.predict(X_test)

模型评价

rf_rmse = np.sqrt(mean_squared_error(Y_test,rf_pred)) #RMSE

rf_mae = mean_absolute_error(Y_test,rf_pred) #MAE

rf_r2 = r2_score(Y_test, rf_pred) # R2

print("R^2 of RandomForest: ", rf_r2)

print("The RMSE of RandomForest: ", rf_rmse)

print("The MAE of RandomForest: ", rf_mae)

输出预测值和真实值矩阵

rf_pred_true = pd.concat([pd.DataFrame(rf_pred), pd.DataFrame(Y_test)], axis = 1)

rf_pred_true.columns = ['预测值', '真实值']

rf_pred_true.to_excel(r'E:\工作\硕士\学习\统计软件python\期末作业\ \随机森林预测y.xlsx ', index = False)

比较图

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(rf_pred, color = 'b', label = '预测值')

plt.plot(Y_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

dic = dict(zip(X_train.columns, rf.feature_importances_))

dic = dict(sorted(dic.items(),key=lambda x:x[1]))

rf_fea_name = [key for key,value in dic.items() ]

rf_fea = [value for key,value in dic.items() ]

plt.figure(figsize = (10,6), dpi = 200)

plt.barh(rf_fea_name, rf_fea, height = 0.7)

plt.xlabel('Importance score', fontsize = 13)

plt.ylabel('Features', fontsize = 13)

### 对y1

rf1 = RandomForestRegressor(n_estimators = 1000, max_depth = 6, random_state = 1234)

rf1.fit(X_train, Y1_train)

rf1_pred = rf1.predict(X_test)

模型评价

rf1_rmse = np.sqrt(mean_squared_error(Y1_test,rf1_pred)) #RMSE

rf1_mae = mean_absolute_error(Y1_test,rf1_pred) #MAE

rf1_r2 = r2_score(Y1_test, rf1_pred) # R2

print("R^2 of RandomForest: ", rf1_r2)

print("The RMSE of RandomForest: ", rf1_rmse)

print("The MAE of RandomForest: ", rf1_mae)

输出预测值和真实值矩阵

rf1_pred_true = pd.concat([pd.DataFrame(rf1_pred), pd.DataFrame(Y1_test)], axis = 1)

rf1_pred_true.columns = ['预测值', '真实值']

rf1_pred_true.to_excel(r' E:\工作\硕士\学习\统计软件python\期末作业\随机森林预测y1', index = False)

比较图

plt.subplots(figsize=(10,5), dpi = 200)

plt.plot(rf1_pred, color = 'b', label = '预测值')

plt.plot(Y1_test, color = 'r', label = '真实值')

plt.legend(loc = 0)

dic = dict(zip(X_train.columns, rf1.feature_importances_))

dic = dict(sorted(dic.items(),key=lambda x:x[1]))

rf_fea_name = [key for key,value in dic.items() ]

rf_fea = [value for key,value in dic.items() ]

plt.figure(figsize = (10,6), dpi = 200)

plt.barh(rf_fea_name, rf_fea, height = 0.7)

plt.xlabel('Importance score', fontsize = 13)

plt.ylabel('Features', fontsize = 13)

需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:https://pan.baidu.com/s/16GeXC9_f6KI4lS2wQ-Z1VQ?pwd=2138
提取码:2138


更多优质内容持续发布中,请移步主页

点赞+关注,下次不迷路!


本文转载自: https://blog.csdn.net/qq_45856698/article/details/129389557
版权归原作者 带我去滑雪 所有, 如有侵权,请联系我们删除。

“采用支持向量回归(SVR)和随机森林回归预测两种机器学习方法对房价进行预测(附完整代码)”的评论:

还没有评论