QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言& G8 q# Z2 \1 c1 l
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    8 y7 v) B- Z: S4 o2 N' M- `7 p! t# r
    问题描述
    3 F: T' s) ?" Z4 d1 \我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    8 Y- x" }# B0 U' G0 _. A, O# C本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    ; y* a0 C  ?  R* D数据特征:
    8 |) F! r- W4 h9 Z4 y* m8 I人均犯罪率。
    8 h7 U& f) j6 L% T6 w1 U8 u2 d占地面积超过25,000平方英尺的住宅用地比例。2 I5 _  l7 X0 L. S/ }
    每个城镇非零售业务的比例。/ K: ?" e  B9 u
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。8 Y& o# L0 c$ t2 |3 W  N+ r
    一氧化氮浓度(每千万份)。1 c) ?% L% ^/ V9 n& ~( Q
    每栋住宅的平均房间数。* v/ r2 G2 z# K7 K9 P
    1940年以前建造的自住单位比例。% N" w, i' L- M- ?- Z
    到波士顿五个就业中心的加权距离。
    3 T" y8 U* P* E6 u) K) r径向高速公路的可达性指数。1 K9 }1 y( j' R) y9 c5 |% M
    每10,000美元的全额物业税率。
    2 r& P/ O/ h' A' e3 u/ A城镇的学生与教师比例。
    ; W' g' ^' S; c; g7 ]7 y) O0 Z# {1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。) T  k6 I" N) r+ v2 M  ]: L
    人口比例较低的百分比。
    $ U! z' m! ~& D& S: }  m5 y1. 加载波士顿房价数据: l/ v. n3 l5 z, H9 G3 j
    library(keras)0 d9 _0 {6 \6 [. T3 x) ^0 I

    # \. n6 ?' Z1 D& e7 gboston_housing <- dataset_boston_housing()/ ]: k, ]: g# C

    + n2 s1 D! z+ r6 x+ l" H6 g6 ?1 ac(train_data, train_labels) %<-% boston_housing$train
    ' H3 D& ~4 v0 ~' t: mc(test_data, test_labels) %<-% boston_housing$test+ |- y9 B" N- j7 s

    ! ^' J- C7 U. ?7 f7 L8 a

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

    2. 准备数据

    数据标准化

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


    # p. `; o# c# n& q: {( v& Y6 \# Test data is *not* used when calculating the mean and std.( H+ `9 }1 Z& w' F0 Q

    : E! y  G* V6 I  z# Normalize training data
    8 F) ?7 j& q" h+ J% U# C& Itrain_data <- scale(train_data) # Y/ _1 a3 W6 D5 n5 v: ~# }# x

    . J1 T, ^0 H5 L  F# Use means and standard deviations from training set to normalize test set0 R( ~% o- H4 Y8 l! w$ {3 Z1 j; Z
    col_means_train <- attr(train_data, "scaled:center") 5 m) Z/ o0 Y& L6 ]9 y
    col_stddevs_train <- attr(train_data, "scaled:scale")+ p- {; s( v2 b, x1 u
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    4 E" E& @8 d" C: ~: d, P! }9 R
    ! i$ N! v& V( u* L3 f3. 构建网络

    创建模型

    5 Z2 h& c4 b, l$ u) @0 i2 E# f  h$ \
    build_model <- function() {/ N+ [3 ~9 P/ y. O0 v$ ^9 ~
      |/ ^& B! Y% v
      model <- keras_model_sequential() %>%
    , d' M1 F: Z9 w  e8 l    layer_dense(units = 64, activation = "relu",
    , `* G: e* j0 R6 c7 }/ Q% b' T, s- B                input_shape = dim(train_data)[2]) %>%
    ! L" K5 t7 o( ?' m8 y* }    layer_dense(units = 64, activation = "relu") %>%; Z; ^) t1 Z4 L" _* V
        layer_dense(units = 1)! b+ a4 e+ c2 g1 s3 V

    9 H8 K/ M- l2 {7 u% p" }5 F  model %>% compile(9 L5 ^: G) W7 b0 z
        loss = "mse",
    & X! ]# K0 c6 i; D    optimizer = optimizer_rmsprop(),
      M  @3 {  d; M' M    metrics = list("mean_absolute_error")
    6 m# c! }) n( Q3 ~* z  )& z; g! ^% L+ Y# F5 n

    * n  v" z& |$ c# C9 V/ n' ]  model$ t% U  [9 z, |/ h3 f3 V
    }
    ! a; L; o9 {, N, w$ k! |. Y" {. E
    , c8 I0 s4 L0 n; Q* O7 K) @6 bmodel <- build_model()
      \# g! `3 m- m) F6 K# D3 R! umodel %>% summary(). a1 s6 ]  G4 F; Z0 j+ ?% e

    8 n: ]. B: B4 \

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

    4. 训练模型! f1 \4 `- o9 _( K9 L, _
    # Display training progress by printing a single dot for each completed epoch.
    ( k& {6 r! C) S4 ^% C  d$ X0 Bprint_dot_callback <- callback_lambda(2 ~$ N# b9 L( v! ]
      on_epoch_end = function(epoch, logs) {; R- T4 L% p8 i, C3 Y8 s4 ]
        if (epoch %% 80 == 0) cat("\n"); E, U! h* G& G. h, U3 c  y
        cat(".")0 c- E3 ]8 R* |. Y& m8 P8 [: d! k
      }
    ' S7 P3 g- u. w4 Z+ D" p)   
    ' J2 R* j6 B  ^: r0 T% E/ u+ `" R0 G
    epochs <- 500
    7 B$ Q% a4 v$ U. x' ]1 Z8 t0 r' N# |2 r; S( T4 v' O
    # Fit the model and store training stats7 u( y: {9 H( k1 T" U+ E
    history <- model %>% fit(0 T" g- W. r) g6 d, r( J3 Z
      train_data,4 e7 t5 h' ^+ h8 ?' b; B' f
      train_labels,
    ) a( A# R$ G9 g+ l  epochs = epochs,
    & a3 g! p: }9 V% Z* E8 t6 ?  validation_split = 0.2,
    % U$ O. v& M5 x  verbose = 0,
    5 Q: k9 W* m7 }, T, x1 F  callbacks = list(print_dot_callback)
    " ~- [9 @: Z2 N& C): o. j8 T. U. z5 g  n/ r; X

    - e( t2 u5 i( }; a2 g  klibrary(ggplot2)! A, U+ J* D+ d7 |( S9 z
      E: x6 A8 n% y  d
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    - _. c( B4 _+ n. v  i- S' b, ~  coord_cartesian(ylim = c(0, 5))3 H+ q. ~! F* i+ r- h! ?
    1 s1 y+ B$ M  X% f; W2 k. f
    : ^/ k" ]9 J9 r5 s2 s# b: `! @

    , a( @8 C; e2 L1 N3 \" Y( M9 S1 O小结
    6 R' ^: y& E7 n/ R7 }4 l/ k1)回归常用的损失函数是均方误差(MSE)。- M3 U" e& r5 A3 I3 @2 Q
    2)常见的回归指标是平均绝对误差(MAE)。5 S8 X9 f2 }$ `
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。5 I2 T; H( r) q: o
    4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    0 x9 E- A+ M4 J4 q# u( x8 F9 ?4 D$ P) S+ O$ D# A

    3 C" u- t( Y' M5 \! d+ }3 S, y7 x& A% I0 w; w. I: l
    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-6-4 11:49 , Processed in 0.491252 second(s), 51 queries .

    回顶部