预测房价:回归问题——R语言& G8 q# Z2 \1 c1 l
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
8 y7 v) B- Z: S4 o2 N' M- `7 p! t# r
问题描述
3 F: T' s) ?" Z4 d1 \我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
8 Y- x" }# B0 U' G0 _. A, O# C本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
; y* a0 C ? R* D数据特征:
8 |) F! r- W4 h9 Z4 y* m8 I人均犯罪率。
8 h7 U& f) j6 L% T6 w1 U8 u2 d占地面积超过25,000平方英尺的住宅用地比例。2 I5 _ l7 X0 L. S/ }
每个城镇非零售业务的比例。/ K: ?" e B9 u
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。8 Y& o# L0 c$ t2 |3 W N+ r
一氧化氮浓度(每千万份)。1 c) ?% L% ^/ V9 n& ~( Q
每栋住宅的平均房间数。* v/ r2 G2 z# K7 K9 P
1940年以前建造的自住单位比例。% N" w, i' L- M- ?- Z
到波士顿五个就业中心的加权距离。
3 T" y8 U* P* E6 u) K) r径向高速公路的可达性指数。1 K9 }1 y( j' R) y9 c5 |% M
每10,000美元的全额物业税率。
2 r& P/ O/ h' A' e3 u/ A城镇的学生与教师比例。
; W' g' ^' S; c; g7 ]7 y) O0 Z# {1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。) T k6 I" N) r+ v2 M ]: L
人口比例较低的百分比。
$ U! z' m! ~& D& S: } m5 y1. 加载波士顿房价数据: l/ v. n3 l5 z, H9 G3 j
library(keras)0 d9 _0 {6 \6 [. T3 x) ^0 I
# \. n6 ?' Z1 D& e7 gboston_housing <- dataset_boston_housing()/ ]: k, ]: g# C
+ n2 s1 D! z+ r6 x+ l" H6 g6 ?1 ac(train_data, train_labels) %<-% boston_housing$train
' H3 D& ~4 v0 ~' t: mc(test_data, test_labels) %<-% boston_housing$test+ |- y9 B" N- j7 s
! ^' J- C7 U. ?7 f7 L8 a每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
# p. `; o# c# n& q: {( v& Y6 \# Test data is *not* used when calculating the mean and std.( H+ `9 }1 Z& w' F0 Q
: E! y G* V6 I z# Normalize training data
8 F) ?7 j& q" h+ J% U# C& Itrain_data <- scale(train_data) # Y/ _1 a3 W6 D5 n5 v: ~# }# x
. J1 T, ^0 H5 L F# Use means and standard deviations from training set to normalize test set0 R( ~% o- H4 Y8 l! w$ {3 Z1 j; Z
col_means_train <- attr(train_data, "scaled:center") 5 m) Z/ o0 Y& L6 ]9 y
col_stddevs_train <- attr(train_data, "scaled:scale")+ p- {; s( v2 b, x1 u
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
4 E" E& @8 d" C: ~: d, P! }9 R
! i$ N! v& V( u* L3 f3. 构建网络创建模型 5 Z2 h& c4 b, l$ u) @0 i2 E# f h$ \
build_model <- function() {/ N+ [3 ~9 P/ y. O0 v$ ^9 ~
|/ ^& B! Y% v
model <- keras_model_sequential() %>%
, d' M1 F: Z9 w e8 l layer_dense(units = 64, activation = "relu",
, `* G: e* j0 R6 c7 }/ Q% b' T, s- B input_shape = dim(train_data)[2]) %>%
! L" K5 t7 o( ?' m8 y* } layer_dense(units = 64, activation = "relu") %>%; Z; ^) t1 Z4 L" _* V
layer_dense(units = 1)! b+ a4 e+ c2 g1 s3 V
9 H8 K/ M- l2 {7 u% p" }5 F model %>% compile(9 L5 ^: G) W7 b0 z
loss = "mse",
& X! ]# K0 c6 i; D optimizer = optimizer_rmsprop(),
M @3 { d; M' M metrics = list("mean_absolute_error")
6 m# c! }) n( Q3 ~* z )& z; g! ^% L+ Y# F5 n
* n v" z& |$ c# C9 V/ n' ] model$ t% U [9 z, |/ h3 f3 V
}
! a; L; o9 {, N, w$ k! |. Y" {. E
, c8 I0 s4 L0 n; Q* O7 K) @6 bmodel <- build_model()
\# g! `3 m- m) F6 K# D3 R! umodel %>% summary(). a1 s6 ] G4 F; Z0 j+ ?% e
8 n: ]. B: B4 \网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型! f1 \4 `- o9 _( K9 L, _
# Display training progress by printing a single dot for each completed epoch.
( k& {6 r! C) S4 ^% C d$ X0 Bprint_dot_callback <- callback_lambda(2 ~$ N# b9 L( v! ]
on_epoch_end = function(epoch, logs) {; R- T4 L% p8 i, C3 Y8 s4 ]
if (epoch %% 80 == 0) cat("\n"); E, U! h* G& G. h, U3 c y
cat(".")0 c- E3 ]8 R* |. Y& m8 P8 [: d! k
}
' S7 P3 g- u. w4 Z+ D" p)
' J2 R* j6 B ^: r0 T% E/ u+ `" R0 G
epochs <- 500
7 B$ Q% a4 v$ U. x' ]1 Z8 t0 r' N# |2 r; S( T4 v' O
# Fit the model and store training stats7 u( y: {9 H( k1 T" U+ E
history <- model %>% fit(0 T" g- W. r) g6 d, r( J3 Z
train_data,4 e7 t5 h' ^+ h8 ?' b; B' f
train_labels,
) a( A# R$ G9 g+ l epochs = epochs,
& a3 g! p: }9 V% Z* E8 t6 ? validation_split = 0.2,
% U$ O. v& M5 x verbose = 0,
5 Q: k9 W* m7 }, T, x1 F callbacks = list(print_dot_callback)
" ~- [9 @: Z2 N& C): o. j8 T. U. z5 g n/ r; X
- e( t2 u5 i( }; a2 g klibrary(ggplot2)! A, U+ J* D+ d7 |( S9 z
E: x6 A8 n% y d
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
- _. c( B4 _+ n. v i- S' b, ~ coord_cartesian(ylim = c(0, 5))3 H+ q. ~! F* i+ r- h! ?
1 s1 y+ B$ M X% f; W2 k. f
: ^/ k" ]9 J9 r5 s2 s# b: `! @
, a( @8 C; e2 L1 N3 \" Y( M9 S1 O小结
6 R' ^: y& E7 n/ R7 }4 l/ k1)回归常用的损失函数是均方误差(MSE)。- M3 U" e& r5 A3 I3 @2 Q
2)常见的回归指标是平均绝对误差(MAE)。5 S8 X9 f2 }$ `
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。5 I2 T; H( r) q: o
4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
0 x9 E- A+ M4 J4 q# u( x8 F9 ?4 D$ P) S+ O$ D# A
3 C" u- t( Y' M5 \! d+ }3 S, y7 x& A% I0 w; w. I: l
|