QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言
    . z! h- N0 G  D% B$ Q" D在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    7 f) S8 P9 K; S( F( U! O
    8 _+ ~7 p% w1 h- x7 _8 h问题描述
    - a/ `+ ]* x) ~我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。3 t, E$ S/ \- m2 n
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。$ o3 z9 j/ f6 X2 E( M% z  m  _
    数据特征:4 }! C& j7 Y' P% M/ ]
    人均犯罪率。& M- |, W0 P0 v2 h, B! z
    占地面积超过25,000平方英尺的住宅用地比例。
    3 n7 R! c9 n( q5 k每个城镇非零售业务的比例。! T, }/ M, C$ p; v
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。7 P: T/ q; U$ r6 I, j% M# d
    一氧化氮浓度(每千万份)。  K' U6 _$ }4 A. {  X% Z! p  K
    每栋住宅的平均房间数。
    : f) V$ r' \. `5 c9 c  d& B* b1940年以前建造的自住单位比例。
      I  x; c; E7 m, C: L' o5 @( S到波士顿五个就业中心的加权距离。
    1 B5 o- ^. o8 ]6 P2 u& A/ S, p径向高速公路的可达性指数。# S2 q  \1 u5 O2 E
    每10,000美元的全额物业税率。
    * r2 D7 I$ F' E3 G" W城镇的学生与教师比例。
    6 W; z- |; Y1 E3 O; N& F6 N7 }1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    8 L; T" G1 ?/ l/ S: t* Z6 w人口比例较低的百分比。: D0 Z) y' x2 c0 w9 Y9 S
    1. 加载波士顿房价数据
    3 V3 Q0 N" K: Y  s% X0 Slibrary(keras), ~& t; o& n2 p
    5 M3 H. j' w9 R) `
    boston_housing <- dataset_boston_housing()
    . l7 g% Q' o2 N8 W. N; e. U. ]: \3 s  m) n
    c(train_data, train_labels) %<-% boston_housing$train
    8 B5 L' `, K9 f# r' Kc(test_data, test_labels) %<-% boston_housing$test1 K0 V% v3 c% W; a. b, i$ J4 R# _; v
    0 M$ [4 ?5 y  N9 \, o

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

    2. 准备数据

    数据标准化

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

    " n4 y% M/ N4 Z, {# r# ]
    # Test data is *not* used when calculating the mean and std.
    ' D4 n* ?8 S  n1 z* d. o1 G3 W; s
    # Normalize training data
    ; _+ y# j* {3 ]* H! `. t$ f5 V! wtrain_data <- scale(train_data) . i7 Z! W# P, B% C9 E7 `- l
    7 Q8 J! F7 X! ^  ~* d9 o
    # Use means and standard deviations from training set to normalize test set4 a! S5 I2 L9 J* z3 {
    col_means_train <- attr(train_data, "scaled:center")
    " h# M0 G) _+ @+ o; pcol_stddevs_train <- attr(train_data, "scaled:scale")* G) W. S2 T* ^, N
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)  ]* o, N6 V, U
    2 F# s5 T3 Z5 y  t
    3. 构建网络

    创建模型


    3 I$ R1 @3 }* I2 j* U% ebuild_model <- function() {$ j2 _! d9 t: h+ f+ A& e8 h. h- `
    ( b& t' J8 v1 h% i9 f
      model <- keras_model_sequential() %>%6 L" J$ u2 @, s
        layer_dense(units = 64, activation = "relu",4 Q* O. ~* ]+ z
                    input_shape = dim(train_data)[2]) %>%9 ~% G/ Z  n" z, m& ^! e3 r& K- c& T
        layer_dense(units = 64, activation = "relu") %>%. I4 I8 v( D/ `$ ^
        layer_dense(units = 1)
    / q) s- S1 |: {7 q' _( n  i  l3 M5 U' u/ `% N$ t7 q5 B3 U: K
      model %>% compile(. h5 d7 ?7 x% o
        loss = "mse",
    1 N6 F5 S+ L, X* r    optimizer = optimizer_rmsprop(),- ]  X4 N  e) a. Y& C. Z
        metrics = list("mean_absolute_error")  K/ ]- T6 s. z: {
      )
    4 x) _) M$ H, Q$ p! G% R2 ^. d) K# U! Y5 ^
      model) L8 u3 s: v5 @# R! g  t2 Q
    }
    ) i5 A2 e, N3 R6 D
    1 y  S  P2 S. G4 Tmodel <- build_model()+ t* k* i3 M; x
    model %>% summary()& w" O+ n4 y( t

    0 D0 l/ A( t, x

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

    4. 训练模型
    6 D5 t# [% i9 s  E  y* d# Display training progress by printing a single dot for each completed epoch.
    & o" Y/ {$ f) B- eprint_dot_callback <- callback_lambda(  u$ P+ M' P0 c
      on_epoch_end = function(epoch, logs) {
    : M. U6 A7 y9 n: ?" x    if (epoch %% 80 == 0) cat("\n")0 {* h- _0 T8 ?- |
        cat(".")" z5 _0 ~) R! \- F
      }
    ( {$ V# B" K9 p6 ]% j' j9 {* O)    2 ]7 f0 v3 ^) A7 a# F

    . }8 F+ P$ L9 u2 m; pepochs <- 500- t7 a5 c1 j) X7 d) B* T# N

    1 W  t$ H$ D& z: K1 [# Fit the model and store training stats
    " x* A. W" e: D/ Dhistory <- model %>% fit() [4 [5 i# H2 }: j( c
      train_data,( I* t1 ]0 |0 z* A* I6 C2 Q
      train_labels,; b5 Y. o" n7 l1 z) k" ~* q( K' A
      epochs = epochs,* {3 [% ~0 V! ^5 ~, u$ j& x
      validation_split = 0.2,
    3 z& w+ S3 E& B3 v7 e  verbose = 0,
    ' V9 z3 @/ L% l3 R' I2 ]  callbacks = list(print_dot_callback)
    . T0 C, I7 V, c. g2 h)
    6 v' L9 D% F# L; H) S! h0 E7 Z" o2 S) N
    library(ggplot2)
    ( z  |0 W' n* N2 Z& W' A6 v& q, P/ ^2 S. n4 B4 z, r
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    / N9 F* b5 e# f% S9 A  coord_cartesian(ylim = c(0, 5))" |& H7 o! I$ U' _6 V& V. s! v9 I3 V8 G! w

    ( G0 u* ~: \3 H( U3 m& C$ u& Q+ }& y, ?) M8 q' F* S

    ! A3 v# _; F3 G, A小结
    " Y& i$ t# T0 c* A1)回归常用的损失函数是均方误差(MSE)。- ^* x0 ]. z) t. m) Z! H
    2)常见的回归指标是平均绝对误差(MAE)。
    0 F6 u# ^0 g; e8 l3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    , Q) ^  }% q, r4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。, {/ q) S/ t* e: _! J

    0 y2 D# N/ S$ _7 X0 m7 L6 h5 ~7 \- h6 k, t: f$ {8 |
    & U* h5 J# ]9 \+ L: M
    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, 2025-10-3 12:45 , Processed in 0.455440 second(s), 50 queries .

    回顶部