数学建模社区-数学中国

标题: 预测房价:回归问题——R语言 [打印本页]

作者: 1047521767    时间: 2021-10-29 10:50
标题: 预测房价:回归问题——R语言
预测房价:回归问题——R语言
5 v* T5 W7 |; J' a在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
) V+ c, j: ]& `% b) c! K& b* T0 ~2 S6 h( j% _
问题描述+ M# I5 i; E' Q5 Q
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。* ~3 _, L7 Q" x; _1 f9 Z# E
本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
) _/ K: S2 q; {5 k. A- [* S数据特征:
5 w$ f% h* k1 G0 ~5 F8 U人均犯罪率。1 F& K) E" D* g7 q* k0 ~
占地面积超过25,000平方英尺的住宅用地比例。" I4 }6 w' _) d$ X, ]
每个城镇非零售业务的比例。
8 l% ~" V( l/ u7 x# S1 fCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。
7 k( y; W+ L# y6 p4 w一氧化氮浓度(每千万份)。$ v9 v# d5 T4 ]% m. K
每栋住宅的平均房间数。
' v/ r1 n* |* u* o8 v1940年以前建造的自住单位比例。3 Y2 O- ^5 q) ?, d4 S. O
到波士顿五个就业中心的加权距离。
# s! ]+ c0 _  |# d% i径向高速公路的可达性指数。: j2 D  Q. I' Q
每10,000美元的全额物业税率。) r, d8 ^$ g: k4 B
城镇的学生与教师比例。
* e/ ~( G% f( q: Y* b/ S1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
* f) m  A) @& {人口比例较低的百分比。
2 h- Z' b/ V) p7 z" Z! r5 n8 w1. 加载波士顿房价数据
( E# B7 r& f' w6 @- glibrary(keras)
8 x/ T0 I( D# w2 n' i& X$ _: f3 r% q& ~6 K- i. y- L
boston_housing <- dataset_boston_housing()  j8 `  Q  _. _

6 M/ z3 u/ E8 f. V* j: _% Uc(train_data, train_labels) %<-% boston_housing$train" U& ~; ~8 R1 n; \8 Y! f, H
c(test_data, test_labels) %<-% boston_housing$test
  E% q( V4 I2 Z' j9 i, j; B( e& }9 m

每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。

2. 准备数据

数据标准化

将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。


  ?8 W1 c# r% h% a# Test data is *not* used when calculating the mean and std.% A+ n7 D( x8 e) ]/ `, ?& c

. d; U/ T, T, P3 v3 h# Normalize training data: ?$ |/ r: U5 n3 O- w6 O) C, g
train_data <- scale(train_data)
' i4 F# w+ z+ P* |
1 `6 Q' g; ^; {' `) j% v# Use means and standard deviations from training set to normalize test set- h& F$ t% O, h9 z: f  c8 {
col_means_train <- attr(train_data, "scaled:center")
0 m) O* h% z% p* I$ d; A, @  Pcol_stddevs_train <- attr(train_data, "scaled:scale")5 ~9 s- Y9 w* a" Z, M
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)* s6 k/ \$ p+ O8 c5 P. B% N

8 q" I) q/ s, ]5 c. b' X3. 构建网络

创建模型

" g4 R3 C. M3 V/ v' r+ s/ r9 z0 }
build_model <- function() {
! S6 s$ c! v) t" l/ U' t
& f3 p% |; o  _% _8 Q7 O0 M, k- |, ]  model <- keras_model_sequential() %>%. F; ?$ m0 B8 M3 g2 g
    layer_dense(units = 64, activation = "relu",
  P4 k9 Z5 W+ {+ T+ l+ P                input_shape = dim(train_data)[2]) %>%
$ |2 i+ {3 \' i, B& e    layer_dense(units = 64, activation = "relu") %>%
$ B- L5 B: I& O    layer_dense(units = 1)
; a& N3 G# ?8 S- L( H" U' M1 g! T% B. U0 ^; y2 e: X
  model %>% compile(& L4 w: \0 Y5 u0 m& A
    loss = "mse",
/ c+ T" J/ S& p2 G% Y    optimizer = optimizer_rmsprop(),7 H7 A3 O* Y  @# v* _5 E, m9 Q$ R
    metrics = list("mean_absolute_error")8 |' d% K6 n4 J: l& o) R* T
  )5 K: l% @- P( K( A6 h/ y7 U' M

, X1 @1 g9 b6 w; I" E, d4 Q+ I  model
; r, C( R4 s  O- {}8 A& a& \- d1 V) Q  ^
5 @( Q+ o; q. p. t
model <- build_model()
5 T* M. R$ h: u# Xmodel %>% summary()/ ]. p$ v) X6 z- F0 B! y

( {5 t( o& M+ A' G0 v  S

网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。

4. 训练模型
* Z9 f! X& Z. t9 `  u: m4 A# Display training progress by printing a single dot for each completed epoch.7 g: ^/ C7 B$ h$ B5 M+ |, V
print_dot_callback <- callback_lambda(1 i4 c3 M9 l4 q2 X
  on_epoch_end = function(epoch, logs) {2 Z) N4 _4 ^3 _1 J  c! ^$ v2 M* N
    if (epoch %% 80 == 0) cat("\n")
5 Z1 p- O' b/ R% x5 q8 x" C    cat(".")2 f1 V4 p0 Y$ \/ g6 i1 D1 x
  }
+ |6 f; _" b* A)   
" c: T! }7 ^/ K$ T8 m, K
6 v7 }1 Q. x3 G, Depochs <- 500
0 [' v7 N7 l0 ~3 L) J4 c
! B& s. e9 L  X3 }5 G# Fit the model and store training stats. H+ z# L5 ?5 q+ C0 c0 p7 A* x9 X
history <- model %>% fit(
! X$ C( u+ O* [3 J  train_data,
) Y8 f. J- r/ F+ R" o- Q; P  train_labels,8 B: U6 z# g. p- e
  epochs = epochs,
8 [+ E# g' E7 T7 R  validation_split = 0.2,
/ D$ a- j7 y  ]9 C# k  verbose = 0,
) C# I* c7 }+ z  callbacks = list(print_dot_callback)  w8 d- {' u$ p+ g. N
)
" h5 n: O6 G8 o" y
* ^. l/ m( j5 a# P# Z% ?library(ggplot2)# I, H7 x- B: u" \0 x

/ p# @+ N7 g. X1 U! x, fplot(history, metrics = "mean_absolute_error", smooth = FALSE) +
9 r# l# `& h) ?% r  coord_cartesian(ylim = c(0, 5))2 D8 _  H3 R9 [; |9 @& e* q# c4 i
. J1 K9 W) r0 @5 t! z/ m

- O  T! N+ w' ?+ ^! c+ t: o! B9 s+ S, G+ X
小结
5 X* c2 G4 a+ Q9 g* f+ T* d1)回归常用的损失函数是均方误差(MSE)。
% B  N7 C, @4 j$ L8 }2)常见的回归指标是平均绝对误差(MAE)。
3 V/ B7 }+ {8 f) n4 M! P3 @% h5 f3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
5 W  _6 R' i( w( K4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
" D2 P3 I0 c. z& ]0 }, W0 @7 T7 ]. I' g7 a% v: ?$ U

1 L: n+ V# L  C) f0 ~& M. m. R* C





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5