QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言
    2 G; `! {; p' ^在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。6 {) Y0 e! x* H* n' `+ w2 d# j

    & N3 u  B6 o, U: a4 C问题描述% T! m( N* g1 B) i1 F4 [
    我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。/ R1 N. c* `" u& M, P' k. }+ c( Y
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    5 G8 \# u5 b9 O6 v5 x! A数据特征:: f3 P  R  V  U* z9 y
    人均犯罪率。0 O) z( D7 M) {! }( x" t2 k
    占地面积超过25,000平方英尺的住宅用地比例。. f1 Z' x# [; `* {# g( i5 O$ f
    每个城镇非零售业务的比例。7 v# |- d8 o, v" w, ?: r
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。2 C" N: H9 k- g2 D( C% e
    一氧化氮浓度(每千万份)。- a" ^7 R- a2 m( q% r# g& V/ N- a
    每栋住宅的平均房间数。% n/ }. ]) ^7 ~; x
    1940年以前建造的自住单位比例。
    ' X9 @* Q7 d" Q/ h8 s. |0 w; ?7 }到波士顿五个就业中心的加权距离。
    ( V! I  t4 m9 j! Y2 Q( a& e径向高速公路的可达性指数。9 w; L# i& y. i% d
    每10,000美元的全额物业税率。
    5 ~# P3 D8 t( Q8 ^$ Q/ a城镇的学生与教师比例。
    5 z0 G9 j/ b( c: d" q  V! h8 C: H1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。: Z$ B) G: o9 h" Q1 n( C
    人口比例较低的百分比。
    0 ^: u$ P- [/ ]" P% N( h) \1. 加载波士顿房价数据, K/ @0 a' c( W" U. ?9 @
    library(keras)
    ' V1 P5 }; I2 w1 L9 \4 ?! Y- R2 ^$ {
    boston_housing <- dataset_boston_housing()7 j  B& T# f+ g/ k

    0 C$ T( I2 P$ A  V" I. Pc(train_data, train_labels) %<-% boston_housing$train% J) Y) ^% V0 ^. R( U2 Y# ^
    c(test_data, test_labels) %<-% boston_housing$test1 T/ S, [+ O: U0 P2 j, w2 n
    0 R8 l, w* R# |

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

    2. 准备数据

    数据标准化

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

      G0 m6 \  ]2 o" ^
    # Test data is *not* used when calculating the mean and std.* D' d0 L& {% N
    6 L' k9 L/ k3 Y1 I) o3 U# V
    # Normalize training data
    6 k! a. Q8 F2 w0 }train_data <- scale(train_data)
    % Q, C- ~& N/ Z2 d2 z* _& h* C7 T$ y1 U5 W% h6 v
    # Use means and standard deviations from training set to normalize test set
    ' C* k  A) R6 s4 lcol_means_train <- attr(train_data, "scaled:center")
    * R( M- Q3 x; p, ]col_stddevs_train <- attr(train_data, "scaled:scale"): c: U! `/ G, `2 g/ h/ y
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)' L" x/ c1 I" d
    ) J1 N( q; i8 M" ^2 ^5 g1 S
    3. 构建网络

    创建模型

    $ w; q+ J* A1 e0 ?( f
    build_model <- function() {9 s1 D; R& D6 o5 P

    % z- C/ H; u, p3 D- {. K% F. z  model <- keras_model_sequential() %>%
    # P' ~9 \9 C' n$ X. O    layer_dense(units = 64, activation = "relu",: G. z! _& D( f7 a+ ~4 u
                    input_shape = dim(train_data)[2]) %>%. f2 R; J# F( A$ o( J7 j9 \. {; N
        layer_dense(units = 64, activation = "relu") %>%
    ! Y/ E, r! y5 O4 U    layer_dense(units = 1)
    1 T. C& u3 v5 |1 j( Z: K0 q' g1 G4 j
    3 I" k2 Q( k$ R' o' D  model %>% compile(
    . t: f1 i& g# z    loss = "mse",4 F, T5 U) J. d/ e( D5 ]
        optimizer = optimizer_rmsprop(),
    ) S" Q' J% j. A7 T( z" V4 p) u    metrics = list("mean_absolute_error")% w; K% v) v4 G$ P; }( K
      )
    * \  p, H8 y7 K% Y( `' q
      k5 M& a1 n) f$ U* G% T! s+ ]  model
    6 ~# F: [2 R) {1 ]}  j" k# d; E3 b

    6 [/ k0 E! B; Gmodel <- build_model()- [4 l; m5 O5 `% D. x0 w" I
    model %>% summary()
    ) P! p1 a! H& r* @; O$ P& K, ^3 F5 l- S7 p5 }

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

    4. 训练模型& H; W/ G! e$ W7 a  _" |* u9 M
    # Display training progress by printing a single dot for each completed epoch.# V0 D' Z2 {* |! C  S( O
    print_dot_callback <- callback_lambda(
    - t7 W- L; v3 A& V' [' }! n* ?4 }  on_epoch_end = function(epoch, logs) {
    4 P, Y4 M) w/ j) C' r  Q' f$ l    if (epoch %% 80 == 0) cat("\n")
    ' o; H) B0 I5 k/ a3 I" W    cat(".")
    ! s: Y6 _9 |4 u& P9 Y8 X. N  }
    4 ]; f' `5 Y4 M9 _& z, d)   
    . O) G+ D! A. o" ?6 i9 b- {
    3 h) A+ P. ^8 Z  `- l- Nepochs <- 500
    , ]4 X/ u3 s& D2 _8 R( ]7 h& n( U, p8 H- ~: _
    # Fit the model and store training stats+ b5 e9 G; M/ Y8 l
    history <- model %>% fit(/ u& m, p8 Y9 Y' z. N+ R
      train_data,7 F" l' D9 }; J, i( t7 t4 C% ?. Y
      train_labels,
    . m6 I6 V1 d  m) J) ], {6 v3 e  epochs = epochs,
    & H% P7 O/ p" y# c7 s  validation_split = 0.2,6 r+ G6 H5 I0 |& C9 B" t( f& Y
      verbose = 0,0 r% r' H, ~1 ^5 S
      callbacks = list(print_dot_callback)* S% l; f" d$ L/ w, {" I
    )  m5 Y. P& A( g2 m  e
    ! c& H6 N: ~- u" j5 p
    library(ggplot2)
    9 a6 f* _8 I0 G, M! ]
    ; V9 U: v% I/ l8 O: g: Q; _0 xplot(history, metrics = "mean_absolute_error", smooth = FALSE) +* g( T5 ?; D7 a  V5 z+ x
      coord_cartesian(ylim = c(0, 5)); x' p  i' D7 W  f: Q% `7 I
    ' {+ ], d+ E2 L; p- e: Y3 `( X

    1 H- K" M! y8 e, w. G6 D0 W$ w) }* ?2 |. Q
    小结  Z* d4 ]+ E' S0 @
    1)回归常用的损失函数是均方误差(MSE)。3 p, M- N6 e- M& {5 i
    2)常见的回归指标是平均绝对误差(MAE)。
    ; n1 R& L; Y% P" |3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。2 W: S& m2 w1 m( ~1 F" v
    4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。: ]3 m/ b7 |+ ]9 y
      s6 O+ L! N/ a" G  f
    1 {( [& G5 ]) o$ r
    + K9 ~: i# p9 Z# d. |  j
    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, 2026-6-24 21:12 , Processed in 0.465491 second(s), 50 queries .

    回顶部