QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言1 o' Y- M- _0 G6 V2 M
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。( d6 H: _5 p% l6 ~

    ! d$ V* W  h3 O0 n; e问题描述
    : S2 l7 |$ `1 o- J/ P( a# q我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    & u$ ~' |1 q% {! [. s6 k* }" v  n本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    / a8 Y; W7 i" k% W数据特征:
    , N" g" J1 c, x. j8 V人均犯罪率。) r! F7 V0 _0 D
    占地面积超过25,000平方英尺的住宅用地比例。1 N& J+ J2 @& N$ c& f* z
    每个城镇非零售业务的比例。
    1 {/ I/ |8 D5 Q- s& x( W& R1 rCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。8 A' P) p- a5 n) S+ p8 \
    一氧化氮浓度(每千万份)。, X* d8 W9 \( @6 b$ Y% E$ e; s* \
    每栋住宅的平均房间数。6 j- }3 k* |& \; u' m7 _5 T
    1940年以前建造的自住单位比例。4 C( u$ O5 t8 v2 v; D
    到波士顿五个就业中心的加权距离。
    5 n) W: W* q8 d径向高速公路的可达性指数。+ o* W* z3 v9 ]* O
    每10,000美元的全额物业税率。
    # v% K( B8 I/ ~/ R4 H6 L5 f城镇的学生与教师比例。( r4 O7 L5 E; ?$ C
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    # _; J) e6 f4 K人口比例较低的百分比。
    7 m0 c  ?! m# `+ q7 f* |1. 加载波士顿房价数据% E' f3 K4 d! }( H, O4 ^
    library(keras)2 S4 c: E9 I1 p& K2 _  r

    6 T8 |& i# U" Y9 l- v" Dboston_housing <- dataset_boston_housing()3 M7 l* G  }, N4 N& n" G" E

      z6 a% P% Z4 q! A9 t2 x4 V% C8 gc(train_data, train_labels) %<-% boston_housing$train" p* }1 `) F: B4 Z, Q. {
    c(test_data, test_labels) %<-% boston_housing$test
    : d5 M' _* J; W- A. G( \- i! }
    & h' @  n/ O* K4 [" {5 p3 R

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

    2. 准备数据

    数据标准化

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

    ( d1 B; e' p# U1 A6 Y' a
    # Test data is *not* used when calculating the mean and std.
    3 ?) J) t8 `" N# n, z9 ^6 y. x+ a# E, t& f9 T- X+ m. _4 ~
    # Normalize training data6 e6 {8 A+ t" `. [3 Y
    train_data <- scale(train_data) , t$ F7 S5 k0 K* P* `: [
      y; X) o3 j+ _& }+ F: }8 g: J
    # Use means and standard deviations from training set to normalize test set9 j  i6 _8 X5 U7 `/ x' Z/ D
    col_means_train <- attr(train_data, "scaled:center") : F$ C' f% N! k9 n7 F' `9 j$ K1 z
    col_stddevs_train <- attr(train_data, "scaled:scale")
    " G2 r( D# s2 G7 q+ B" dtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)! E0 }; _: h4 M* M: D
    . v7 z0 D6 ~2 @2 K/ `7 I( E7 o9 H
    3. 构建网络

    创建模型


    , |# O, M1 j( E8 h9 q9 E9 qbuild_model <- function() {2 N9 }' [. Y3 [! x4 l, B; z# N
    + s& Y  h% _* P
      model <- keras_model_sequential() %>%, I" Y$ U; i  h" E6 l0 }2 d
        layer_dense(units = 64, activation = "relu",
    $ \8 g" s8 v8 ]0 I                input_shape = dim(train_data)[2]) %>%
      y( h' T! U7 X5 K    layer_dense(units = 64, activation = "relu") %>%
    * A& _7 R0 s7 f: t- ^0 _7 k6 f$ ^) M9 d    layer_dense(units = 1)
    % J( f6 q  r- ]% |% O
    % ~1 o8 q% }6 X7 ]  R  model %>% compile(8 }; |. a5 }" G/ ]& N# [
        loss = "mse",
    6 |. b4 ~7 B+ w    optimizer = optimizer_rmsprop(),+ C7 j" S! g1 K6 L- w% y/ v
        metrics = list("mean_absolute_error")
    # z7 p  L) {; n) D, B1 a' D3 G  )
    % `1 T) h% B7 r5 s+ m
    : Z% H0 h$ U% e5 v4 a  model; ?9 n$ i1 R# t" O3 }+ {. V6 b% d/ t
    }$ D$ J% f# g/ v. z# }

    ; \$ p, \, n, O1 Y: _/ T% }model <- build_model()
    - Y. m5 d7 S1 N7 Y  F+ k! f' Zmodel %>% summary()
    5 E! F5 o9 l: j, @/ _9 T. [# B$ T- Q

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

    4. 训练模型
    . w5 D  T& m8 s& X1 s2 E# Display training progress by printing a single dot for each completed epoch.
    2 P: x- D& J4 h) Z% cprint_dot_callback <- callback_lambda(1 `- K# L# f# d2 t+ n
      on_epoch_end = function(epoch, logs) {. [- r( j* U6 }1 Y2 s- r  j
        if (epoch %% 80 == 0) cat("\n")/ J6 m6 ?! X: N: V
        cat(".")
    ; e- z) y. Q/ O: q  }9 i* B( M, r5 O  @% d& C' ?
    )   
    , A! E$ S1 A* }1 k+ d8 n# S
    ' \) M  Z' `! V  m8 D* Zepochs <- 500+ x) K* z" O. x! o5 d  r

      O+ u6 h  B6 f) i1 ?' U# Fit the model and store training stats
    / S) E4 Q6 D! C" _7 r& Y0 ~history <- model %>% fit(" x6 w% j1 h  I
      train_data,0 B$ L( d" C7 W
      train_labels,, V( I9 D, J) k! {3 Q
      epochs = epochs,
    - V' {2 P, H. p) X4 m  validation_split = 0.2,
    0 N* ]' O7 S. m' {$ |# a- e  verbose = 0,* h  D/ Q9 i* L" e7 Z9 `  R
      callbacks = list(print_dot_callback)& ^) v  q3 x3 K- \5 P, e7 G
    )
    ! h2 G) q( |; h  I+ M2 ], E+ w4 \- F1 Z$ A, X4 ?
    library(ggplot2)
    * u2 E4 t) K/ B1 v  Z" L7 V( i
    7 [4 T$ m/ W/ g, p7 i( r! I0 ^1 Iplot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    . ?, \! a4 D$ J+ {5 O  coord_cartesian(ylim = c(0, 5))+ G# ^! @" Y2 a2 U1 o9 E. {

    ( e: N4 e& H; [
      K. Z: h* G) k( x$ n  E; U+ x
    ( I4 K9 O: Y' @6 O5 u' D* _( T小结
    / j, l! ]3 C  k; i- P. o& |5 L! U1)回归常用的损失函数是均方误差(MSE)。/ d: U* b4 g" i0 Y( \& ^
    2)常见的回归指标是平均绝对误差(MAE)。
    ' {3 }) _' y( {# G! Q# n6 d3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    ) W# f+ x% `7 S2 X) E* ^8 M4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。! A4 C4 v% `# Y) d3 k6 J
    / N$ G* Y# \6 Q" ~' M7 g/ V4 K

    , y  m0 o! U+ x  X! O6 n
    % m5 f: J, X$ ?6 h+ S6 m2 k% P" b
    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-10-23 03:53 , Processed in 0.447886 second(s), 50 queries .

    回顶部