预测房价:回归问题——R语言8 s* o" F! g; K# Z
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
3 t" e9 x) B# b% [5 z E# f1 p; f( a) X$ \1 i! J5 |
问题描述0 b1 @. `' F3 W2 w! J) V
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
2 }3 _" N: I) f7 g本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
$ X- l7 Z9 {4 l/ O数据特征:5 Y1 V0 k/ r$ ]$ B) E( D7 P
人均犯罪率。
: o2 m+ A& o+ H( ]7 j1 D占地面积超过25,000平方英尺的住宅用地比例。& @ Q; ^; `% _: x( q
每个城镇非零售业务的比例。* [6 R" N7 w+ X; y# r
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
' N7 s3 _- L. u; @% J, z一氧化氮浓度(每千万份)。
8 T' \; f; X6 f4 Q, Z: @0 @每栋住宅的平均房间数。 o0 P" l8 c6 k7 G* l. Z% ?) r
1940年以前建造的自住单位比例。
* o$ g: s( v4 E, b到波士顿五个就业中心的加权距离。. T5 b. |: L1 N% y8 {) v( d
径向高速公路的可达性指数。& h6 j% b# ]- Q& @0 u4 ?- \6 i: F
每10,000美元的全额物业税率。
5 Y: _" }; r) |) s; L城镇的学生与教师比例。# [/ Z' U, [/ e- f6 \
1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。# C& [. \2 x& z& q8 N+ H
人口比例较低的百分比。6 v+ ?! z! S: ?2 P! k* v' G" r
1. 加载波士顿房价数据
; Z& `1 [1 i; @2 klibrary(keras)
8 M; D; d) X9 Q) Z1 D
$ g& M' K" S+ ]8 J0 `+ oboston_housing <- dataset_boston_housing(); ?1 Q/ d/ P7 l: u, T( }
8 x. K6 w; R4 q) B
c(train_data, train_labels) %<-% boston_housing$train
1 n& ^% g* r+ r5 c& _$ e1 Oc(test_data, test_labels) %<-% boston_housing$test1 O2 {5 n7 P1 }9 k
/ c! B) R, C8 U9 ~7 F' v每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 4 u$ y" x0 Z+ ?9 j0 C7 X9 w' v
# Test data is *not* used when calculating the mean and std.
2 n2 ~, K& P0 a8 j' p) z* f/ `3 X) Y: U/ D% @
# Normalize training data4 n5 }7 ~9 ~1 ]
train_data <- scale(train_data) 3 c7 f$ q& V; f$ w( H( C
1 D5 X; N7 G6 Q/ X! o3 U: s0 s* A# Use means and standard deviations from training set to normalize test set8 w; K( |2 P" D
col_means_train <- attr(train_data, "scaled:center") + ]/ e$ B( E2 P
col_stddevs_train <- attr(train_data, "scaled:scale")
0 b0 j; c1 c8 Ytest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
1 r/ u1 w" P3 a' J
5 L: X8 K* I6 Y' j3. 构建网络创建模型 : U* M5 G8 w2 `; y$ J# i8 a t
build_model <- function() {4 M3 ~" g' }9 X4 h% M
2 S9 b/ W% F, ~
model <- keras_model_sequential() %>%
! s' F' ^8 u! V+ r5 o' y* x layer_dense(units = 64, activation = "relu",
X e6 R. T" }# }; K input_shape = dim(train_data)[2]) %>%
9 p. H+ }& m' S6 V layer_dense(units = 64, activation = "relu") %>%
$ [1 v. q( h) ]. s layer_dense(units = 1)
! E2 \9 a% L0 y7 u7 E% O& O3 m3 X
& q* V: B9 s! W- F* h3 A model %>% compile(9 ^) f' @# g8 f1 j- Z
loss = "mse",0 ]( k) ]' E9 |4 N4 U( ~ O$ c* b
optimizer = optimizer_rmsprop(),5 \ E0 Y* g" F( s0 s1 O! l
metrics = list("mean_absolute_error")6 ~* a5 k/ q0 s t& {
)
- J5 k$ i1 _# I
) e* W5 b$ b/ \/ q* r+ g& P model
+ w5 l6 v, n* A8 Z. D- A( ~+ z! w} ]( P4 M8 x" h& W
7 J8 a' K4 U5 v, W; I# [8 I5 `$ ~
model <- build_model()
+ |6 M/ k* P' b) d. |% hmodel %>% summary()
# \ A& w0 m. s( l2 U! S' p$ B4 I# t. Y- t0 o6 @9 w; c
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型# C/ V0 s- L6 G6 C% l% o% I& ?* J8 |
# Display training progress by printing a single dot for each completed epoch., i( x; _+ \. d
print_dot_callback <- callback_lambda(7 G, a+ s& R) v7 b2 e/ @
on_epoch_end = function(epoch, logs) {( E' a5 W: f" e
if (epoch %% 80 == 0) cat("\n")
, D, k5 v: z- O$ @- s8 B! j0 @ cat(".")
3 U* ~, H6 B( s) W* Q }8 P5 u) a' K3 x) w6 I/ e
) & z4 ?7 E y7 U9 z4 u* C9 F' y
6 W: r4 A& ~7 Z& F. R
epochs <- 500
1 k6 D! h4 J$ p: a
' O# _( ^# l1 c# Fit the model and store training stats) k# L/ l4 ~6 Z2 u
history <- model %>% fit(. f6 Q- O9 A$ }% u3 N2 p6 H
train_data,
4 e. m) P) k+ M! `) b train_labels,/ x1 {+ G" t m+ c z
epochs = epochs,
. x6 s, u# L; s, H! z$ G* V0 n4 @8 a validation_split = 0.2,8 Y: o7 S6 i1 I8 A, D7 R4 u& S
verbose = 0,5 b$ B9 J2 V; G! L; T- K
callbacks = list(print_dot_callback)# ^0 Z" h' r% y, l7 J( }8 H. k' T
)
) ^: F$ x0 X4 P9 Y0 W; l4 ?* j K; e+ A4 T
library(ggplot2), z# o3 h; ~" h8 |
N1 z9 g+ Y- n0 s V+ u6 L
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
/ k$ x& ~- p. D9 k- a- v8 } coord_cartesian(ylim = c(0, 5))+ U& c D, c3 ^
7 j! R: ]% |8 L/ ^![]()
. P5 A6 c. [: O% `( j7 V# I+ f o' m* Q) [. i8 i
小结$ \4 s0 R* U2 U4 Q# r) K ~+ U: g
1)回归常用的损失函数是均方误差(MSE)。
- N7 D8 e! k" X* i) L2)常见的回归指标是平均绝对误差(MAE)。
# h9 M1 G2 u6 t6 c& O6 P/ [+ L3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。& |5 D& \/ O# B4 |
4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。 Q9 B/ ?0 E' c( z J: o
$ M( K" r' X5 f3 `! s5 q
. L$ u* S9 ?4 @3 h
! Q% ^( c ~* g0 @4 t$ M% O |