QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3489|回复: 0
打印 上一主题 下一主题

预测房价:回归问题——R语言

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言
    0 k$ x: i6 _9 l. L' V在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    $ K3 O6 I& E; n8 }! r& G/ N/ m6 @, m& ?! f# ^" j" t5 q
    问题描述
    2 h; Z; l& \3 ~: H/ I& I) l我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    $ L& x* i  ~- i* X# }本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    $ H, n1 p& |; C* p% l5 k# M* U数据特征:# ?3 @& H' c: I3 f$ ^
    人均犯罪率。  h" T8 h$ ?6 w( o# R" Z
    占地面积超过25,000平方英尺的住宅用地比例。" V$ i& \6 _. p& S
    每个城镇非零售业务的比例。1 B" ^8 l' ?2 e9 B! R: ?8 x
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
    9 k% u% p7 \% \. U+ E' o+ J; N  E一氧化氮浓度(每千万份)。0 O, H/ c  J( ]. _3 |
    每栋住宅的平均房间数。: [* T- N7 V0 O3 W
    1940年以前建造的自住单位比例。- w5 p5 r& Y# ?4 W6 k. m
    到波士顿五个就业中心的加权距离。; ~' p/ A+ }/ y& h0 Z" X# Z
    径向高速公路的可达性指数。
    % u! i: r0 p8 e7 e8 e+ ?每10,000美元的全额物业税率。4 ^- Y: Y- w1 e3 k; A( a* K
    城镇的学生与教师比例。
    1 t3 `: H7 p1 t1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    + O; T4 v- K- M! i人口比例较低的百分比。7 Q. a- R. l& |5 U
    1. 加载波士顿房价数据
    * P! X/ p$ z2 H: klibrary(keras)
    ( n: y# a+ P" \; h* k9 g) v2 z8 x* r/ o
    boston_housing <- dataset_boston_housing()
    : H$ W* ~- A1 Q* w1 S
    8 o# ~2 F0 ]! p% g* `c(train_data, train_labels) %<-% boston_housing$train
    1 u# `- z; a$ _. @$ j; f9 lc(test_data, test_labels) %<-% boston_housing$test
    + W: ?5 i2 X4 P) K# `; m2 {
    ! ]+ v! i1 w, d( z- h

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

    2. 准备数据

    数据标准化

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


    ( g/ ]# p: L/ h5 F# Test data is *not* used when calculating the mean and std.* a4 _( X7 i% B  n& n9 o( v# l1 [: P

    / K2 ^3 m9 e0 |6 d) |# Normalize training data( R$ h! W+ `' n- Q: {
    train_data <- scale(train_data)
    ( j+ o( {9 j3 m& {. l* E9 A! m$ y( \: |- o5 f
    # Use means and standard deviations from training set to normalize test set
    1 m! y4 }3 z5 J% P  ^2 lcol_means_train <- attr(train_data, "scaled:center")
    $ F: n+ v3 \1 ~/ }3 Q7 \7 Z; mcol_stddevs_train <- attr(train_data, "scaled:scale")
    * k- A' V. _+ ktest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    . n% N* J+ ]1 y6 \- ]* i0 W
    9 [. F, u9 r- T! _6 k1 a, j3. 构建网络

    创建模型


    5 u. F! I9 W- N3 G/ `2 Wbuild_model <- function() {  R4 L! c  c  ^" x
    2 f, q& q, K/ D6 m3 C8 w8 v. U2 ~# R& @
      model <- keras_model_sequential() %>%- l/ _5 h3 f0 a: Z+ m" {
        layer_dense(units = 64, activation = "relu",
    - u  n, ~6 f' r0 B3 g( W$ j* m4 F                input_shape = dim(train_data)[2]) %>%  Z& f: |* R" o9 h' ~
        layer_dense(units = 64, activation = "relu") %>%. ^2 b& A) n1 j" r4 q
        layer_dense(units = 1)$ W3 r: C* w* Y2 n
    " l9 r) h* T. K9 I; ]$ b  D+ i
      model %>% compile(9 u4 o4 H0 A# @2 e/ |
        loss = "mse",
    3 s8 d  `5 s/ C- w3 n    optimizer = optimizer_rmsprop(),
    & ^, F+ j. {  d8 P$ ?    metrics = list("mean_absolute_error")' K/ p, V, c  k6 T8 k) C
      )
    * s4 z+ `% Q3 C3 w& `$ s, T0 {. [+ r) \" e2 I4 y' w! D7 |% \! g
      model% L5 ^; r7 R, W
    }
    0 S* |/ a' h, E9 h( @! `& r
    " D+ g! Z6 u7 O1 b8 h4 A: D9 E9 j$ n3 Jmodel <- build_model()& `" M' ~( l* u- S8 @
    model %>% summary()# l8 z, G* P5 V3 l

    . v4 M  ]+ a; y! l, D/ E6 h

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

    4. 训练模型& D1 x) G1 z( y. I3 e& r
    # Display training progress by printing a single dot for each completed epoch.
    ; W- k6 w" O) t+ x/ ^7 a- y& @print_dot_callback <- callback_lambda(' a; s+ S, J. q! x
      on_epoch_end = function(epoch, logs) {
    * Z/ E8 J1 s* g" N. Z8 _+ t+ G    if (epoch %% 80 == 0) cat("\n")4 V0 `: d7 o2 \+ E
        cat(".")
    $ g# _4 F  K2 T/ E! M' }% L  }7 ^0 y" T. w8 I6 w& `
    )   
    % u8 D! ~, _) u0 Q8 Y7 b. \3 e. ?" D3 l0 @& p
    epochs <- 5004 T8 G: _, _& D9 m- N
    . I6 G+ T. n- {# f- N* {. u9 E. Y2 i! V
    # Fit the model and store training stats& V: h4 e* o: k2 N( F0 h
    history <- model %>% fit(6 Z) R/ J+ A: \" L) N, u% U2 p
      train_data,/ E$ {3 n7 G7 i& z+ B  M
      train_labels,
    2 ]; t  _* H- L3 B( p# e" b  epochs = epochs,6 H6 h; S, m" ^2 Z+ t
      validation_split = 0.2,
    ) P1 P% z% W. W* s% b: ^6 q  verbose = 0,/ B! j1 x0 C2 h. o1 T, ]
      callbacks = list(print_dot_callback)  O. o/ v, L. P& b8 B# A1 ^
    )
    1 g* H$ _% q2 c, O! x) O+ A, I5 q3 J, D
    library(ggplot2)
    1 A3 C3 I  N( V6 z- E1 \  c9 ~8 m( M6 r$ }" J' l
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    & d1 z6 x" r5 i9 g  coord_cartesian(ylim = c(0, 5))% B$ x9 m$ m, G0 ~% V

    $ x5 D" a) a: D. ~. A  t* L8 {1 I- {$ H
    ' d! K! y& f& T+ q6 ]$ ]. R0 f, G
    小结; U# J  b# M- V% G. _3 T0 B: V2 z1 f$ M' V
    1)回归常用的损失函数是均方误差(MSE)。
    + R- V" w( p* p* p/ c2 J2)常见的回归指标是平均绝对误差(MAE)。
    9 |* s. f. T2 n9 ]: y! T  e6 V% G3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    7 x$ W9 b& a7 j" d+ p: v8 }( F4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    : a8 S* k8 g% Y$ G  p' d) m# |
    9 ?( C1 [* p3 v5 r# |: m$ Z4 m- Q: B2 j9 g* R% W* B6 U9 U% [. u

    ; K3 M' [" I2 o4 z
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-7-10 00:50 , Processed in 0.388853 second(s), 50 queries .

    回顶部