预测房价:回归问题——R语言
( w( h a) x4 F" H: ^在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。5 E& x. b. J; H) ?( W+ p9 w& @
8 `8 A* b0 K5 ]8 j4 Z问题描述. G2 P3 ?. K _, p* R( }. P
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
) V* H2 M3 J# V" a本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
; [3 T# @. k# M, u h数据特征:' y P' J3 r& `
人均犯罪率。* \5 ?' W! Y H% a+ L
占地面积超过25,000平方英尺的住宅用地比例。) n. I& Y% ?, W V: a
每个城镇非零售业务的比例。 C$ l% f, ~+ R* I
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
- ?; J M& z5 l; P一氧化氮浓度(每千万份)。7 f0 U1 e6 G U! n+ N+ y0 ~
每栋住宅的平均房间数。
& A* D( O0 ` N1 q$ y" {/ z1940年以前建造的自住单位比例。
" q( g; X4 J+ E- F到波士顿五个就业中心的加权距离。
2 |2 T& D9 `" ^% x. P) Y6 |径向高速公路的可达性指数。
! m3 q0 G. a: B5 z每10,000美元的全额物业税率。9 Y* M% s+ r, ~: \) h
城镇的学生与教师比例。
- A3 G$ }. s- h. l1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
. ]& A, v" H; @! T人口比例较低的百分比。/ R7 m6 u* M2 j
1. 加载波士顿房价数据: r d; u3 W3 }% l1 G4 r2 l
library(keras)' m; ? \* a3 E* B0 H8 h9 }9 l
D. I$ n( N b/ d8 w% bboston_housing <- dataset_boston_housing()
. X5 S/ }+ z+ }. H0 b) L4 h# F" [$ [- ^8 t! q" q
c(train_data, train_labels) %<-% boston_housing$train5 y9 T. \9 f& t: e$ ?0 `8 p
c(test_data, test_labels) %<-% boston_housing$test
( ~. B% H: y0 z9 D( i( z$ ^, E9 ^1 M
每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
2 p% X. ~9 B8 l* z2 K# Test data is *not* used when calculating the mean and std.& B, @. ^: t1 D
# F1 w6 l5 ^4 x$ C) Y
# Normalize training data$ x4 T4 e4 J9 o8 I8 B( z
train_data <- scale(train_data)
7 i& @/ C5 H* }+ U1 Q/ G, R: Z7 V5 {: a) X& y! c# L3 H
# Use means and standard deviations from training set to normalize test set! d+ D4 o3 I: b
col_means_train <- attr(train_data, "scaled:center")
/ B& L4 [) A o) L& x% N* vcol_stddevs_train <- attr(train_data, "scaled:scale")
' W# L' D" _: d$ p7 h# l: n4 Vtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
: Z. ^" G- O& G* Q: \/ }' o
, k: |0 f% a' v6 }2 w/ A3. 构建网络创建模型
, q" }+ ~- R$ h* ?9 Dbuild_model <- function() {' R7 v4 x. J5 j) A4 `# |% T; e1 r
4 _& n8 l4 k. n# K model <- keras_model_sequential() %>%
( n- |& k* d: r5 k layer_dense(units = 64, activation = "relu",- W$ I2 ^8 S* O6 {. p" D
input_shape = dim(train_data)[2]) %>%0 @' o+ ]( H: H/ f, j4 u
layer_dense(units = 64, activation = "relu") %>%% ~9 ]" a7 k! J/ \1 ~0 p
layer_dense(units = 1)
/ W4 X; Y7 x& y6 V7 \. V# W/ O
8 m' w5 R0 K) j B+ d model %>% compile(
% n, `) h( L" ^+ `0 ^& R loss = "mse",
0 r& @' i8 i% z# g, H optimizer = optimizer_rmsprop(),! F% ~8 w. [9 s; f( \
metrics = list("mean_absolute_error")6 M& s5 g$ n0 b' c
)
5 t! s: a8 O$ K, z
& }4 `9 G: M" w S! y model
5 W. s8 e! e5 `; U$ {% k ?}
! D8 a3 R+ @# S. V7 `
2 f2 i( l i+ b( i" ^# U( @model <- build_model()
& u3 S; T$ ~9 l$ Q7 _model %>% summary()
, l; y* x- |$ I$ K1 n* F" j. d' [. e! R) y; Y) l2 G W L0 ]& Q
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型 b1 h& x! J* ^' T* [5 `+ [9 E
# Display training progress by printing a single dot for each completed epoch.
5 M$ |! B9 J* yprint_dot_callback <- callback_lambda(5 |) u: \# M1 R
on_epoch_end = function(epoch, logs) {* m# |1 ?0 W) `4 W
if (epoch %% 80 == 0) cat("\n")2 k, A+ I$ u# y- q: C
cat(".")6 O, B5 u' q3 y5 b& {1 F) L
}
5 t& y5 K4 @% J, ^)
- e) X- X, d3 ?% T$ a$ ?# `* M0 b9 r- [ ]7 x/ |7 C* S5 F" r6 {
epochs <- 500) V4 p" h& V$ U5 U# l. p- p# T
3 W; S2 X9 x9 @% K% j
# Fit the model and store training stats. m9 A' F% c( ?! \6 @0 r( e6 J& k- a
history <- model %>% fit(5 I/ B- f* a( A+ ` T# r- y4 P5 @, G5 s
train_data,7 ` |) x+ Y+ f6 O" h, t& m
train_labels,% o+ h7 v6 u% V$ n6 F6 Q
epochs = epochs,
& x7 u, L3 W2 B7 g3 g( M9 U7 F validation_split = 0.2,
+ ~9 J% ]( Z% \& g. d verbose = 0,0 i, a" W; l, X& H& f
callbacks = list(print_dot_callback)
. t8 Z1 \0 }) P" t# \( j( T)0 A7 O7 u' O- I4 e3 {0 M6 O' L
) ]) t9 \7 ^- K' e
library(ggplot2)
' j* k# o, y/ R0 `
- I6 ] T& c+ k2 c0 S& _plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
/ R3 X) q) |1 c, q, w7 \ coord_cartesian(ylim = c(0, 5)): S k, s1 J7 M, k' d. A2 T
9 P. Z U9 K( I- _
! q" S" P5 x. d
( ?* x4 N+ Q5 w( e6 x0 L
小结- z d* n) a+ V6 U1 J
1)回归常用的损失函数是均方误差(MSE)。
" K7 X# n P; e. I2)常见的回归指标是平均绝对误差(MAE)。, I( O7 z% X- q, h) k
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。* O* V! v+ S' R9 p) c1 I. m* L
4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
% a2 S- ~: S; j. q5 p& p& y9 t( f% z, i$ h1 J4 [7 n
: d" V, x' Z$ ~1 k
/ `* U) v8 d: b N
|