QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言& b% X1 \4 G; p# ~6 d" D1 E% m3 v
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。: \4 S& \( t" p7 C' M6 z. k

    - `$ D# U) V7 O  t9 y" ]问题描述
    & X0 i, N  p9 m9 p# @我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。% ^* h2 f1 z3 X! ~9 i
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    , U! i6 b! L- B3 f* a" ]8 K数据特征:
    ( D$ i! C1 l4 K8 Z! V2 ]1 W0 S* @, K人均犯罪率。
    - J' r) Z/ g+ b( [! l: u! v$ L6 F2 a占地面积超过25,000平方英尺的住宅用地比例。
    ; h* E5 n& d8 W, H每个城镇非零售业务的比例。
    ; d. A4 ]& K* t: bCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。8 E1 c: H6 H! `" M; r8 c/ T4 p
    一氧化氮浓度(每千万份)。
    * [" h! O( m+ }4 d! _5 m# e每栋住宅的平均房间数。
    1 k& {6 _9 ^1 t& C/ q- D" T! f, y1940年以前建造的自住单位比例。
    # m  N# u7 n* X. M' y' w到波士顿五个就业中心的加权距离。
    , g/ Z7 `5 a- w' E  a! s4 Z1 E( Q径向高速公路的可达性指数。; p4 I2 a. p, P* A- D
    每10,000美元的全额物业税率。; p& i7 ?5 V* P3 v; F6 X6 Y( T
    城镇的学生与教师比例。3 Y9 ^; c3 f: [  h
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。0 y! \* O/ k. [# N# m' F0 ?
    人口比例较低的百分比。- o% [) g$ r8 J4 t( U5 F
    1. 加载波士顿房价数据
    / ~; Z7 f, |0 e) xlibrary(keras): M. l" ~% c7 {7 K, J/ M

    4 n3 k4 b* D! n) o. D" |: tboston_housing <- dataset_boston_housing()
    & {8 g, G% \; A! n8 M
    / h) K5 l  _" cc(train_data, train_labels) %<-% boston_housing$train/ s' \: s  B; b3 A: o! d0 O" }
    c(test_data, test_labels) %<-% boston_housing$test$ T) m* x# Y& O6 Q; ^) u# c( J

    1 g+ l3 O. K3 z4 h- P9 b6 ~4 u

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

    2. 准备数据

    数据标准化

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

    8 s! @3 D$ E; V7 g/ b$ H# L, J
    # Test data is *not* used when calculating the mean and std.. ?7 E( x+ N2 u1 d  T
    - `9 j1 M% X4 x5 F  a
    # Normalize training data
    " P& w: G: U4 s1 L! o" ]: p4 p9 ztrain_data <- scale(train_data)
      b) x3 b+ R6 B. Y5 P5 o
    9 H8 q1 Q, o- L8 d! H' O# Use means and standard deviations from training set to normalize test set% m  v# E. ]& P- p0 C
    col_means_train <- attr(train_data, "scaled:center") . H% Q8 `, b8 o# x
    col_stddevs_train <- attr(train_data, "scaled:scale")/ y/ `9 |5 ~) R, \: i
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    3 v2 z: v& ]6 c& r. N$ v8 V
    6 {' Z9 q1 G, L* w! H4 w- s3. 构建网络

    创建模型

    * G# |# N- g: u; i
    build_model <- function() {
    + Y4 X7 A; `: x4 [, w+ h
    ; ^6 I: i: N. e3 X+ t/ z  model <- keras_model_sequential() %>%
    . d* j3 n8 v7 f+ U8 @; F8 B9 R    layer_dense(units = 64, activation = "relu",1 H. ~% v5 p6 g$ x
                    input_shape = dim(train_data)[2]) %>%: {2 m4 p' {6 X6 t; e' @$ A" k1 E
        layer_dense(units = 64, activation = "relu") %>%, I' L* v$ `+ j8 i, P
        layer_dense(units = 1)) Y" p- E  G. p( U

    / i) l* h( d& r  B  model %>% compile(
    - O6 S9 y8 _# k7 `5 m    loss = "mse",5 R: e1 u% L8 R5 c% H/ {8 q; M
        optimizer = optimizer_rmsprop(),
    2 y1 U2 J' H2 U! ~    metrics = list("mean_absolute_error")
    + a* \' L6 K; o; z- Z; r  )! m2 g, O- U* C

    # Q0 s' r! a- e3 [, H: h  model5 C% O/ ^) C# w3 z# b7 u
    }3 R9 ~& p4 N* Y2 _3 X

    - F/ i1 ~) Q+ U* k6 G/ |2 W! l9 Bmodel <- build_model()7 V7 P- n* F# `! J
    model %>% summary()0 p9 S3 E. X1 _0 _$ W( I: {9 |0 ]
    $ r$ Y: T1 `3 U

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

    4. 训练模型
    ! l! ~1 p4 @3 q2 i# Display training progress by printing a single dot for each completed epoch." F" N. L1 T/ \
    print_dot_callback <- callback_lambda(
    0 j2 Y0 P% v7 }. I1 y5 k  w# B  on_epoch_end = function(epoch, logs) {
    ! c/ H6 N! t" X# E0 i7 U    if (epoch %% 80 == 0) cat("\n")# I8 V) K, w" E
        cat(".")' Z4 ?* K0 m) I1 ?$ I- c: u1 r
      }
    5 }* d' J2 \4 l)   
    $ m8 h; N% G& D$ @0 i, ^% L9 G7 b7 M
    epochs <- 500( Y  o5 P6 p1 n8 p+ ~2 V6 @

    : \# J, g; i7 }3 C; K$ B& a# Fit the model and store training stats
    & ]3 P6 ~3 E* Y) s% a1 Ohistory <- model %>% fit(
    3 C: Q1 r* P3 g  e0 P# z. G- A  train_data,' X2 O0 ]( t% [9 q1 y
      train_labels,8 p0 }6 p- J' L1 `
      epochs = epochs,
    7 ]- s6 s* ~7 o5 m6 u, B: c  validation_split = 0.2,2 A: l7 c& A9 ^
      verbose = 0,
    9 Q% S) e- T; A% t/ V' b  callbacks = list(print_dot_callback)
    $ Q! u3 p7 s; s# l2 b) ?)
    / Y+ B3 i9 h% ~- P( _% z: n8 {! f
    library(ggplot2)# _/ Q& m4 A7 P
    1 L6 {# U8 m" q& t7 f7 G4 J( R9 P
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    / e% }$ B( Z# p2 c. U. k$ S3 N" k  coord_cartesian(ylim = c(0, 5))
    # d" i$ \0 P# v9 h8 g% o7 l; s+ L
    $ F* J+ T: A$ c% h; F3 P2 P' u0 h$ ?( x% T  F  G3 Y# i
    # j# P/ j9 F8 p
    小结
    / K) P; h( |- V) p" }- D/ p1)回归常用的损失函数是均方误差(MSE)。+ l, _4 ^2 U) t' z$ n8 f. z. |
    2)常见的回归指标是平均绝对误差(MAE)。( T9 h  G4 d: s3 B
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    + b% [* V- g$ h9 K4 G4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。& S2 D7 X6 Y; R' [2 @
    $ G! \0 v( [, I& a7 z; K
    + ~, D9 l6 e7 a: f8 m3 N1 p2 P
    5 Z8 h2 [- F# O
    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-7-22 10:26 , Processed in 0.425633 second(s), 51 queries .

    回顶部