预测房价:回归问题——R语言
8 i2 f; D0 G9 G* \1 [在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
. U3 B4 }: z0 h/ A- D8 r, I1 A" F3 `; M! y( i, Y
问题描述
: l, ~5 p, |8 |" g我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。% }8 ~9 _1 k) x5 @) E7 M; ~
本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
' K {3 |6 J% ~* W) H. i( q* {数据特征:- I" h( }7 F( M6 T
人均犯罪率。
7 _) w( G: J9 w6 ]占地面积超过25,000平方英尺的住宅用地比例。
2 l2 ]1 @0 w7 u每个城镇非零售业务的比例。
8 l h5 ]1 W& @: K2 Z( UCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。2 J8 q% q) A/ V4 C- T' l6 s- }0 l
一氧化氮浓度(每千万份)。: f- g8 Q3 z) G- Z h9 f& \% f
每栋住宅的平均房间数。, [) K9 z) {4 f: g2 c
1940年以前建造的自住单位比例。
2 C' w: |! m2 f& a: @! \( a到波士顿五个就业中心的加权距离。% H( h3 D/ _; v- e' s0 M- I
径向高速公路的可达性指数。
6 S; M" h$ z6 Z每10,000美元的全额物业税率。# u% {: b1 v$ O+ a- P
城镇的学生与教师比例。4 m6 M, s4 q! [3 j1 `) g
1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
4 v2 m+ A$ v& `# u5 D. j4 f" x人口比例较低的百分比。 U. c8 B. @ Q* e4 x- t
1. 加载波士顿房价数据6 u0 T% ^0 v2 q0 m6 O; Y+ g( ^1 r4 K
library(keras)
0 M ^& N; k0 R( g
8 r$ T4 j+ k! V7 ]; r! Wboston_housing <- dataset_boston_housing()* ?3 j: s& n) e# d! |
9 j l' Z8 q, A2 J) p" L
c(train_data, train_labels) %<-% boston_housing$train
J% ], u7 m1 ~! Y& {: S1 S# gc(test_data, test_labels) %<-% boston_housing$test
+ Q) | |5 @4 J+ Z" x" Z
+ L+ f2 n( f" z8 t" I5 J9 ?9 J/ @每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 7 m R1 e6 n. r5 J( X) a
# Test data is *not* used when calculating the mean and std.9 i/ |- `0 ^( G) |" b* @
* b' ~5 f3 H+ h# Normalize training data
, i& G0 q- x$ Dtrain_data <- scale(train_data)
8 N/ Y; Q$ n/ J1 |2 l: I! Z
& Z3 S4 ~# u b# Use means and standard deviations from training set to normalize test set; h- }+ f5 S1 ^$ q1 M
col_means_train <- attr(train_data, "scaled:center")
9 r" F4 w& R- Q- Ocol_stddevs_train <- attr(train_data, "scaled:scale")
) a" M. |+ `5 s! i5 ?! Jtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)0 p/ h$ @5 ]. {! q0 M2 x, E
8 [6 [6 A; Y& M3 W1 F2 M: Q7 X
3. 构建网络创建模型
1 V; q6 m# a- `9 M! s; o# [% Kbuild_model <- function() {
4 r* n1 e3 u1 e$ h5 Y2 l4 X! p% ^0 H& J/ t( Y, @' i T* D% [7 m
model <- keras_model_sequential() %>%% W1 R! R4 C# u: J5 {7 m' m8 |
layer_dense(units = 64, activation = "relu",$ H" X9 B9 c2 P6 \% l$ p' ^
input_shape = dim(train_data)[2]) %>%
$ x' O7 p& ` N+ I3 R. | layer_dense(units = 64, activation = "relu") %>%
& F d4 C# [. U2 e0 D6 m layer_dense(units = 1)5 O6 ]" x3 T9 K9 h
0 v( s6 j) j7 l7 X% \ model %>% compile(" H+ a) P2 f: t3 N" {
loss = "mse",
# d7 t6 u" [+ x& Q, f* q6 O) }) r; e optimizer = optimizer_rmsprop(),
2 D2 P$ P$ m! R+ U7 g1 f+ F metrics = list("mean_absolute_error")( p" W# c: V0 p: \: \- f! |3 W
)
& T+ j2 Z, K! s$ ^# u; w [' _5 P. z/ t4 G
model. H& I5 I! {/ i: e8 o
}
: f2 p- C" m. k' C6 C, r! D$ M
model <- build_model()% C. K2 Q0 O6 i, F) o8 j
model %>% summary()
1 t3 \9 Y$ q) o! |0 t, r- m
: K2 U6 k7 H9 c" {; X3 `$ f网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型
8 \; }3 Z. V5 _; [/ z# Display training progress by printing a single dot for each completed epoch.: V) Z% ^# ^7 B! \
print_dot_callback <- callback_lambda(
& ~. u* y$ l/ J+ r on_epoch_end = function(epoch, logs) {/ S6 }0 s P, J% p+ t- K7 R- M. [
if (epoch %% 80 == 0) cat("\n")
8 ]. z7 ~& n/ f- c5 W y8 p cat(".")3 J; A# W# S) H' P( M' I( u
}
5 o' X( j: I9 M4 C# x)
# V0 c: O, W; {6 L% b' W1 j2 y ?- j; c: `$ G
epochs <- 500
/ j; V8 V& y$ C. r& Y+ @# o
- k8 b ~2 H! J# b8 d8 `' d& I1 |# Fit the model and store training stats
. m# K* g% g# j/ O9 a, h( N- {history <- model %>% fit(
/ |3 Y% I2 X" f* O* T C* M train_data," k( ^/ h l1 Z0 B; P( U; g
train_labels,
" ~7 [" i* B4 f |1 R epochs = epochs,
7 A2 Y. p- @6 x+ q7 N1 J6 Q( Q, l validation_split = 0.2,
9 G1 B7 s }. d- P2 q verbose = 0,0 d" {1 T' I" _$ W: ~* f
callbacks = list(print_dot_callback)
+ N- o$ Q" p) `+ t)# ~; V7 ^3 y8 C: f N2 P
& h1 k4 p" d( K. O: e2 i
library(ggplot2)
: F3 D" Q# k: Z; P1 E+ q) j4 ]) l. Y) d. n3 A$ g6 Z, g
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
, N1 A5 R( w8 d, h, J4 \! S coord_cartesian(ylim = c(0, 5))
0 ^$ t& _: w0 {( x5 Z+ O, ~3 k" _& v& A& Y/ J. l
$ ?) R. u8 V) E- w1 x
; _& W8 \! r! b0 D
小结
! l) R2 G$ G$ l2 U5 t1)回归常用的损失函数是均方误差(MSE)。
K: {; A- K" O0 k2)常见的回归指标是平均绝对误差(MAE)。9 q. {+ R7 Z% q; y/ C) h8 T( }% I
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
5 _7 }: @7 ?$ ~8 ^/ A- o: L+ C4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。: G/ m2 L! }& A7 h, {: A+ v' o
9 Z# V6 F. _, J* c- ?
: l9 s5 a' _5 d6 P; i7 J: I8 H% W
I6 C0 S e/ z
|