预测房价:回归问题——R语言1 o' Y- M- _0 G6 V2 M
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。( d6 H: _5 p% l6 ~
! d$ V* W h3 O0 n; e问题描述
: S2 l7 |$ `1 o- J/ P( a# q我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
& u$ ~' |1 q% {! [. s6 k* }" v n本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
/ a8 Y; W7 i" k% W数据特征:
, N" g" J1 c, x. j8 V人均犯罪率。) r! F7 V0 _0 D
占地面积超过25,000平方英尺的住宅用地比例。1 N& J+ J2 @& N$ c& f* z
每个城镇非零售业务的比例。
1 {/ I/ |8 D5 Q- s& x( W& R1 rCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。8 A' P) p- a5 n) S+ p8 \
一氧化氮浓度(每千万份)。, X* d8 W9 \( @6 b$ Y% E$ e; s* \
每栋住宅的平均房间数。6 j- }3 k* |& \; u' m7 _5 T
1940年以前建造的自住单位比例。4 C( u$ O5 t8 v2 v; D
到波士顿五个就业中心的加权距离。
5 n) W: W* q8 d径向高速公路的可达性指数。+ o* W* z3 v9 ]* O
每10,000美元的全额物业税率。
# v% K( B8 I/ ~/ R4 H6 L5 f城镇的学生与教师比例。( r4 O7 L5 E; ?$ C
1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
# _; J) e6 f4 K人口比例较低的百分比。
7 m0 c ?! m# `+ q7 f* |1. 加载波士顿房价数据% E' f3 K4 d! }( H, O4 ^
library(keras)2 S4 c: E9 I1 p& K2 _ r
6 T8 |& i# U" Y9 l- v" Dboston_housing <- dataset_boston_housing()3 M7 l* G }, N4 N& n" G" E
z6 a% P% Z4 q! A9 t2 x4 V% C8 gc(train_data, train_labels) %<-% boston_housing$train" p* }1 `) F: B4 Z, Q. {
c(test_data, test_labels) %<-% boston_housing$test
: d5 M' _* J; W- A. G( \- i! }
& h' @ n/ O* K4 [" {5 p3 R每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 ( d1 B; e' p# U1 A6 Y' a
# Test data is *not* used when calculating the mean and std.
3 ?) J) t8 `" N# n, z9 ^6 y. x+ a# E, t& f9 T- X+ m. _4 ~
# Normalize training data6 e6 {8 A+ t" `. [3 Y
train_data <- scale(train_data) , t$ F7 S5 k0 K* P* `: [
y; X) o3 j+ _& }+ F: }8 g: J
# Use means and standard deviations from training set to normalize test set9 j i6 _8 X5 U7 `/ x' Z/ D
col_means_train <- attr(train_data, "scaled:center") : F$ C' f% N! k9 n7 F' `9 j$ K1 z
col_stddevs_train <- attr(train_data, "scaled:scale")
" G2 r( D# s2 G7 q+ B" dtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)! E0 }; _: h4 M* M: D
. v7 z0 D6 ~2 @2 K/ `7 I( E7 o9 H
3. 构建网络创建模型
, |# O, M1 j( E8 h9 q9 E9 qbuild_model <- function() {2 N9 }' [. Y3 [! x4 l, B; z# N
+ s& Y h% _* P
model <- keras_model_sequential() %>%, I" Y$ U; i h" E6 l0 }2 d
layer_dense(units = 64, activation = "relu",
$ \8 g" s8 v8 ]0 I input_shape = dim(train_data)[2]) %>%
y( h' T! U7 X5 K layer_dense(units = 64, activation = "relu") %>%
* A& _7 R0 s7 f: t- ^0 _7 k6 f$ ^) M9 d layer_dense(units = 1)
% J( f6 q r- ]% |% O
% ~1 o8 q% }6 X7 ] R model %>% compile(8 }; |. a5 }" G/ ]& N# [
loss = "mse",
6 |. b4 ~7 B+ w optimizer = optimizer_rmsprop(),+ C7 j" S! g1 K6 L- w% y/ v
metrics = list("mean_absolute_error")
# z7 p L) {; n) D, B1 a' D3 G )
% `1 T) h% B7 r5 s+ m
: Z% H0 h$ U% e5 v4 a model; ?9 n$ i1 R# t" O3 }+ {. V6 b% d/ t
}$ D$ J% f# g/ v. z# }
; \$ p, \, n, O1 Y: _/ T% }model <- build_model()
- Y. m5 d7 S1 N7 Y F+ k! f' Zmodel %>% summary()
5 E! F5 o9 l: j, @/ _9 T. [# B$ T- Q
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型
. w5 D T& m8 s& X1 s2 E# Display training progress by printing a single dot for each completed epoch.
2 P: x- D& J4 h) Z% cprint_dot_callback <- callback_lambda(1 `- K# L# f# d2 t+ n
on_epoch_end = function(epoch, logs) {. [- r( j* U6 }1 Y2 s- r j
if (epoch %% 80 == 0) cat("\n")/ J6 m6 ?! X: N: V
cat(".")
; e- z) y. Q/ O: q }9 i* B( M, r5 O @% d& C' ?
)
, A! E$ S1 A* }1 k+ d8 n# S
' \) M Z' `! V m8 D* Zepochs <- 500+ x) K* z" O. x! o5 d r
O+ u6 h B6 f) i1 ?' U# Fit the model and store training stats
/ S) E4 Q6 D! C" _7 r& Y0 ~history <- model %>% fit(" x6 w% j1 h I
train_data,0 B$ L( d" C7 W
train_labels,, V( I9 D, J) k! {3 Q
epochs = epochs,
- V' {2 P, H. p) X4 m validation_split = 0.2,
0 N* ]' O7 S. m' {$ |# a- e verbose = 0,* h D/ Q9 i* L" e7 Z9 ` R
callbacks = list(print_dot_callback)& ^) v q3 x3 K- \5 P, e7 G
)
! h2 G) q( |; h I+ M2 ], E+ w4 \- F1 Z$ A, X4 ?
library(ggplot2)
* u2 E4 t) K/ B1 v Z" L7 V( i
7 [4 T$ m/ W/ g, p7 i( r! I0 ^1 Iplot(history, metrics = "mean_absolute_error", smooth = FALSE) +
. ?, \! a4 D$ J+ {5 O coord_cartesian(ylim = c(0, 5))+ G# ^! @" Y2 a2 U1 o9 E. {
( e: N4 e& H; [![]()
K. Z: h* G) k( x$ n E; U+ x
( I4 K9 O: Y' @6 O5 u' D* _( T小结
/ j, l! ]3 C k; i- P. o& |5 L! U1)回归常用的损失函数是均方误差(MSE)。/ d: U* b4 g" i0 Y( \& ^
2)常见的回归指标是平均绝对误差(MAE)。
' {3 }) _' y( {# G! Q# n6 d3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
) W# f+ x% `7 S2 X) E* ^8 M4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。! A4 C4 v% `# Y) d3 k6 J
/ N$ G* Y# \6 Q" ~' M7 g/ V4 K
, y m0 o! U+ x X! O6 n
% m5 f: J, X$ ?6 h+ S6 m2 k% P" b |