预测房价:回归问题——R语言7 X, c+ ?& r& l$ T
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
0 R1 ~+ z6 w. @7 P( Q1 `0 z$ {$ _) e
问题描述$ G4 q* B4 h9 h' S" C8 g# U2 g
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。3 a# W3 ?; H7 M+ A' E+ ^
本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
* B( B* p# |) V t% H/ Y _数据特征:
& o8 _8 d: V; I人均犯罪率。0 H6 T/ w$ K* c' r8 k% K1 C5 P
占地面积超过25,000平方英尺的住宅用地比例。
' M. L- J( ^ Z每个城镇非零售业务的比例。
! r; `5 H% q: y. m! TCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。2 {( h# F) ]3 m4 l. S
一氧化氮浓度(每千万份)。( ]: o! y7 f8 G$ C
每栋住宅的平均房间数。
3 k* x; i' f# \+ x2 q; p' I1940年以前建造的自住单位比例。. J, p; b8 Q3 N2 j7 S# c, d" x
到波士顿五个就业中心的加权距离。5 C7 F9 k0 h" D0 n% s- T
径向高速公路的可达性指数。
8 j) p0 h, U5 G$ q, H' I每10,000美元的全额物业税率。7 O- P& |+ x& U) B! F& _+ ^, m4 X
城镇的学生与教师比例。
5 g8 t6 T# O. U- n; {1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。- g+ w; K! V; R2 d: E
人口比例较低的百分比。
9 ?: r, ^% o' g1. 加载波士顿房价数据
& g1 a% [! {; g; i O% o7 mlibrary(keras)
# p& J; L* @1 t( Z
2 ^/ Q6 M' d$ |. O8 Q! e' ? jboston_housing <- dataset_boston_housing()
8 [% C5 {& `. G- i. m5 [, R; T" }* K2 Y" x2 _
c(train_data, train_labels) %<-% boston_housing$train, n7 Q9 b( d5 K0 w B% z+ [
c(test_data, test_labels) %<-% boston_housing$test* `: W& O& M2 C& C6 _6 I2 Q8 X
2 ~8 y8 J2 a6 x) n2 {% q每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
- d1 F. d7 V" j4 u# @) S- j# Test data is *not* used when calculating the mean and std.
) T( \' Y& A( d- D* t
5 k' ^; T* L5 e. ^# Normalize training data
, n, z$ U7 V, ~; T% Z+ C+ A1 U; otrain_data <- scale(train_data)
/ p5 q1 t7 k, }, M' v w+ H# u3 d( J3 |$ G" z2 T' ^
# Use means and standard deviations from training set to normalize test set9 O- M7 S) _9 C" X" X) F5 K' @
col_means_train <- attr(train_data, "scaled:center")
, _ {! i- e+ H* U# |2 B% o6 Y0 O" Ocol_stddevs_train <- attr(train_data, "scaled:scale"). a6 c5 M' S2 L
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train); Z) W$ j1 g; A& A9 C" B+ l
5 |6 I$ S: a5 }) `) V9 M3. 构建网络创建模型
! \" |* @0 g! S8 `5 ybuild_model <- function() {% |" A2 l e( Z6 j
0 R1 s2 e% y: ?7 U- P
model <- keras_model_sequential() %>% [8 X7 n* P* o& A* ~- w* X
layer_dense(units = 64, activation = "relu",1 F# x6 M* Q7 f6 S& X5 c/ y: M% K
input_shape = dim(train_data)[2]) %>%
: ^1 G$ r$ ]5 H4 L layer_dense(units = 64, activation = "relu") %>%8 f. F8 j% `: ^
layer_dense(units = 1)
, R, V" N* y, E( @. K8 j. Z- e! q( S3 ~* p
model %>% compile(/ m6 G* q7 F6 ]$ l& N
loss = "mse",5 j0 i F* b- A3 T( {
optimizer = optimizer_rmsprop(),
8 }5 N+ M2 Y4 g& c! o( S' b" S metrics = list("mean_absolute_error"). x2 p8 b; `9 s9 r9 ?* J7 a
)) Y% s7 ~9 A& m4 k* _1 c/ A
: H9 `, v/ ]) _ model
& Z: o) e+ Q$ O# ]& u5 v5 {}) x6 g( T! h* Z$ h
! Y6 H6 ^4 O! F- `model <- build_model()7 w) b% D9 H# m: \; M
model %>% summary()
: v; Y3 a+ J* n- K `6 \8 Y0 Q* ~7 |4 O3 X: Z' k- Y* B
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型& e: j9 n8 N! M n" m) b) i
# Display training progress by printing a single dot for each completed epoch.+ {( V: c6 U2 k" F' H
print_dot_callback <- callback_lambda(. U2 m6 Q! X1 v0 T% q+ K
on_epoch_end = function(epoch, logs) {
4 u5 Y5 a' F: f if (epoch %% 80 == 0) cat("\n")$ i3 H" L& }: W" M
cat(".")
) E% F9 E- f& j4 C8 L- \- n' R }
* `- ?7 Z$ x* b" f5 s, ^)
' H8 E% P1 @9 {; g3 a3 Y
6 C/ T: ]2 \$ }0 Iepochs <- 500' P0 u$ W. t$ g3 k" k
& p8 C8 {8 x& |& n# Fit the model and store training stats* C- h9 ^6 k! B& F
history <- model %>% fit( N" N& [% x) w( u. \# a4 ^( Q
train_data,
- ~& S1 P5 ]( p: b' Q9 [$ B train_labels,
1 c" r4 I9 d& } epochs = epochs,
# Y2 E0 w& {; m$ H: h: @ validation_split = 0.2,! J! ?& w+ y; a
verbose = 0,
' j& l. |/ @. ]0 w/ \5 R" i callbacks = list(print_dot_callback)
, d0 m! U) ~5 f)
0 M3 _ F, h4 J& ~( N/ ^! s5 j4 ~" ^7 v, o. j4 e4 _& c
library(ggplot2)) `5 U: H( ~0 \# U" a
1 d4 o- w: X! z& u( {) Q! k! @5 G
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
2 S$ A* K6 U' h. t8 ^ c coord_cartesian(ylim = c(0, 5))2 D7 N: f" C0 K. q: W6 H
4 \, ^7 y8 |, t/ V# O6 H& x* w
/ c3 ~+ b8 w- {( s
& F ~9 X" v8 ]. q! ^, b小结
6 v" A) y- P( z) ~4 F1)回归常用的损失函数是均方误差(MSE)。0 z* ?3 l Y" N8 C, f$ ?
2)常见的回归指标是平均绝对误差(MAE)。
0 l+ I: z$ ? z) E2 U0 w3 V3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
# d$ f* X6 {" \; r/ D+ }4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。5 B0 J3 y9 [3 B4 A7 ?$ |
5 {5 L5 |) [; v3 _- o0 P+ U/ T& C/ H, X$ j
^8 ]8 `# `/ n4 ], C: m |