QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言7 X, c+ ?& r& l$ T
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    0 R1 ~+ z6 w. @7 P( Q1 `0 z$ {$ _) e
    问题描述$ G4 q* B4 h9 h' S" C8 g# U2 g
    我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。3 a# W3 ?; H7 M+ A' E+ ^
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    * B( B* p# |) V  t% H/ Y  _数据特征:
    & o8 _8 d: V; I人均犯罪率。0 H6 T/ w$ K* c' r8 k% K1 C5 P
    占地面积超过25,000平方英尺的住宅用地比例。
    ' M. L- J( ^  Z每个城镇非零售业务的比例。
    ! r; `5 H% q: y. m! TCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。2 {( h# F) ]3 m4 l. S
    一氧化氮浓度(每千万份)。( ]: o! y7 f8 G$ C
    每栋住宅的平均房间数。
    3 k* x; i' f# \+ x2 q; p' I1940年以前建造的自住单位比例。. J, p; b8 Q3 N2 j7 S# c, d" x
    到波士顿五个就业中心的加权距离。5 C7 F9 k0 h" D0 n% s- T
    径向高速公路的可达性指数。
    8 j) p0 h, U5 G$ q, H' I每10,000美元的全额物业税率。7 O- P& |+ x& U) B! F& _+ ^, m4 X
    城镇的学生与教师比例。
    5 g8 t6 T# O. U- n; {1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。- g+ w; K! V; R2 d: E
    人口比例较低的百分比。
    9 ?: r, ^% o' g1. 加载波士顿房价数据
    & g1 a% [! {; g; i  O% o7 mlibrary(keras)
    # p& J; L* @1 t( Z
    2 ^/ Q6 M' d$ |. O8 Q! e' ?  jboston_housing <- dataset_boston_housing()
    8 [% C5 {& `. G- i. m5 [, R; T" }* K2 Y" x2 _
    c(train_data, train_labels) %<-% boston_housing$train, n7 Q9 b( d5 K0 w  B% z+ [
    c(test_data, test_labels) %<-% boston_housing$test* `: W& O& M2 C& C6 _6 I2 Q8 X

    2 ~8 y8 J2 a6 x) n2 {% q

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

    2. 准备数据

    数据标准化

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


    - d1 F. d7 V" j4 u# @) S- j# Test data is *not* used when calculating the mean and std.
    ) T( \' Y& A( d- D* t
    5 k' ^; T* L5 e. ^# Normalize training data
    , n, z$ U7 V, ~; T% Z+ C+ A1 U; otrain_data <- scale(train_data)
    / p5 q1 t7 k, }, M' v  w+ H# u3 d( J3 |$ G" z2 T' ^
    # Use means and standard deviations from training set to normalize test set9 O- M7 S) _9 C" X" X) F5 K' @
    col_means_train <- attr(train_data, "scaled:center")
    , _  {! i- e+ H* U# |2 B% o6 Y0 O" Ocol_stddevs_train <- attr(train_data, "scaled:scale"). a6 c5 M' S2 L
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train); Z) W$ j1 g; A& A9 C" B+ l

    5 |6 I$ S: a5 }) `) V9 M3. 构建网络

    创建模型


    ! \" |* @0 g! S8 `5 ybuild_model <- function() {% |" A2 l  e( Z6 j
    0 R1 s2 e% y: ?7 U- P
      model <- keras_model_sequential() %>%  [8 X7 n* P* o& A* ~- w* X
        layer_dense(units = 64, activation = "relu",1 F# x6 M* Q7 f6 S& X5 c/ y: M% K
                    input_shape = dim(train_data)[2]) %>%
    : ^1 G$ r$ ]5 H4 L    layer_dense(units = 64, activation = "relu") %>%8 f. F8 j% `: ^
        layer_dense(units = 1)
    , R, V" N* y, E( @. K8 j. Z- e! q( S3 ~* p
      model %>% compile(/ m6 G* q7 F6 ]$ l& N
        loss = "mse",5 j0 i  F* b- A3 T( {
        optimizer = optimizer_rmsprop(),
    8 }5 N+ M2 Y4 g& c! o( S' b" S    metrics = list("mean_absolute_error"). x2 p8 b; `9 s9 r9 ?* J7 a
      )) Y% s7 ~9 A& m4 k* _1 c/ A

    : H9 `, v/ ]) _  model
    & Z: o) e+ Q$ O# ]& u5 v5 {}) x6 g( T! h* Z$ h

    ! Y6 H6 ^4 O! F- `model <- build_model()7 w) b% D9 H# m: \; M
    model %>% summary()
    : v; Y3 a+ J* n- K  `6 \8 Y0 Q* ~7 |4 O3 X: Z' k- Y* B

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

    4. 训练模型& e: j9 n8 N! M  n" m) b) i
    # Display training progress by printing a single dot for each completed epoch.+ {( V: c6 U2 k" F' H
    print_dot_callback <- callback_lambda(. U2 m6 Q! X1 v0 T% q+ K
      on_epoch_end = function(epoch, logs) {
    4 u5 Y5 a' F: f    if (epoch %% 80 == 0) cat("\n")$ i3 H" L& }: W" M
        cat(".")
    ) E% F9 E- f& j4 C8 L- \- n' R  }
    * `- ?7 Z$ x* b" f5 s, ^)   
    ' H8 E% P1 @9 {; g3 a3 Y
    6 C/ T: ]2 \$ }0 Iepochs <- 500' P0 u$ W. t$ g3 k" k

    & p8 C8 {8 x& |& n# Fit the model and store training stats* C- h9 ^6 k! B& F
    history <- model %>% fit(  N" N& [% x) w( u. \# a4 ^( Q
      train_data,
    - ~& S1 P5 ]( p: b' Q9 [$ B  train_labels,
    1 c" r4 I9 d& }  epochs = epochs,
    # Y2 E0 w& {; m$ H: h: @  validation_split = 0.2,! J! ?& w+ y; a
      verbose = 0,
    ' j& l. |/ @. ]0 w/ \5 R" i  callbacks = list(print_dot_callback)
    , d0 m! U) ~5 f)
    0 M3 _  F, h4 J& ~( N/ ^! s5 j4 ~" ^7 v, o. j4 e4 _& c
    library(ggplot2)) `5 U: H( ~0 \# U" a
    1 d4 o- w: X! z& u( {) Q! k! @5 G
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    2 S$ A* K6 U' h. t8 ^  c  coord_cartesian(ylim = c(0, 5))2 D7 N: f" C0 K. q: W6 H
    4 \, ^7 y8 |, t/ V# O6 H& x* w
    / c3 ~+ b8 w- {( s

    & F  ~9 X" v8 ]. q! ^, b小结
    6 v" A) y- P( z) ~4 F1)回归常用的损失函数是均方误差(MSE)。0 z* ?3 l  Y" N8 C, f$ ?
    2)常见的回归指标是平均绝对误差(MAE)。
    0 l+ I: z$ ?  z) E2 U0 w3 V3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    # d$ f* X6 {" \; r/ D+ }4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。5 B0 J3 y9 [3 B4 A7 ?$ |

    5 {5 L5 |) [; v3 _- o0 P+ U/ T& C/ H, X$ j

      ^8 ]8 `# `/ n4 ], C: m
    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-21 07:50 , Processed in 0.453708 second(s), 50 queries .

    回顶部