QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言3 i9 ^7 f* y; F9 k; P, F) S! e
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    , X) k, ?4 g2 y- A9 U0 \5 j, j5 g$ k7 a2 o5 }$ j% Q! Z( Y2 L
    问题描述2 e5 r6 \; J  k
    我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    3 u5 G) `% F' W5 y本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。2 ?' o1 _- q5 @, T- r, u# v
    数据特征:  j4 Y4 r0 L3 q. K
    人均犯罪率。, |3 R$ m( z; C' G2 X
    占地面积超过25,000平方英尺的住宅用地比例。
    , A9 ~! |8 f$ H9 l% k$ j* F4 g每个城镇非零售业务的比例。
    9 T+ X6 l; F1 _/ m7 ICharles River虚拟变量(如果管道限制河流则= 1;否则为0)。' V0 ]  I. a- e- {( s
    一氧化氮浓度(每千万份)。% W1 M2 W# W: k$ W! Z' V
    每栋住宅的平均房间数。
    7 @9 {3 ?& S# z* u2 V1940年以前建造的自住单位比例。% m1 n0 w) v# F$ u! B, t3 L. K1 p
    到波士顿五个就业中心的加权距离。, G3 q( j/ ~& {* _
    径向高速公路的可达性指数。
    , v3 C% m5 a3 n: ?7 s, C每10,000美元的全额物业税率。: ~% x( |- Q$ C7 w. W) f: R
    城镇的学生与教师比例。
    $ R+ w! C; d2 Y( R9 J1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
      N7 b. M5 H% D: W人口比例较低的百分比。
    ( N9 s, A, d+ o. i0 B) G1. 加载波士顿房价数据
    ) Z% h* i- _, t  d0 d( {7 Nlibrary(keras)
    9 f! y3 L9 Z7 l. r, G2 j4 `! x' v
    / C2 U9 Y% Y! v- M5 S3 k' F0 f6 Q+ uboston_housing <- dataset_boston_housing()
    % T5 h. T7 s* ]# Q9 a9 w* |9 |* }" h5 w' [
    c(train_data, train_labels) %<-% boston_housing$train
    ! u6 B3 F( q- W3 M$ z: h* i3 \- r) t0 Sc(test_data, test_labels) %<-% boston_housing$test
    , w, @4 q- F$ J- S, g: a
    , M# W8 e+ S) }8 b( Z5 m

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

    2. 准备数据

    数据标准化

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

    5 l0 R- s; Z( m
    # Test data is *not* used when calculating the mean and std.
    ; [/ y4 {# M9 k( i5 K( q; ^5 [1 ], c8 R' u. K
    # Normalize training data
    * w$ }/ s) `7 P- |train_data <- scale(train_data) . N0 y+ Q+ M& Q  O
    ; V% l  A4 |+ T) }
    # Use means and standard deviations from training set to normalize test set
    0 m7 L. e& u2 n* F& Acol_means_train <- attr(train_data, "scaled:center") : c7 v/ M+ E/ `
    col_stddevs_train <- attr(train_data, "scaled:scale")2 m4 O* y  S$ s
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    2 r6 f4 c9 G* |& H+ e) w8 m8 |2 Z/ |& K( ~2 t1 j
    3. 构建网络

    创建模型


    ( k5 R) i" _" _+ h. Ybuild_model <- function() {+ S# @! m+ g8 o2 v( _' y
    : M0 E1 G( a; F
      model <- keras_model_sequential() %>%9 q5 U' g7 S1 Z7 G: l7 n& p& j
        layer_dense(units = 64, activation = "relu",* a+ ~. `6 V' Q" u' ]2 q
                    input_shape = dim(train_data)[2]) %>%
    7 s$ F1 G4 e7 [1 Q* ~1 Q/ h  N    layer_dense(units = 64, activation = "relu") %>%  a& Y" D* k5 O0 ]. Z
        layer_dense(units = 1)
    " C( S9 j& {8 x7 O
      M* w3 s5 e* f8 m" v  model %>% compile(
    # W/ R+ a# w3 n0 A5 L$ U    loss = "mse",
    . Q( C, u' R2 _3 M. ^9 R- \    optimizer = optimizer_rmsprop(),) q" U5 m! T9 s; Y3 k
        metrics = list("mean_absolute_error")
    1 Z8 M/ y! Q. l# Q  )
    % Z& I8 ^1 a; \9 p7 \/ ?
    ; @3 ?7 P- l* d& s  model
    * j4 f) ~/ Z* S) B, P$ X: n}+ V2 V; R2 R) H
    + ?% M/ ~* o* l- v& ~1 u; g5 l
    model <- build_model()
    & M, e. r& |% Hmodel %>% summary()
    : r* l% o. H, k/ V3 N: _% V; e% ^! ~8 V% u5 R. W! M

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

    4. 训练模型2 w0 B6 [4 c: O3 ~' q4 c
    # Display training progress by printing a single dot for each completed epoch.
    % V: W4 e$ f7 M6 N  u$ bprint_dot_callback <- callback_lambda(/ h4 J0 x1 Z  x+ o. {* f5 r
      on_epoch_end = function(epoch, logs) {, C8 k$ k+ p: ~7 H  \" _2 M
        if (epoch %% 80 == 0) cat("\n")1 j( n" @& ]% j' X( g; D
        cat(".")1 |! m7 m, [/ q5 ^, y
      }/ q! D- X% u* N
    )   
    0 s4 I% e* G" s" B; p9 D
    ' z% N! Y9 e% X- k. F2 {epochs <- 500( D) H+ I/ Q: Z+ b" S5 P& t  p: a

    * E' M1 ?9 @, l- V) H5 W1 `) X# Fit the model and store training stats
    . M. ]8 n5 S$ O, F1 h0 S7 B3 xhistory <- model %>% fit(' e: W  I2 _2 l/ q; o- R6 H9 v
      train_data,
    : m( z9 k0 |% t; ?2 _% B( e9 T8 @  train_labels,) _4 p5 ]3 j, R; h/ R( Q: [
      epochs = epochs,9 e1 N- }9 y* S+ V+ y+ |+ N
      validation_split = 0.2,. y- _4 {  l' W; w
      verbose = 0,  P: c( k4 O# t  T
      callbacks = list(print_dot_callback)5 ?' b) c" `- g, z) `
    )& L) F, r& I% S1 [+ I0 v( v

    ' {: n& i2 P: ^: W/ k/ xlibrary(ggplot2)
    ) E1 {; O/ ^( r6 f8 R/ n! R
    : H. Z" x% k& E8 s: Q3 G- H' vplot(history, metrics = "mean_absolute_error", smooth = FALSE) +4 N. G9 n4 F1 J) T- H1 i" h
      coord_cartesian(ylim = c(0, 5))* R6 V& w/ Z( C  x& B
    4 L$ L, A6 k- ~5 c: F" \

    * B2 t- E# z7 R! H7 k  O9 J- }  |, I
    小结2 Q- s* H- B5 i5 |  n, G9 Y
    1)回归常用的损失函数是均方误差(MSE)。
    3 V' Y! j* Z4 s+ C4 G+ |2)常见的回归指标是平均绝对误差(MAE)。+ e3 e% S. V. I0 H# U
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    7 _8 y, Z. r( i' ~4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    % `7 ]# Y$ V% @- X) t9 b  D' K4 z5 i: G2 O

    1 m) l7 f! `: g7 [3 q! E9 M7 k; |9 l  f9 L- I& G3 Q9 s, @9 Q7 y
    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-25 10:29 , Processed in 0.594832 second(s), 51 queries .

    回顶部