预测房价:回归问题——R语言) [' U9 `! o1 h/ q
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
% L7 Z& r3 }4 r+ G; Q/ s- z/ p7 `, T9 {+ V
问题描述
$ o4 [ u3 q. i1 n8 k8 l我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
) Y. s5 |* \- e3 ]' n本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
2 o1 c5 s9 Y( O* y" _数据特征:
, H8 n N! s. [ F2 p6 P人均犯罪率。
) e. f" H/ l: B3 k$ x占地面积超过25,000平方英尺的住宅用地比例。
) N1 N. p+ `1 Q& B每个城镇非零售业务的比例。" w; b- x! {+ v/ W9 H3 ?' l# T
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
9 Z; j' z Q% l6 v9 n5 @0 V一氧化氮浓度(每千万份)。# \, }6 ^% Q4 c& l0 A7 C5 ^
每栋住宅的平均房间数。
6 e9 K2 ~2 ]; a1940年以前建造的自住单位比例。/ H8 o! d' \2 Z8 W3 I( W
到波士顿五个就业中心的加权距离。
, v8 s6 z/ S) h. b6 z2 m径向高速公路的可达性指数。
1 l+ I0 D. A0 `, p& [, J/ f- Z" Z$ |每10,000美元的全额物业税率。
- E( s9 x8 ?- V3 ?城镇的学生与教师比例。
8 v3 t# K/ f N! U8 a# c1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
& l, }$ H- b4 T: Q, X( C人口比例较低的百分比。
$ G0 n' b5 a& M& P1. 加载波士顿房价数据
- u% t+ B2 F& Y9 W; X" @library(keras)% o* A+ ^+ q/ h4 {! y& c5 i6 c3 S
5 n9 u; ^- u2 v( ~. Q Q/ d0 Pboston_housing <- dataset_boston_housing()0 z- _" E* W! P! [
3 S: o" E' C' B% W' F0 x5 }c(train_data, train_labels) %<-% boston_housing$train$ O8 h+ _5 C/ ~! n, x9 j( ^ c
c(test_data, test_labels) %<-% boston_housing$test/ y7 J3 d+ ]! Z A
( ]: A" b9 g, {% h/ |9 q4 @
每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
+ j5 t% @0 U- b) Q9 ?9 E2 C% [# Test data is *not* used when calculating the mean and std.. @: ^: G0 Y9 K6 g1 h
/ K0 D7 F. X# L$ W- S& x
# Normalize training data- q/ }! {; H( }4 W% a) j* E% E
train_data <- scale(train_data) 5 t! D8 h" \9 j9 g/ q2 b. N2 ^$ H; O
0 Q& b: j0 \1 p
# Use means and standard deviations from training set to normalize test set
/ L# R2 c5 _6 Dcol_means_train <- attr(train_data, "scaled:center")
& D- y" q' A3 A$ D6 e* Y3 |col_stddevs_train <- attr(train_data, "scaled:scale"), S' X, n0 V3 w/ x& G6 E
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
3 X; E# R5 F) _+ B
0 D6 ~. {! n# L; J8 i- @0 b, ~3. 构建网络创建模型 $ i4 @1 J$ V* N0 i1 P8 _2 P
build_model <- function() {+ k3 j9 ~1 x! Y$ u
B* E- y6 j3 p# y model <- keras_model_sequential() %>%
6 L: I3 \3 @, f# _+ A+ J( v0 h+ m layer_dense(units = 64, activation = "relu",
' r4 |/ u# j$ B K6 K. m9 n s input_shape = dim(train_data)[2]) %>%; U5 a9 ]5 j, h6 U! }6 `* w
layer_dense(units = 64, activation = "relu") %>%
& p, P7 U& J/ c0 V$ e/ [9 J0 q layer_dense(units = 1)& ~: i, ?- r" l' E3 _+ i2 N) Y
+ x: X, |7 Z# ~" J( z
model %>% compile(: }9 ?- k* D' f4 D1 m2 R* Y
loss = "mse",: m5 E: I8 V/ W# P$ {
optimizer = optimizer_rmsprop(),3 }% y7 S9 Z9 x% C7 y U5 Q
metrics = list("mean_absolute_error")
' e2 i8 E2 r% K p) s& u )
9 Z9 ? }# P) \! ?. u2 g, D# k: p3 x$ R. r' _: l( W
model
# c' ~. p* i+ t6 u}- n" p* E3 A+ @$ R0 D
' N3 ~$ U6 C6 ]0 B, J2 K, A
model <- build_model()
0 H5 e' b# T$ mmodel %>% summary()
# f. ]& Q+ q7 k' P% S3 U9 ? U+ `' w' y1 C
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型
/ C) m# c7 v" T' r% G/ ]; Z$ D# Display training progress by printing a single dot for each completed epoch.; G* i8 z, u7 w$ W
print_dot_callback <- callback_lambda(. t- S* Y8 P; e- w9 v( {5 ~# o8 W
on_epoch_end = function(epoch, logs) {
/ N" s. Z0 e% O8 S0 m0 f if (epoch %% 80 == 0) cat("\n")* J" W3 f* W' P) C# K' D5 t3 [
cat(".")2 |# |: [ d# v' o" V4 l6 r
}. |0 J% ?- i! E! _
) ; w) V1 x5 N. y1 x w
. v. V( T2 x& S; M9 K' M# x0 l3 bepochs <- 5004 N/ @* d4 t; w0 v( F8 q0 Q
' N; x% E5 t* j* q" ~# Fit the model and store training stats2 U; k, q9 M$ c; _0 m( }
history <- model %>% fit(! |, e) u+ ^/ G+ ~5 T
train_data,! N7 F0 J8 J7 {+ e; E/ ?4 m4 Q
train_labels,
- Z. Y$ O% a- w) ? epochs = epochs,
) ]% _; x; e" u/ L1 n validation_split = 0.2,
- k: k- Z, W& ~$ ?! W6 H) \& Z) ?5 Y( S verbose = 0,& W9 P% x* T$ E+ {5 v
callbacks = list(print_dot_callback), ^+ J: j# {2 J9 ?) g
)! p- V. r* ?5 m
- V; r8 Y/ ~# |6 h4 H# h8 x0 m Blibrary(ggplot2) d5 a6 d& {) d4 u( y7 n
$ z) _6 h# {! u7 B) xplot(history, metrics = "mean_absolute_error", smooth = FALSE) +" a" `* a& A/ e( P+ c. w
coord_cartesian(ylim = c(0, 5))$ Z- @ m3 \* O! ^
1 s& h- x: n: ~
+ B0 t7 @' F. F" z
+ B0 H5 e0 R' B: a; ]( a s8 b# H小结
0 K' I9 x; K6 E1)回归常用的损失函数是均方误差(MSE)。
3 U, d2 ]- i3 I& E% Z2)常见的回归指标是平均绝对误差(MAE)。2 y: m: B0 D( D p( X$ Y
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
6 K. U Z* E9 ~2 h9 N. K4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
7 D1 e+ y0 T/ [* j5 a3 i' l
1 u" @ y) h! D3 U* `3 {# Q9 S6 C2 _: l
, z+ A- G7 s: ?3 h+ Q! e$ T! F% w
|