QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言
    ( w( h  a) x4 F" H: ^在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。5 E& x. b. J; H) ?( W+ p9 w& @

    8 `8 A* b0 K5 ]8 j4 Z问题描述. G2 P3 ?. K  _, p* R( }. P
    我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    ) V* H2 M3 J# V" a本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    ; [3 T# @. k# M, u  h数据特征:' y  P' J3 r& `
    人均犯罪率。* \5 ?' W! Y  H% a+ L
    占地面积超过25,000平方英尺的住宅用地比例。) n. I& Y% ?, W  V: a
    每个城镇非零售业务的比例。  C$ l% f, ~+ R* I
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
    - ?; J  M& z5 l; P一氧化氮浓度(每千万份)。7 f0 U1 e6 G  U! n+ N+ y0 ~
    每栋住宅的平均房间数。
    & A* D( O0 `  N1 q$ y" {/ z1940年以前建造的自住单位比例。
    " q( g; X4 J+ E- F到波士顿五个就业中心的加权距离。
    2 |2 T& D9 `" ^% x. P) Y6 |径向高速公路的可达性指数。
    ! m3 q0 G. a: B5 z每10,000美元的全额物业税率。9 Y* M% s+ r, ~: \) h
    城镇的学生与教师比例。
    - A3 G$ }. s- h. l1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    . ]& A, v" H; @! T人口比例较低的百分比。/ R7 m6 u* M2 j
    1. 加载波士顿房价数据: r  d; u3 W3 }% l1 G4 r2 l
    library(keras)' m; ?  \* a3 E* B0 H8 h9 }9 l

      D. I$ n( N  b/ d8 w% bboston_housing <- dataset_boston_housing()
    . X5 S/ }+ z+ }. H0 b) L4 h# F" [$ [- ^8 t! q" q
    c(train_data, train_labels) %<-% boston_housing$train5 y9 T. \9 f& t: e$ ?0 `8 p
    c(test_data, test_labels) %<-% boston_housing$test
    ( ~. B% H: y0 z9 D( i( z$ ^, E9 ^1 M

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

    2. 准备数据

    数据标准化

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


    2 p% X. ~9 B8 l* z2 K# Test data is *not* used when calculating the mean and std.& B, @. ^: t1 D
    # F1 w6 l5 ^4 x$ C) Y
    # Normalize training data$ x4 T4 e4 J9 o8 I8 B( z
    train_data <- scale(train_data)
    7 i& @/ C5 H* }+ U1 Q/ G, R: Z7 V5 {: a) X& y! c# L3 H
    # Use means and standard deviations from training set to normalize test set! d+ D4 o3 I: b
    col_means_train <- attr(train_data, "scaled:center")
    / B& L4 [) A  o) L& x% N* vcol_stddevs_train <- attr(train_data, "scaled:scale")
    ' W# L' D" _: d$ p7 h# l: n4 Vtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    : Z. ^" G- O& G* Q: \/ }' o
    , k: |0 f% a' v6 }2 w/ A3. 构建网络

    创建模型


    , q" }+ ~- R$ h* ?9 Dbuild_model <- function() {' R7 v4 x. J5 j) A4 `# |% T; e1 r

    4 _& n8 l4 k. n# K  model <- keras_model_sequential() %>%
    ( n- |& k* d: r5 k    layer_dense(units = 64, activation = "relu",- W$ I2 ^8 S* O6 {. p" D
                    input_shape = dim(train_data)[2]) %>%0 @' o+ ]( H: H/ f, j4 u
        layer_dense(units = 64, activation = "relu") %>%% ~9 ]" a7 k! J/ \1 ~0 p
        layer_dense(units = 1)
    / W4 X; Y7 x& y6 V7 \. V# W/ O
    8 m' w5 R0 K) j  B+ d  model %>% compile(
    % n, `) h( L" ^+ `0 ^& R    loss = "mse",
    0 r& @' i8 i% z# g, H    optimizer = optimizer_rmsprop(),! F% ~8 w. [9 s; f( \
        metrics = list("mean_absolute_error")6 M& s5 g$ n0 b' c
      )
    5 t! s: a8 O$ K, z
    & }4 `9 G: M" w  S! y  model
    5 W. s8 e! e5 `; U$ {% k  ?}
    ! D8 a3 R+ @# S. V7 `
    2 f2 i( l  i+ b( i" ^# U( @model <- build_model()
    & u3 S; T$ ~9 l$ Q7 _model %>% summary()
    , l; y* x- |$ I$ K1 n* F" j. d' [. e! R) y; Y) l2 G  W  L0 ]& Q

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

    4. 训练模型  b1 h& x! J* ^' T* [5 `+ [9 E
    # Display training progress by printing a single dot for each completed epoch.
    5 M$ |! B9 J* yprint_dot_callback <- callback_lambda(5 |) u: \# M1 R
      on_epoch_end = function(epoch, logs) {* m# |1 ?0 W) `4 W
        if (epoch %% 80 == 0) cat("\n")2 k, A+ I$ u# y- q: C
        cat(".")6 O, B5 u' q3 y5 b& {1 F) L
      }
    5 t& y5 K4 @% J, ^)   
    - e) X- X, d3 ?% T$ a$ ?# `* M0 b9 r- [  ]7 x/ |7 C* S5 F" r6 {
    epochs <- 500) V4 p" h& V$ U5 U# l. p- p# T
    3 W; S2 X9 x9 @% K% j
    # Fit the model and store training stats. m9 A' F% c( ?! \6 @0 r( e6 J& k- a
    history <- model %>% fit(5 I/ B- f* a( A+ `  T# r- y4 P5 @, G5 s
      train_data,7 `  |) x+ Y+ f6 O" h, t& m
      train_labels,% o+ h7 v6 u% V$ n6 F6 Q
      epochs = epochs,
    & x7 u, L3 W2 B7 g3 g( M9 U7 F  validation_split = 0.2,
    + ~9 J% ]( Z% \& g. d  verbose = 0,0 i, a" W; l, X& H& f
      callbacks = list(print_dot_callback)
    . t8 Z1 \0 }) P" t# \( j( T)0 A7 O7 u' O- I4 e3 {0 M6 O' L
    ) ]) t9 \7 ^- K' e
    library(ggplot2)
    ' j* k# o, y/ R0 `
    - I6 ]  T& c+ k2 c0 S& _plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    / R3 X) q) |1 c, q, w7 \  coord_cartesian(ylim = c(0, 5)): S  k, s1 J7 M, k' d. A2 T
    9 P. Z  U9 K( I- _
    ! q" S" P5 x. d
    ( ?* x4 N+ Q5 w( e6 x0 L
    小结- z  d* n) a+ V6 U1 J
    1)回归常用的损失函数是均方误差(MSE)。
    " K7 X# n  P; e. I2)常见的回归指标是平均绝对误差(MAE)。, I( O7 z% X- q, h) k
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。* O* V! v+ S' R9 p) c1 I. m* L
    4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    % a2 S- ~: S; j. q5 p& p& y9 t( f% z, i$ h1 J4 [7 n
    : d" V, x' Z$ ~1 k
    / `* U) v8 d: b  N
    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-8-24 12:42 , Processed in 0.454815 second(s), 51 queries .

    回顶部