数学建模社区-数学中国
标题: 预测房价:回归问题——R语言 [打印本页]
作者: 1047521767 时间: 2021-10-29 10:50
标题: 预测房价:回归问题——R语言
预测房价:回归问题——R语言
- m3 t$ {9 v3 a" q3 B+ }在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。. ]( H7 h [& I+ @: ^6 a% v' G
5 _% v/ i$ G$ }+ F8 i
问题描述
4 l4 O* H7 C8 K# u4 s我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
) x# k2 C7 Z8 ~' G: a3 Z本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。- O. H2 t! I. ^2 i0 w2 m' z
数据特征:; ]# \2 U5 C. A8 s: f( @' y
人均犯罪率。. u; |# L0 D' I- J, b' f5 _
占地面积超过25,000平方英尺的住宅用地比例。
" B0 p6 F8 S4 J& N# f* l/ S每个城镇非零售业务的比例。
2 V ? F; W% |% j' J. q0 DCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。% G6 `, ?' E5 D& X
一氧化氮浓度(每千万份)。; q& l7 G+ |. B; ]2 G
每栋住宅的平均房间数。, N" W/ k3 }! S2 [- U' l
1940年以前建造的自住单位比例。
0 w7 ]% M5 I# h* o4 i# f- O4 S到波士顿五个就业中心的加权距离。
2 O0 |6 c) w* k% g径向高速公路的可达性指数。
6 T9 g, p, ]8 A. Q9 ]: T7 W每10,000美元的全额物业税率。
$ |0 y: M5 P+ Q, a( C城镇的学生与教师比例。( N2 C; _2 o" p0 a, P
1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。+ p* @: ^1 O8 D
人口比例较低的百分比。
$ ~/ E# p( R* m: Y& [1 A. Z' o1. 加载波士顿房价数据
5 E! P7 x/ k& D. Xlibrary(keras)
. s$ K9 L2 N. x4 m' p. X9 O. W4 v9 F' ], I
boston_housing <- dataset_boston_housing()
. Z5 ] s0 r+ \0 D- z. w, U1 v+ V+ {% U, [) z% j5 F
c(train_data, train_labels) %<-% boston_housing$train ?8 X. t5 q" C& m2 e! A3 K. a
c(test_data, test_labels) %<-% boston_housing$test
5 A2 r) j3 `8 N" v* @; k
, r; u% a% X( ?! @每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。
2. 准备数据数据标准化
将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
x' Y! E! v* A0 g* I7 e# j. S1 x; K3 C# Test data is *not* used when calculating the mean and std./ x% W$ d+ q' n9 | Y: c" |
+ h# [; h4 Z) Y) z
# Normalize training data7 F9 N( A+ h+ |: }
train_data <- scale(train_data)
( m8 A9 D/ i C# K E, U9 b( H+ d: R3 q4 c5 \0 D6 \4 O
# Use means and standard deviations from training set to normalize test set6 L9 ^# R# {7 v2 s( {' O. `
col_means_train <- attr(train_data, "scaled:center")
7 q( g; l# G5 u; k: z# w/ j$ ccol_stddevs_train <- attr(train_data, "scaled:scale")1 V8 O5 g" [; d8 m" O: C4 u/ S
test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
$ q& b: F: E" x+ _9 z' U( t# P" V1 b; k5 M4 u4 u* j" N& i
3. 构建网络创建模型
5 b# e3 v1 _8 A: w) Q, ubuild_model <- function() {# G0 ]3 R% k: L% l
9 p' {% N. i6 _, d
model <- keras_model_sequential() %>%
! t% ^7 i! r# }( J7 c7 o m layer_dense(units = 64, activation = "relu",
/ A' z/ c" ^7 Z- f, T input_shape = dim(train_data)[2]) %>%
6 J1 U- p$ W$ N layer_dense(units = 64, activation = "relu") %>%0 ~3 N0 K+ F' j/ c8 \' y, L0 e
layer_dense(units = 1), N! R8 ^9 X _
0 S* P/ J& S0 n7 H4 ~& \/ f o9 w model %>% compile(
. ~' L' E9 G: r) a( m3 t loss = "mse"," R2 M- [& E4 z8 e- @4 f( q
optimizer = optimizer_rmsprop(),
. j [0 ~' B+ v5 \3 A8 G$ q$ W metrics = list("mean_absolute_error")+ i: F- ?, f# T, f" `* Y+ E6 J. I
)# v% _: Y: ]1 t8 w
0 q7 B4 G! w% D! {/ I) c, ~& {; u1 j
model
9 v. s6 t+ N" ]9 m6 ~! c! t# a}" T' u* Q" y5 [- C! C& V" H
) _& `# }: \( c
model <- build_model()
- q# M: N- h( X# Umodel %>% summary()) y1 i3 y. P: K- i3 l: m1 b
2 [3 G& b" e5 I9 |% r0 U网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。
4. 训练模型& J& r" N( P: z2 N4 d4 w7 Z. q
# Display training progress by printing a single dot for each completed epoch.
2 f5 J0 f% y( j( wprint_dot_callback <- callback_lambda(
; c2 S, O8 z0 U3 T- | on_epoch_end = function(epoch, logs) {
# P" h( i) L! E if (epoch %% 80 == 0) cat("\n")
/ w, }# ~0 D; B cat(".")
- A2 h: l9 g8 {- n }
- _3 x( J# G" W3 o7 P)
3 h" j1 J2 P2 j2 @0 q# K. G: t3 ]* q. u. `" q' y
epochs <- 500+ v: q$ C, j0 Q2 d; n2 R& {) i! x
0 |0 F' @' V( l v9 S: B
# Fit the model and store training stats
) h) F. @" N( I) O. N, yhistory <- model %>% fit(
% E2 p) `) K1 x Y train_data,0 T* H: U/ x! x( e _
train_labels,
4 [0 f! [ t, v4 { epochs = epochs,* ], G T! ^) \
validation_split = 0.2,
0 B5 |6 P* i/ A* z- m verbose = 0,
0 O$ o- M3 ~8 R8 @: `& A6 L- T callbacks = list(print_dot_callback)
0 V3 H- W" M9 W7 u8 o)
; j* w, D3 b! C& [' T
' `3 Q, t# |* ~library(ggplot2) E q$ r0 B1 s$ q. v6 @! o
. B' z& c* u- N( }
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +' D* I9 n& e$ T a* E9 c- u$ X
coord_cartesian(ylim = c(0, 5))
) p" `" z2 o+ q7 v3 I/ j5 U
9 S$ G9 u# y* v5 j: m2 ?2 ^: M- w$ e8 D
$ j5 Y! p7 ~* d) A
2 c) N! }4 o L6 z" I& s小结
; m) t# g+ o# k$ Y# k1)回归常用的损失函数是均方误差(MSE)。% e6 j" W4 Q0 _4 B5 x4 P
2)常见的回归指标是平均绝对误差(MAE)。8 |" ~6 k, p. T; s, i7 P& S
3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。3 T8 U* \' P/ A
4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。6 S+ d8 O2 w+ X0 i0 M- i( L7 i3 d
) q' c' |/ [1 U7 i) |0 j8 n% j( Z1 y- @
/ f0 F9 Y0 M$ E9 L) }% J( b
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |