数学建模社区-数学中国
标题: 预测房价:回归问题——R语言 [打印本页]
作者: 1047521767 时间: 2021-10-29 10:50
标题: 预测房价:回归问题——R语言
预测房价:回归问题——R语言2 D3 P" V( D7 X
在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。8 ?: k- V7 Y; e% ^' A) S8 N6 a
# d6 E. z0 R- O+ g, k问题描述+ c) O: Y+ T) F V& s3 r9 G/ ^
我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。- A! ], T$ E) t/ C: D8 K- }( x4 _
本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。7 x+ J: c. s. Y) c$ T
数据特征:! e. i+ B4 ` [. K2 d
人均犯罪率。- z b2 C/ p& Z. k$ C
占地面积超过25,000平方英尺的住宅用地比例。6 w* Z! v. J: _3 s y- h& c; x
每个城镇非零售业务的比例。
% M: Z1 o4 f' S& b0 i- MCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。
. n$ B/ o' v4 T. ^4 j7 n& ]一氧化氮浓度(每千万份)。
+ q* T5 W C5 i* A4 B$ b. H7 A每栋住宅的平均房间数。1 i# j$ {8 C' r5 r( s
1940年以前建造的自住单位比例。
/ {4 d- Y# c3 k% A6 J( h' U到波士顿五个就业中心的加权距离。, S" G! Z; F, K
径向高速公路的可达性指数。
' r1 E1 f7 J" {2 f+ n) |每10,000美元的全额物业税率。
0 T% P. b) N- ~* H5 M4 I城镇的学生与教师比例。
* C" k" a9 H, C* r' d1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。4 G9 D4 O4 l0 s: i( A0 o( }5 Y
人口比例较低的百分比。
( j+ U) c# ^8 {1. 加载波士顿房价数据
9 i- Z( j9 J! F; _2 a- d: r( Ulibrary(keras)0 q3 Z: a0 j' j# b$ M
( t; F* U9 H: ]! u1 y8 B; F( k* X
boston_housing <- dataset_boston_housing()
( a9 S+ D- b. D h/ }9 u; i
7 l" ~. C/ r3 r3 Mc(train_data, train_labels) %<-% boston_housing$train
* o9 C- F5 t8 ^" a) Cc(test_data, test_labels) %<-% boston_housing$test1 ^& E% E4 J) ^) h
& b7 \) i( p# Z3 k7 O每个样本有13个数值特征,目标是房屋价格的中位数,单位千美元。
2. 准备数据数据标准化
将取值范围差异很大的数据输入到神经网络中,这是有问题的。网络可能会自适应这种取值范围不同的数据,但学习肯定变得更加苦难。对于这种数据,普遍采用的最佳实践是对每个特征做标准化。
! w! M1 U7 ~. h9 Y2 L
# Test data is *not* used when calculating the mean and std." q [9 s. b( |+ `
) e, R$ j' @% S0 N( c+ v# Normalize training data1 a' G0 f6 i% \/ N+ Q _
train_data <- scale(train_data)
$ z0 L' p. Z; i
) ?+ I! Z3 r% P5 }+ K+ `: f# Use means and standard deviations from training set to normalize test set
" o& L. r; N' M0 lcol_means_train <- attr(train_data, "scaled:center")
5 Z0 r9 p# h" N; h& hcol_stddevs_train <- attr(train_data, "scaled:scale")
' L' |& U) T5 t$ Xtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
" B1 _! H6 S! u4 {: E/ U/ h3 I/ y+ ~! E% q& C& C
3. 构建网络创建模型
: w% \ H; q3 \. O& Xbuild_model <- function() {
) z, s' ~/ s. h* w4 J* `1 F' C
/ R: {3 [2 ]8 F. t. n% M model <- keras_model_sequential() %>%' e$ y" M3 i2 I& S3 K. l
layer_dense(units = 64, activation = "relu",
. X1 j, A: f; B5 b input_shape = dim(train_data)[2]) %>%2 `$ ^0 l/ c/ m Q
layer_dense(units = 64, activation = "relu") %>%" a U" q5 H; K5 A I
layer_dense(units = 1)
* J. k; q* p; p h ~
& N6 T2 N* W+ `$ \) e$ N7 B model %>% compile($ j0 R' o: F1 f. z' h6 ?) {3 {8 ^
loss = "mse",
2 h: t. f1 C" @& g# Q% E! S N optimizer = optimizer_rmsprop(),
; p8 K. }4 r: u5 r' Y metrics = list("mean_absolute_error")$ }$ Q4 R! V: ^) g
)7 W( o0 r& ]% n/ E
: q1 L& ?! U- f model+ M* W, x- r. {- c9 ~! V1 [& w
}4 o) T; m! H( x- h# `
O/ t& p' K5 ^+ a: Q
model <- build_model()% C$ z7 ~) J( c7 b( c
model %>% summary()( z& E' K: b( g
0 ]. v { ^4 m3 N3 f5 q网络的最后一层只有一个单元,没有激活,是一个线性函数。这是标量回归(标量回归是预测单一连续值得回归)得典型设置。添加激活函数将会限制输出范围。
4. 训练模型
2 i: X2 M- W, G1 F; B# Display training progress by printing a single dot for each completed epoch.
' d; M; p& @3 q& W7 wprint_dot_callback <- callback_lambda(
/ H. l& S! ]/ Y, Q x" d- N+ z4 Q on_epoch_end = function(epoch, logs) {
2 ]2 @5 @! S* q8 V# v$ s( B if (epoch %% 80 == 0) cat("\n")
+ Y' S/ \" b: V( r. Y8 C6 u- { cat(".")! ]# ~1 Y% M/ |2 H' i
}
( Q. Y9 I1 ?9 k& d, x Y: W6 @7 k" l) 1 E- A5 K$ ?8 v; E3 T
4 z* | R! k! C, [( s9 P- z
epochs <- 5008 R m6 q- u3 \/ ^
8 N2 n, o! p7 r6 _) A5 `1 A+ l
# Fit the model and store training stats
* x: v! A4 z1 D7 M9 _3 P. k" M3 Mhistory <- model %>% fit(
' i/ E' O4 U% h5 @ G train_data,
8 O1 d( k' Q0 }9 j: _- d {/ p& R train_labels,
: y1 O P- r) p/ s& o$ ], |% s epochs = epochs,4 F& T" h4 |/ x4 \& _$ D
validation_split = 0.2,: b' f: |! o# _" k; i
verbose = 0,
$ |& v$ l" N) I callbacks = list(print_dot_callback)
1 B1 x* B7 b$ k( w- g# J)* ~4 j6 M- K9 e B
8 _% ]% B& R% N1 Q1 A* U% Llibrary(ggplot2)% y, E3 \7 K$ I# w8 f
9 V! d& ?5 d3 u8 }) P- N6 i3 `$ k
plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
7 K* x1 ]+ {( F7 x5 U2 Q coord_cartesian(ylim = c(0, 5))
; x4 P) b7 W5 H- M4 ?) S3 e" T* ^. W8 h; v

9 A% w, G) }% O
+ G9 y& {$ ]7 q5 r# l, }% m小结
9 a5 C2 r! s' f9 ^1 c& v, A8 W1)回归常用的损失函数是均方误差(MSE)。7 `( H8 l2 W: J; ?" y4 x1 i
2)常见的回归指标是平均绝对误差(MAE)。
1 W f7 A9 z! x' r1 M- z5 ]& J$ H V3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
5 }- k% {" A& V. `% q1 Z& ^4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
6 y/ F' o- F' O$ e& H9 K3 W4 u0 @" F( Z: W: |
+ B9 g: j% u) P# [+ C: W0 m% P# _
' ]% a( _: z; A
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |