QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言8 s* o" F! g; K# Z
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    3 t" e9 x) B# b% [5 z  E# f1 p; f( a) X$ \1 i! J5 |
    问题描述0 b1 @. `' F3 W2 w! J) V
    我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    2 }3 _" N: I) f7 g本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    $ X- l7 Z9 {4 l/ O数据特征:5 Y1 V0 k/ r$ ]$ B) E( D7 P
    人均犯罪率。
    : o2 m+ A& o+ H( ]7 j1 D占地面积超过25,000平方英尺的住宅用地比例。& @  Q; ^; `% _: x( q
    每个城镇非零售业务的比例。* [6 R" N7 w+ X; y# r
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。
    ' N7 s3 _- L. u; @% J, z一氧化氮浓度(每千万份)。
    8 T' \; f; X6 f4 Q, Z: @0 @每栋住宅的平均房间数。  o0 P" l8 c6 k7 G* l. Z% ?) r
    1940年以前建造的自住单位比例。
    * o$ g: s( v4 E, b到波士顿五个就业中心的加权距离。. T5 b. |: L1 N% y8 {) v( d
    径向高速公路的可达性指数。& h6 j% b# ]- Q& @0 u4 ?- \6 i: F
    每10,000美元的全额物业税率。
    5 Y: _" }; r) |) s; L城镇的学生与教师比例。# [/ Z' U, [/ e- f6 \
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。# C& [. \2 x& z& q8 N+ H
    人口比例较低的百分比。6 v+ ?! z! S: ?2 P! k* v' G" r
    1. 加载波士顿房价数据
    ; Z& `1 [1 i; @2 klibrary(keras)
    8 M; D; d) X9 Q) Z1 D
    $ g& M' K" S+ ]8 J0 `+ oboston_housing <- dataset_boston_housing(); ?1 Q/ d/ P7 l: u, T( }
    8 x. K6 w; R4 q) B
    c(train_data, train_labels) %<-% boston_housing$train
    1 n& ^% g* r+ r5 c& _$ e1 Oc(test_data, test_labels) %<-% boston_housing$test1 O2 {5 n7 P1 }9 k

    / c! B) R, C8 U9 ~7 F' v

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

    2. 准备数据

    数据标准化

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

    4 u$ y" x0 Z+ ?9 j0 C7 X9 w' v
    # Test data is *not* used when calculating the mean and std.
    2 n2 ~, K& P0 a8 j' p) z* f/ `3 X) Y: U/ D% @
    # Normalize training data4 n5 }7 ~9 ~1 ]
    train_data <- scale(train_data) 3 c7 f$ q& V; f$ w( H( C

    1 D5 X; N7 G6 Q/ X! o3 U: s0 s* A# Use means and standard deviations from training set to normalize test set8 w; K( |2 P" D
    col_means_train <- attr(train_data, "scaled:center") + ]/ e$ B( E2 P
    col_stddevs_train <- attr(train_data, "scaled:scale")
    0 b0 j; c1 c8 Ytest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    1 r/ u1 w" P3 a' J
    5 L: X8 K* I6 Y' j3. 构建网络

    创建模型

    : U* M5 G8 w2 `; y$ J# i8 a  t
    build_model <- function() {4 M3 ~" g' }9 X4 h% M
    2 S9 b/ W% F, ~
      model <- keras_model_sequential() %>%
    ! s' F' ^8 u! V+ r5 o' y* x    layer_dense(units = 64, activation = "relu",
      X  e6 R. T" }# }; K                input_shape = dim(train_data)[2]) %>%
    9 p. H+ }& m' S6 V    layer_dense(units = 64, activation = "relu") %>%
    $ [1 v. q( h) ]. s    layer_dense(units = 1)
    ! E2 \9 a% L0 y7 u7 E% O& O3 m3 X
    & q* V: B9 s! W- F* h3 A  model %>% compile(9 ^) f' @# g8 f1 j- Z
        loss = "mse",0 ]( k) ]' E9 |4 N4 U( ~  O$ c* b
        optimizer = optimizer_rmsprop(),5 \  E0 Y* g" F( s0 s1 O! l
        metrics = list("mean_absolute_error")6 ~* a5 k/ q0 s  t& {
      )
    - J5 k$ i1 _# I
    ) e* W5 b$ b/ \/ q* r+ g& P  model
    + w5 l6 v, n* A8 Z. D- A( ~+ z! w}  ]( P4 M8 x" h& W
    7 J8 a' K4 U5 v, W; I# [8 I5 `$ ~
    model <- build_model()
    + |6 M/ k* P' b) d. |% hmodel %>% summary()
    # \  A& w0 m. s( l2 U! S' p$ B4 I# t. Y- t0 o6 @9 w; c

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

    4. 训练模型# C/ V0 s- L6 G6 C% l% o% I& ?* J8 |
    # Display training progress by printing a single dot for each completed epoch., i( x; _+ \. d
    print_dot_callback <- callback_lambda(7 G, a+ s& R) v7 b2 e/ @
      on_epoch_end = function(epoch, logs) {( E' a5 W: f" e
        if (epoch %% 80 == 0) cat("\n")
    , D, k5 v: z- O$ @- s8 B! j0 @    cat(".")
    3 U* ~, H6 B( s) W* Q  }8 P5 u) a' K3 x) w6 I/ e
    )    & z4 ?7 E  y7 U9 z4 u* C9 F' y
    6 W: r4 A& ~7 Z& F. R
    epochs <- 500
    1 k6 D! h4 J$ p: a
    ' O# _( ^# l1 c# Fit the model and store training stats) k# L/ l4 ~6 Z2 u
    history <- model %>% fit(. f6 Q- O9 A$ }% u3 N2 p6 H
      train_data,
    4 e. m) P) k+ M! `) b  train_labels,/ x1 {+ G" t  m+ c  z
      epochs = epochs,
    . x6 s, u# L; s, H! z$ G* V0 n4 @8 a  validation_split = 0.2,8 Y: o7 S6 i1 I8 A, D7 R4 u& S
      verbose = 0,5 b$ B9 J2 V; G! L; T- K
      callbacks = list(print_dot_callback)# ^0 Z" h' r% y, l7 J( }8 H. k' T
    )
    ) ^: F$ x0 X4 P9 Y0 W; l4 ?* j  K; e+ A4 T
    library(ggplot2), z# o3 h; ~" h8 |
      N1 z9 g+ Y- n0 s  V+ u6 L
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    / k$ x& ~- p. D9 k- a- v8 }  coord_cartesian(ylim = c(0, 5))+ U& c  D, c3 ^

    7 j! R: ]% |8 L/ ^
    . P5 A6 c. [: O% `( j7 V# I+ f  o' m* Q) [. i8 i
    小结$ \4 s0 R* U2 U4 Q# r) K  ~+ U: g
    1)回归常用的损失函数是均方误差(MSE)。
    - N7 D8 e! k" X* i) L2)常见的回归指标是平均绝对误差(MAE)。
    # h9 M1 G2 u6 t6 c& O6 P/ [+ L3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。& |5 D& \/ O# B4 |
    4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。  Q9 B/ ?0 E' c( z  J: o
    $ M( K" r' X5 f3 `! s5 q
    . L$ u* S9 ?4 @3 h

    ! Q% ^( c  ~* g0 @4 t$ M% 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, 2025-10-3 11:06 , Processed in 0.468373 second(s), 50 queries .

    回顶部