预测房价:回归问题——R语言
. z! h- N0 G D% B$ Q" D在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
7 f) S8 P9 K; S( F( U! O
8 _+ ~7 p% w1 h- x7 _8 h问题描述
- a/ `+ ]* x) ~我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。3 t, E$ S/ \- m2 n
本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。$ o3 z9 j/ f6 X2 E( M% z m _
数据特征:4 }! C& j7 Y' P% M/ ]
人均犯罪率。& M- |, W0 P0 v2 h, B! z
占地面积超过25,000平方英尺的住宅用地比例。
3 n7 R! c9 n( q5 k每个城镇非零售业务的比例。! T, }/ M, C$ p; v
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。7 P: T/ q; U$ r6 I, j% M# d
一氧化氮浓度(每千万份)。 K' U6 _$ }4 A. { X% Z! p K
每栋住宅的平均房间数。
: f) V$ r' \. `5 c9 c d& B* b1940年以前建造的自住单位比例。
I x; c; E7 m, C: L' o5 @( S到波士顿五个就业中心的加权距离。
1 B5 o- ^. o8 ]6 P2 u& A/ S, p径向高速公路的可达性指数。# S2 q \1 u5 O2 E
每10,000美元的全额物业税率。
* r2 D7 I$ F' E3 G" W城镇的学生与教师比例。
6 W; z- |; Y1 E3 O; N& F6 N7 }1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
8 L; T" G1 ?/ l/ S: t* Z6 w人口比例较低的百分比。: D0 Z) y' x2 c0 w9 Y9 S
1. 加载波士顿房价数据
3 V3 Q0 N" K: Y s% X0 Slibrary(keras), ~& t; o& n2 p
5 M3 H. j' w9 R) `
boston_housing <- dataset_boston_housing()
. l7 g% Q' o2 N8 W. N; e. U. ]: \3 s m) n
c(train_data, train_labels) %<-% boston_housing$train
8 B5 L' `, K9 f# r' Kc(test_data, test_labels) %<-% boston_housing$test1 K0 V% v3 c% W; a. b, i$ J4 R# _; v
0 M$ [4 ?5 y N9 \, o
每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 " n4 y% M/ N4 Z, {# r# ]
# Test data is *not* used when calculating the mean and std.
' D4 n* ?8 S n1 z* d. o1 G3 W; s
# Normalize training data
; _+ y# j* {3 ]* H! `. t$ f5 V! wtrain_data <- scale(train_data) . i7 Z! W# P, B% C9 E7 `- l
7 Q8 J! F7 X! ^ ~* d9 o
# Use means and standard deviations from training set to normalize test set4 a! S5 I2 L9 J* z3 {
col_means_train <- attr(train_data, "scaled:center")
" h# M0 G) _+ @+ o; pcol_stddevs_train <- attr(train_data, "scaled:scale")* G) W. S2 T* ^, N
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train) ]* o, N6 V, U
2 F# s5 T3 Z5 y t
3. 构建网络创建模型
3 I$ R1 @3 }* I2 j* U% ebuild_model <- function() {$ j2 _! d9 t: h+ f+ A& e8 h. h- `
( b& t' J8 v1 h% i9 f
model <- keras_model_sequential() %>%6 L" J$ u2 @, s
layer_dense(units = 64, activation = "relu",4 Q* O. ~* ]+ z
input_shape = dim(train_data)[2]) %>%9 ~% G/ Z n" z, m& ^! e3 r& K- c& T
layer_dense(units = 64, activation = "relu") %>%. I4 I8 v( D/ `$ ^
layer_dense(units = 1)
/ q) s- S1 |: {7 q' _( n i l3 M5 U' u/ `% N$ t7 q5 B3 U: K
model %>% compile(. h5 d7 ?7 x% o
loss = "mse",
1 N6 F5 S+ L, X* r optimizer = optimizer_rmsprop(),- ] X4 N e) a. Y& C. Z
metrics = list("mean_absolute_error") K/ ]- T6 s. z: {
)
4 x) _) M$ H, Q$ p! G% R2 ^. d) K# U! Y5 ^
model) L8 u3 s: v5 @# R! g t2 Q
}
) i5 A2 e, N3 R6 D
1 y S P2 S. G4 Tmodel <- build_model()+ t* k* i3 M; x
model %>% summary()& w" O+ n4 y( t
0 D0 l/ A( t, x网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型
6 D5 t# [% i9 s E y* d# Display training progress by printing a single dot for each completed epoch.
& o" Y/ {$ f) B- eprint_dot_callback <- callback_lambda( u$ P+ M' P0 c
on_epoch_end = function(epoch, logs) {
: M. U6 A7 y9 n: ?" x if (epoch %% 80 == 0) cat("\n")0 {* h- _0 T8 ?- |
cat(".")" z5 _0 ~) R! \- F
}
( {$ V# B" K9 p6 ]% j' j9 {* O) 2 ]7 f0 v3 ^) A7 a# F
. }8 F+ P$ L9 u2 m; pepochs <- 500- t7 a5 c1 j) X7 d) B* T# N
1 W t$ H$ D& z: K1 [# Fit the model and store training stats
" x* A. W" e: D/ Dhistory <- model %>% fit() [4 [5 i# H2 }: j( c
train_data,( I* t1 ]0 |0 z* A* I6 C2 Q
train_labels,; b5 Y. o" n7 l1 z) k" ~* q( K' A
epochs = epochs,* {3 [% ~0 V! ^5 ~, u$ j& x
validation_split = 0.2,
3 z& w+ S3 E& B3 v7 e verbose = 0,
' V9 z3 @/ L% l3 R' I2 ] callbacks = list(print_dot_callback)
. T0 C, I7 V, c. g2 h)
6 v' L9 D% F# L; H) S! h0 E7 Z" o2 S) N
library(ggplot2)
( z |0 W' n* N2 Z& W' A6 v& q, P/ ^2 S. n4 B4 z, r
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
/ N9 F* b5 e# f% S9 A coord_cartesian(ylim = c(0, 5))" |& H7 o! I$ U' _6 V& V. s! v9 I3 V8 G! w
( G0 u* ~: \3 H( U3 m& C$ u & Q+ }& y, ?) M8 q' F* S
! A3 v# _; F3 G, A小结
" Y& i$ t# T0 c* A1)回归常用的损失函数是均方误差(MSE)。- ^* x0 ]. z) t. m) Z! H
2)常见的回归指标是平均绝对误差(MAE)。
0 F6 u# ^0 g; e8 l3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
, Q) ^ }% q, r4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。, {/ q) S/ t* e: _! J
0 y2 D# N/ S$ _7 X0 m7 L6 h5 ~7 \- h6 k, t: f$ {8 |
& U* h5 J# ]9 \+ L: M
|