预测房价:回归问题——R语言: P3 x, n% L% E" A* K
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。$ J* ?: k. L$ O, l4 S5 j+ U
+ W& u8 i3 O# z8 n
问题描述
/ s+ W' r3 j# I' F: G- r; ?我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
0 H! @. K O. z% o6 |! N1 q本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
v6 K) A2 ]/ Q. Z数据特征:
$ @1 A3 M' {5 w; P' z$ C人均犯罪率。
/ }. J2 _) `2 v5 A$ {7 X占地面积超过25,000平方英尺的住宅用地比例。
4 h. E) Y) b: f9 M. K% q$ ~每个城镇非零售业务的比例。- G; o9 ^+ H1 B) V. n2 X( X8 E
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。" U& _+ w' d2 B4 U) I
一氧化氮浓度(每千万份)。
5 X8 z6 F+ I [* B每栋住宅的平均房间数。
: N& o, ] d5 s1940年以前建造的自住单位比例。
' F# f+ {( c2 O8 N+ f4 {2 o到波士顿五个就业中心的加权距离。0 R/ a8 z2 G* j+ {$ L0 E
径向高速公路的可达性指数。; `4 ]' v- V* r I% c4 j' k9 u
每10,000美元的全额物业税率。
. A. l1 }- v, N. E2 B3 A城镇的学生与教师比例。: Z; S( `( f' M' \) h9 V4 @
1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
: h9 M& O' l1 d2 C3 R; Z7 A人口比例较低的百分比。
3 d y9 T1 c3 \6 V. o% X9 N1. 加载波士顿房价数据
, ]% w- j+ F- [+ L6 \% Elibrary(keras)
9 {5 M# p( k8 C! q+ f+ q7 P* \* k9 k# c: ]; |
boston_housing <- dataset_boston_housing()& J; W. _! \4 C/ I7 c& J4 N
7 I$ P! W; d3 a8 w* _
c(train_data, train_labels) %<-% boston_housing$train! {. n! q" ?0 o2 B
c(test_data, test_labels) %<-% boston_housing$test
8 M( F* e; N. J$ r8 w
1 r4 y3 e2 u$ `' x+ {6 b每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。 2. 准备数据数据标准化 将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。 {5 c+ |4 ^6 q
# Test data is *not* used when calculating the mean and std.8 X7 m' G2 s8 T3 X$ s2 ~5 }
3 Z- S- E; m: {9 s# Normalize training data) p( ^. D. N4 w* H1 `
train_data <- scale(train_data)
( S6 {& |# y1 d# R: ?
, l& P! K) @, g- q' P# Use means and standard deviations from training set to normalize test set8 h2 O" B5 D( o. e" @
col_means_train <- attr(train_data, "scaled:center") M# G C6 @0 o8 B9 l
col_stddevs_train <- attr(train_data, "scaled:scale")6 o+ @* R2 Q% u; u& Z/ X
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)* c$ y) H2 V- L% B4 T# A* |* T
6 {# _! F/ h4 T( f d( d* E: \
3. 构建网络创建模型 4 H9 V; T7 p# E- ]5 A
build_model <- function() {& e* {/ Q+ G9 T9 C
: M1 R. \$ b: F# } model <- keras_model_sequential() %>%
2 a* }! Z/ i% i6 S& a! @# U layer_dense(units = 64, activation = "relu",
% u. {( V2 I3 y0 R! Q! h8 a) ?: n input_shape = dim(train_data)[2]) %>%* q! s5 H8 @% l- m {
layer_dense(units = 64, activation = "relu") %>%
- Z* p1 X/ G$ q/ w7 S' M layer_dense(units = 1)
5 B6 g: e7 j% x! C* d% H0 }: j. \6 ]. P+ R- t3 q
model %>% compile(
7 A+ r: y5 U7 B6 c; ] loss = "mse",
1 R l/ ^* v" p$ c* ~# D; _ optimizer = optimizer_rmsprop(),
! X$ K! ?, B8 ?. _) s+ ]2 O7 h metrics = list("mean_absolute_error")3 I3 K2 s8 Z' T) F9 N# G
)
# L Q6 P" _& R/ D& r# |7 d
5 g. \ h$ |% g model, P7 z- V) T& [ ^. E4 i
}) Z% M; l& H" S2 U. b
6 n" z7 ^3 ~8 K3 S8 Wmodel <- build_model() j& T! {6 H M% _' ^
model %>% summary()
# V6 F7 H$ X, `+ l( G5 m/ o( W& _; o- R- L- @) M
网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。 4. 训练模型
3 I9 O4 t4 r4 c* V g6 [# Display training progress by printing a single dot for each completed epoch.- n8 }9 t( j3 {
print_dot_callback <- callback_lambda(! y) p8 T1 G" ~) \
on_epoch_end = function(epoch, logs) {0 N/ A# |9 A9 Z4 s. \! a6 B
if (epoch %% 80 == 0) cat("\n")1 c- j) y n* ]) b. u7 c
cat("."); ]) r7 ~, X" {
}
8 y! Q# z$ G6 `( B0 ?. \' y, P)
' P* h* I; Z8 O7 L, w# k6 g% Q1 O6 ~9 ?- m! R( I
epochs <- 500
( r5 U Q( q& f' r6 m; ^ I4 W
/ |% B0 |0 W) r. e. M/ T" j2 K1 \! D# Fit the model and store training stats
! _" p' X3 C j* z' [( Q2 ahistory <- model %>% fit(5 i7 a* B: u4 g+ \, f& F3 V+ ]9 `/ O
train_data,
$ ^5 p# H) }5 j train_labels,
. u. m" y7 k# A% l4 p: d6 V" L; x epochs = epochs,
2 Z. Q, e8 ?. c6 H8 `; \6 q7 X5 y validation_split = 0.2,
4 ]1 ?# a2 y) Y' Y4 w" P o verbose = 0,
- @# `: V" [7 t8 X: H( M+ S callbacks = list(print_dot_callback)
7 c6 w7 ~4 g* `6 Q, d9 S! ^/ K)
0 @3 o9 W2 K# C% w. } r
3 W) }: L; f0 ]: d0 W9 ulibrary(ggplot2)
2 i# P5 g7 M- P. s* W) j" l5 ?( m. v K: y
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
. E( k! g B" r7 R/ g. M coord_cartesian(ylim = c(0, 5))
4 Y) t7 M6 J9 y0 w l" r3 `) u
5 Q! o3 N$ v ~, f) o * f1 N- K. v6 {5 g; x5 h- p
" Z4 R& V$ F9 t9 b* o
小结
6 X* S7 `+ Q4 y9 T% F1)回归常用的损失函数是均方误差(MSE)。+ K0 X- M4 F! k; E( z* o" x5 T
2)常见的回归指标是平均绝对误差(MAE)。
% j/ i) N( c5 J7 a3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
* N( `% {- y4 x) B: G7 T+ q. {4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。% p" `7 }0 d F" u
" b0 V; k6 D7 o" W/ U
0 I+ ~" j1 c$ j8 z5 G
5 Z8 m/ W& e* P9 w |