QQ登录

只需要一步,快速开始

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

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言) [' U9 `! o1 h/ q
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    % L7 Z& r3 }4 r+ G; Q/ s- z/ p7 `, T9 {+ V
    问题描述
    $ o4 [  u3 q. i1 n8 k8 l我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    ) Y. s5 |* \- e3 ]' n本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    2 o1 c5 s9 Y( O* y" _数据特征:
    , H8 n  N! s. [  F2 p6 P人均犯罪率。
    ) e. f" H/ l: B3 k$ x占地面积超过25,000平方英尺的住宅用地比例。
    ) N1 N. p+ `1 Q& B每个城镇非零售业务的比例。" w; b- x! {+ v/ W9 H3 ?' l# T
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
    9 Z; j' z  Q% l6 v9 n5 @0 V一氧化氮浓度(每千万份)。# \, }6 ^% Q4 c& l0 A7 C5 ^
    每栋住宅的平均房间数。
    6 e9 K2 ~2 ]; a1940年以前建造的自住单位比例。/ H8 o! d' \2 Z8 W3 I( W
    到波士顿五个就业中心的加权距离。
    , v8 s6 z/ S) h. b6 z2 m径向高速公路的可达性指数。
    1 l+ I0 D. A0 `, p& [, J/ f- Z" Z$ |每10,000美元的全额物业税率。
    - E( s9 x8 ?- V3 ?城镇的学生与教师比例。
    8 v3 t# K/ f  N! U8 a# c1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    & l, }$ H- b4 T: Q, X( C人口比例较低的百分比。
    $ G0 n' b5 a& M& P1. 加载波士顿房价数据
    - u% t+ B2 F& Y9 W; X" @library(keras)% o* A+ ^+ q/ h4 {! y& c5 i6 c3 S

    5 n9 u; ^- u2 v( ~. Q  Q/ d0 Pboston_housing <- dataset_boston_housing()0 z- _" E* W! P! [

    3 S: o" E' C' B% W' F0 x5 }c(train_data, train_labels) %<-% boston_housing$train$ O8 h+ _5 C/ ~! n, x9 j( ^  c
    c(test_data, test_labels) %<-% boston_housing$test/ y7 J3 d+ ]! Z  A
    ( ]: A" b9 g, {% h/ |9 q4 @

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

    2. 准备数据

    数据标准化

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


    + j5 t% @0 U- b) Q9 ?9 E2 C% [# Test data is *not* used when calculating the mean and std.. @: ^: G0 Y9 K6 g1 h
    / K0 D7 F. X# L$ W- S& x
    # Normalize training data- q/ }! {; H( }4 W% a) j* E% E
    train_data <- scale(train_data) 5 t! D8 h" \9 j9 g/ q2 b. N2 ^$ H; O
    0 Q& b: j0 \1 p
    # Use means and standard deviations from training set to normalize test set
    / L# R2 c5 _6 Dcol_means_train <- attr(train_data, "scaled:center")
    & D- y" q' A3 A$ D6 e* Y3 |col_stddevs_train <- attr(train_data, "scaled:scale"), S' X, n0 V3 w/ x& G6 E
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    3 X; E# R5 F) _+ B
    0 D6 ~. {! n# L; J8 i- @0 b, ~3. 构建网络

    创建模型

    $ i4 @1 J$ V* N0 i1 P8 _2 P
    build_model <- function() {+ k3 j9 ~1 x! Y$ u

      B* E- y6 j3 p# y  model <- keras_model_sequential() %>%
    6 L: I3 \3 @, f# _+ A+ J( v0 h+ m    layer_dense(units = 64, activation = "relu",
    ' r4 |/ u# j$ B  K6 K. m9 n  s                input_shape = dim(train_data)[2]) %>%; U5 a9 ]5 j, h6 U! }6 `* w
        layer_dense(units = 64, activation = "relu") %>%
    & p, P7 U& J/ c0 V$ e/ [9 J0 q    layer_dense(units = 1)& ~: i, ?- r" l' E3 _+ i2 N) Y
    + x: X, |7 Z# ~" J( z
      model %>% compile(: }9 ?- k* D' f4 D1 m2 R* Y
        loss = "mse",: m5 E: I8 V/ W# P$ {
        optimizer = optimizer_rmsprop(),3 }% y7 S9 Z9 x% C7 y  U5 Q
        metrics = list("mean_absolute_error")
    ' e2 i8 E2 r% K  p) s& u  )
    9 Z9 ?  }# P) \! ?. u2 g, D# k: p3 x$ R. r' _: l( W
      model
    # c' ~. p* i+ t6 u}- n" p* E3 A+ @$ R0 D
    ' N3 ~$ U6 C6 ]0 B, J2 K, A
    model <- build_model()
    0 H5 e' b# T$ mmodel %>% summary()
    # f. ]& Q+ q7 k' P% S3 U9 ?  U+ `' w' y1 C

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

    4. 训练模型
    / C) m# c7 v" T' r% G/ ]; Z$ D# Display training progress by printing a single dot for each completed epoch.; G* i8 z, u7 w$ W
    print_dot_callback <- callback_lambda(. t- S* Y8 P; e- w9 v( {5 ~# o8 W
      on_epoch_end = function(epoch, logs) {
    / N" s. Z0 e% O8 S0 m0 f    if (epoch %% 80 == 0) cat("\n")* J" W3 f* W' P) C# K' D5 t3 [
        cat(".")2 |# |: [  d# v' o" V4 l6 r
      }. |0 J% ?- i! E! _
    )    ; w) V1 x5 N. y1 x  w

    . v. V( T2 x& S; M9 K' M# x0 l3 bepochs <- 5004 N/ @* d4 t; w0 v( F8 q0 Q

    ' N; x% E5 t* j* q" ~# Fit the model and store training stats2 U; k, q9 M$ c; _0 m( }
    history <- model %>% fit(! |, e) u+ ^/ G+ ~5 T
      train_data,! N7 F0 J8 J7 {+ e; E/ ?4 m4 Q
      train_labels,
    - Z. Y$ O% a- w) ?  epochs = epochs,
    ) ]% _; x; e" u/ L1 n  validation_split = 0.2,
    - k: k- Z, W& ~$ ?! W6 H) \& Z) ?5 Y( S  verbose = 0,& W9 P% x* T$ E+ {5 v
      callbacks = list(print_dot_callback), ^+ J: j# {2 J9 ?) g
    )! p- V. r* ?5 m

    - V; r8 Y/ ~# |6 h4 H# h8 x0 m  Blibrary(ggplot2)  d5 a6 d& {) d4 u( y7 n

    $ z) _6 h# {! u7 B) xplot(history, metrics = "mean_absolute_error", smooth = FALSE) +" a" `* a& A/ e( P+ c. w
      coord_cartesian(ylim = c(0, 5))$ Z- @  m3 \* O! ^
    1 s& h- x: n: ~
    + B0 t7 @' F. F" z

    + B0 H5 e0 R' B: a; ]( a  s8 b# H小结
    0 K' I9 x; K6 E1)回归常用的损失函数是均方误差(MSE)。
    3 U, d2 ]- i3 I& E% Z2)常见的回归指标是平均绝对误差(MAE)。2 y: m: B0 D( D  p( X$ Y
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    6 K. U  Z* E9 ~2 h9 N. K4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    7 D1 e+ y0 T/ [* j5 a3 i' l
    1 u" @  y) h! D3 U* `3 {# Q9 S6 C2 _: l
    , z+ A- G7 s: ?3 h+ Q! e$ T! F% w
    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, 2024-4-27 02:09 , Processed in 0.281998 second(s), 50 queries .

    回顶部