数学建模社区-数学中国

标题: 预测房价:回归问题——R语言 [打印本页]

作者: 1047521767    时间: 2021-10-29 10:50
标题: 预测房价:回归问题——R语言
预测房价:回归问题——R语言; Y( G/ x/ n+ H; y2 x2 r* N
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。- y& C' i( o5 A% n' \9 L8 Q

) [$ l5 ^6 ?9 i& ^$ ^6 O) m问题描述; ?. Q: \6 d5 z  v7 A$ U, x. X- n
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
9 P  i( L: I) J$ q本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
* _7 p, b& U4 o- T  v( d数据特征:
2 U" q! E0 v* Y6 }+ C$ C. p  F人均犯罪率。
$ A6 e6 c# D$ _8 @+ X占地面积超过25,000平方英尺的住宅用地比例。5 b$ l' u  D& g( F' o
每个城镇非零售业务的比例。1 Y2 B! i# E' L. ]2 d" P
Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。3 f( V* p% b* }+ t3 Z$ X
一氧化氮浓度(每千万份)。
% Z, h6 V0 z+ F1 l2 b每栋住宅的平均房间数。0 H7 c: k* `* S2 ^$ g" J. z# u7 Q
1940年以前建造的自住单位比例。( R  p$ J; c: N+ b7 |
到波士顿五个就业中心的加权距离。
1 T" B* K$ R, d% f' n. h$ t# [% W径向高速公路的可达性指数。) X+ D/ n; M# z  o8 Y) |
每10,000美元的全额物业税率。
- t& Y+ w, |  ^. R6 R7 g7 Q城镇的学生与教师比例。
' p6 P8 K- n0 N4 U) B4 V" t1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。1 c  U7 d8 P. R! S/ b9 _
人口比例较低的百分比。& @7 T4 E& d: }
1. 加载波士顿房价数据
5 X. i) F; E6 r4 z0 e; |/ q5 }library(keras)/ n1 ]: Z8 W3 T4 y/ @7 }! u' D
% G. U; d* S8 |$ k. a. m* A5 N; ~
boston_housing <- dataset_boston_housing()
( j7 s% B- [' z  b: n+ L* ^$ t) ]/ D) G4 ~" L  s! D7 p5 c
c(train_data, train_labels) %<-% boston_housing$train/ J% b1 E& ]: K, q) p* ~
c(test_data, test_labels) %<-% boston_housing$test& ~1 g" \& G: @7 A
( d9 H' }1 m! D( j. b

每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。

2. 准备数据

数据标准化

将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。


' X& N: I1 l3 r+ z- Q8 W# Test data is *not* used when calculating the mean and std.
4 e- y& c. f2 ^# B+ h
! S+ V4 a9 J4 P8 n/ z# Normalize training data
/ f' k7 Z0 d4 atrain_data <- scale(train_data)
& b( l$ F; p5 r) ]8 W! L' u0 v6 B( k9 s
# Use means and standard deviations from training set to normalize test set) y5 V( h% G2 w, ~- J. P% G' }
col_means_train <- attr(train_data, "scaled:center") 9 Y% B4 ~, o3 H3 J
col_stddevs_train <- attr(train_data, "scaled:scale")
/ C7 b# v5 n' `* Z3 X. r( Ftest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
( {! o; S) O9 a) s3 f9 J& c7 S; [" V, e& J% j
3. 构建网络

创建模型

* ^* }' r" o0 S! M
build_model <- function() {
+ o8 H( Z, E+ k! }' I  c
! Q$ @9 G3 u" b, c  model <- keras_model_sequential() %>%6 B8 P0 `( ?) s! n/ v# b8 T7 V  q: t6 {
    layer_dense(units = 64, activation = "relu",. V) _5 S+ [% c0 _4 b5 ]5 H
                input_shape = dim(train_data)[2]) %>%2 d0 s% Z1 q: S9 b. T" H
    layer_dense(units = 64, activation = "relu") %>%
5 C' O# j; v+ n2 P$ h    layer_dense(units = 1), o: \1 F9 g" o1 F! l' t
9 n! M& i6 {; l0 ~) S1 P& H
  model %>% compile(
; d4 i8 X, ?9 s; F# Q    loss = "mse",0 J0 s/ b- q1 N: C/ _% {
    optimizer = optimizer_rmsprop(),6 u' b+ t5 }& [
    metrics = list("mean_absolute_error")  l2 ^% f, \1 Z9 L6 K+ ?! T
  )
$ ]/ b' r3 H  D. t! M" w# m8 ?6 E
' j5 J) m9 N" g# r7 o& O& J  model
4 N# r8 n4 }8 Y+ I  U5 w) S}
3 o8 Z" r$ W( |! t5 {3 j( I; `3 ]5 \6 E
model <- build_model()
, z5 S: l# i) E8 Z# ]model %>% summary()' D( u, \, L3 w1 `* S

9 o+ z+ e, o! ~+ m) r$ e

网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。

4. 训练模型
! W$ f5 j( V" K& h# Display training progress by printing a single dot for each completed epoch.
' ]8 L3 S8 H0 d4 X: O3 r+ Aprint_dot_callback <- callback_lambda(
- H) E, r5 d6 D8 T: Q. X  on_epoch_end = function(epoch, logs) {: t8 l6 H1 f0 E* V! Y
    if (epoch %% 80 == 0) cat("\n")
! r$ c1 m; r0 {1 l    cat(".")( P! A8 P/ ]6 J4 L* L: S
  }2 i  ^7 h. U, k# d3 F* H
)   
& ^: S/ a* ^* z  p) `4 h- e) N  d8 a
epochs <- 500( \4 u$ o- ]( p) {& O8 O

. n, o6 ]4 q% j3 V# Fit the model and store training stats
  F) b/ f* {* E$ rhistory <- model %>% fit(
% `8 e9 {, l4 V2 f8 w5 x7 h  train_data,
7 V+ C2 ?; {9 y- P  train_labels,
$ m+ i! x. k8 O- h  Z  epochs = epochs,* N$ c  X7 H" O
  validation_split = 0.2,
% l' z) N+ }3 u9 Y  verbose = 0,
' ?5 g. V) W/ t' L+ j  callbacks = list(print_dot_callback)
* t! G% {: `! ]* A' ^+ S3 N4 })+ J8 a+ D% f9 e& F7 J' m4 w! o
6 ?1 d! T0 ^3 n; ~9 }8 B
library(ggplot2)
+ C9 S. I" l( Q/ c2 c
; x8 r1 I( ?5 Zplot(history, metrics = "mean_absolute_error", smooth = FALSE) +
# Y- h& r3 i- N4 x* H  coord_cartesian(ylim = c(0, 5))$ z# |' \% ?& l$ \" }8 @; `
( y: {" M* c( Z$ P9 u( g: P1 V

" [  W( J; g6 O( t9 b/ f, g
% [; {0 g5 H" q# ~小结+ I  g4 Z/ @  W
1)回归常用的损失函数是均方误差(MSE)。% j2 e+ T2 n( g! U* B: b3 J
2)常见的回归指标是平均绝对误差(MAE)。
. P) a+ R0 u5 y6 ^; S7 `6 f& R- [) ]: o3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
* o% v' C* y  g4 n4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
  k. `' E- Z$ W8 B( G2 U
9 \8 j. g: t4 R3 L  [  t
4 p7 Y: f. F  Z4 `# T; h
* N+ y6 A' T: ^+ O( R+ j2 O3 U




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5