预测房价:回归问题——R语言3 i9 ^7 f* y; F9 k; P, F) S! e
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
, X) k, ?4 g2 y- A9 U0 \5 j, j5 g$ k7 a2 o5 }$ j% Q! Z( Y2 L
问题描述2 e5 r6 \; J k
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
3 u5 G) `% F' W5 y本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。2 ?' o1 _- q5 @, T- r, u# v
数据特征: j4 Y4 r0 L3 q. K
人均犯罪率。, |3 R$ m( z; C' G2 X
占地面积超过25,000平方英尺的住宅用地比例。
, A9 ~! |8 f$ H9 l% k$ j* F4 g每个城镇非零售业务的比例。
9 T+ X6 l; F1 _/ m7 ICharles River虚拟变量(如果管道限制河流则= 1;否则为0)。' V0 ] I. a- e- {( s
一氧化氮浓度(每千万份)。% W1 M2 W# W: k$ W! Z' V
每栋住宅的平均房间数。
7 @9 {3 ?& S# z* u2 V1940年以前建造的自住单位比例。% m1 n0 w) v# F$ u! B, t3 L. K1 p
到波士顿五个就业中心的加权距离。, G3 q( j/ ~& {* _
径向高速公路的可达性指数。
, v3 C% m5 a3 n: ?7 s, C每10,000美元的全额物业税率。: ~% x( |- Q$ C7 w. W) f: R
城镇的学生与教师比例。
$ R+ w! C; d2 Y( R9 J1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
N7 b. M5 H% D: W人口比例较低的百分比。
( N9 s, A, d+ o. i0 B) G1. 加载波士顿房价数据
) Z% h* i- _, t d0 d( {7 Nlibrary(keras)
9 f! y3 L9 Z7 l. r, G2 j4 `! x' v
/ C2 U9 Y% Y! v- M5 S3 k' F0 f6 Q+ uboston_housing <- dataset_boston_housing()
% T5 h. T7 s* ]# Q9 a9 w* |9 |* }" h5 w' [
c(train_data, train_labels) %<-% boston_housing$train
! u6 B3 F( q- W3 M$ z: h* i3 \- r) t0 Sc(test_data, test_labels) %<-% boston_housing$test
, w, @4 q- F$ J- S, g: a
, M# W8 e+ S) }8 b( Z5 m每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 5 l0 R- s; Z( m
# Test data is *not* used when calculating the mean and std.
; [/ y4 {# M9 k( i5 K( q; ^5 [1 ], c8 R' u. K
# Normalize training data
* w$ }/ s) `7 P- |train_data <- scale(train_data) . N0 y+ Q+ M& Q O
; V% l A4 |+ T) }
# Use means and standard deviations from training set to normalize test set
0 m7 L. e& u2 n* F& Acol_means_train <- attr(train_data, "scaled:center") : c7 v/ M+ E/ `
col_stddevs_train <- attr(train_data, "scaled:scale")2 m4 O* y S$ s
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
2 r6 f4 c9 G* |& H+ e) w8 m8 |2 Z/ |& K( ~2 t1 j
3. 构建网络创建模型
( k5 R) i" _" _+ h. Ybuild_model <- function() {+ S# @! m+ g8 o2 v( _' y
: M0 E1 G( a; F
model <- keras_model_sequential() %>%9 q5 U' g7 S1 Z7 G: l7 n& p& j
layer_dense(units = 64, activation = "relu",* a+ ~. `6 V' Q" u' ]2 q
input_shape = dim(train_data)[2]) %>%
7 s$ F1 G4 e7 [1 Q* ~1 Q/ h N layer_dense(units = 64, activation = "relu") %>% a& Y" D* k5 O0 ]. Z
layer_dense(units = 1)
" C( S9 j& {8 x7 O
M* w3 s5 e* f8 m" v model %>% compile(
# W/ R+ a# w3 n0 A5 L$ U loss = "mse",
. Q( C, u' R2 _3 M. ^9 R- \ optimizer = optimizer_rmsprop(),) q" U5 m! T9 s; Y3 k
metrics = list("mean_absolute_error")
1 Z8 M/ y! Q. l# Q )
% Z& I8 ^1 a; \9 p7 \/ ?
; @3 ?7 P- l* d& s model
* j4 f) ~/ Z* S) B, P$ X: n}+ V2 V; R2 R) H
+ ?% M/ ~* o* l- v& ~1 u; g5 l
model <- build_model()
& M, e. r& |% Hmodel %>% summary()
: r* l% o. H, k/ V3 N: _% V; e% ^! ~8 V% u5 R. W! M
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型2 w0 B6 [4 c: O3 ~' q4 c
# Display training progress by printing a single dot for each completed epoch.
% V: W4 e$ f7 M6 N u$ bprint_dot_callback <- callback_lambda(/ h4 J0 x1 Z x+ o. {* f5 r
on_epoch_end = function(epoch, logs) {, C8 k$ k+ p: ~7 H \" _2 M
if (epoch %% 80 == 0) cat("\n")1 j( n" @& ]% j' X( g; D
cat(".")1 |! m7 m, [/ q5 ^, y
}/ q! D- X% u* N
)
0 s4 I% e* G" s" B; p9 D
' z% N! Y9 e% X- k. F2 {epochs <- 500( D) H+ I/ Q: Z+ b" S5 P& t p: a
* E' M1 ?9 @, l- V) H5 W1 `) X# Fit the model and store training stats
. M. ]8 n5 S$ O, F1 h0 S7 B3 xhistory <- model %>% fit(' e: W I2 _2 l/ q; o- R6 H9 v
train_data,
: m( z9 k0 |% t; ?2 _% B( e9 T8 @ train_labels,) _4 p5 ]3 j, R; h/ R( Q: [
epochs = epochs,9 e1 N- }9 y* S+ V+ y+ |+ N
validation_split = 0.2,. y- _4 { l' W; w
verbose = 0, P: c( k4 O# t T
callbacks = list(print_dot_callback)5 ?' b) c" `- g, z) `
)& L) F, r& I% S1 [+ I0 v( v
' {: n& i2 P: ^: W/ k/ xlibrary(ggplot2)
) E1 {; O/ ^( r6 f8 R/ n! R
: H. Z" x% k& E8 s: Q3 G- H' vplot(history, metrics = "mean_absolute_error", smooth = FALSE) +4 N. G9 n4 F1 J) T- H1 i" h
coord_cartesian(ylim = c(0, 5))* R6 V& w/ Z( C x& B
4 L$ L, A6 k- ~5 c: F" \
![]()
* B2 t- E# z7 R! H7 k O9 J- } |, I
小结2 Q- s* H- B5 i5 | n, G9 Y
1)回归常用的损失函数是均方误差(MSE)。
3 V' Y! j* Z4 s+ C4 G+ |2)常见的回归指标是平均绝对误差(MAE)。+ e3 e% S. V. I0 H# U
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
7 _8 y, Z. r( i' ~4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
% `7 ]# Y$ V% @- X) t9 b D' K4 z5 i: G2 O
1 m) l7 f! `: g7 [3 q! E9 M7 k; |9 l f9 L- I& G3 Q9 s, @9 Q7 y
|