QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3769|回复: 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 i2 f; D0 G9 G* \1 [在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。
    . U3 B4 }: z0 h/ A- D8 r, I1 A" F3 `; M! y( i, Y
    问题描述
    : l, ~5 p, |8 |" g我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。% }8 ~9 _1 k) x5 @) E7 M; ~
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
    ' K  {3 |6 J% ~* W) H. i( q* {数据特征:- I" h( }7 F( M6 T
    人均犯罪率。
    7 _) w( G: J9 w6 ]占地面积超过25,000平方英尺的住宅用地比例。
    2 l2 ]1 @0 w7 u每个城镇非零售业务的比例。
    8 l  h5 ]1 W& @: K2 Z( UCharles River虚拟变量(如果管道限制河流则= 1;否则为0)。2 J8 q% q) A/ V4 C- T' l6 s- }0 l
    一氧化氮浓度(每千万份)。: f- g8 Q3 z) G- Z  h9 f& \% f
    每栋住宅的平均房间数。, [) K9 z) {4 f: g2 c
    1940年以前建造的自住单位比例。
    2 C' w: |! m2 f& a: @! \( a到波士顿五个就业中心的加权距离。% H( h3 D/ _; v- e' s0 M- I
    径向高速公路的可达性指数。
    6 S; M" h$ z6 Z每10,000美元的全额物业税率。# u% {: b1 v$ O+ a- P
    城镇的学生与教师比例。4 m6 M, s4 q! [3 j1 `) g
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    4 v2 m+ A$ v& `# u5 D. j4 f" x人口比例较低的百分比。  U. c8 B. @  Q* e4 x- t
    1. 加载波士顿房价数据6 u0 T% ^0 v2 q0 m6 O; Y+ g( ^1 r4 K
    library(keras)
    0 M  ^& N; k0 R( g
    8 r$ T4 j+ k! V7 ]; r! Wboston_housing <- dataset_boston_housing()* ?3 j: s& n) e# d! |
    9 j  l' Z8 q, A2 J) p" L
    c(train_data, train_labels) %<-% boston_housing$train
      J% ], u7 m1 ~! Y& {: S1 S# gc(test_data, test_labels) %<-% boston_housing$test
    + Q) |  |5 @4 J+ Z" x" Z
    + L+ f2 n( f" z8 t" I5 J9 ?9 J/ @

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

    2. 准备数据

    数据标准化

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

    7 m  R1 e6 n. r5 J( X) a
    # Test data is *not* used when calculating the mean and std.9 i/ |- `0 ^( G) |" b* @

    * b' ~5 f3 H+ h# Normalize training data
    , i& G0 q- x$ Dtrain_data <- scale(train_data)
    8 N/ Y; Q$ n/ J1 |2 l: I! Z
    & Z3 S4 ~# u  b# Use means and standard deviations from training set to normalize test set; h- }+ f5 S1 ^$ q1 M
    col_means_train <- attr(train_data, "scaled:center")
    9 r" F4 w& R- Q- Ocol_stddevs_train <- attr(train_data, "scaled:scale")
    ) a" M. |+ `5 s! i5 ?! Jtest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)0 p/ h$ @5 ]. {! q0 M2 x, E
    8 [6 [6 A; Y& M3 W1 F2 M: Q7 X
    3. 构建网络

    创建模型


    1 V; q6 m# a- `9 M! s; o# [% Kbuild_model <- function() {
    4 r* n1 e3 u1 e$ h5 Y2 l4 X! p% ^0 H& J/ t( Y, @' i  T* D% [7 m
      model <- keras_model_sequential() %>%% W1 R! R4 C# u: J5 {7 m' m8 |
        layer_dense(units = 64, activation = "relu",$ H" X9 B9 c2 P6 \% l$ p' ^
                    input_shape = dim(train_data)[2]) %>%
    $ x' O7 p& `  N+ I3 R. |    layer_dense(units = 64, activation = "relu") %>%
    & F  d4 C# [. U2 e0 D6 m    layer_dense(units = 1)5 O6 ]" x3 T9 K9 h

    0 v( s6 j) j7 l7 X% \  model %>% compile(" H+ a) P2 f: t3 N" {
        loss = "mse",
    # d7 t6 u" [+ x& Q, f* q6 O) }) r; e    optimizer = optimizer_rmsprop(),
    2 D2 P$ P$ m! R+ U7 g1 f+ F    metrics = list("mean_absolute_error")( p" W# c: V0 p: \: \- f! |3 W
      )
    & T+ j2 Z, K! s$ ^# u; w  [' _5 P. z/ t4 G
      model. H& I5 I! {/ i: e8 o
    }
    : f2 p- C" m. k' C6 C, r! D$ M
    model <- build_model()% C. K2 Q0 O6 i, F) o8 j
    model %>% summary()
    1 t3 \9 Y$ q) o! |0 t, r- m
    : K2 U6 k7 H9 c" {; X3 `$ f

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

    4. 训练模型
    8 \; }3 Z. V5 _; [/ z# Display training progress by printing a single dot for each completed epoch.: V) Z% ^# ^7 B! \
    print_dot_callback <- callback_lambda(
    & ~. u* y$ l/ J+ r  on_epoch_end = function(epoch, logs) {/ S6 }0 s  P, J% p+ t- K7 R- M. [
        if (epoch %% 80 == 0) cat("\n")
    8 ]. z7 ~& n/ f- c5 W  y8 p    cat(".")3 J; A# W# S) H' P( M' I( u
      }
    5 o' X( j: I9 M4 C# x)   
    # V0 c: O, W; {6 L% b' W1 j2 y  ?- j; c: `$ G
    epochs <- 500
    / j; V8 V& y$ C. r& Y+ @# o
    - k8 b  ~2 H! J# b8 d8 `' d& I1 |# Fit the model and store training stats
    . m# K* g% g# j/ O9 a, h( N- {history <- model %>% fit(
    / |3 Y% I2 X" f* O* T  C* M  train_data," k( ^/ h  l1 Z0 B; P( U; g
      train_labels,
    " ~7 [" i* B4 f  |1 R  epochs = epochs,
    7 A2 Y. p- @6 x+ q7 N1 J6 Q( Q, l  validation_split = 0.2,
    9 G1 B7 s  }. d- P2 q  verbose = 0,0 d" {1 T' I" _$ W: ~* f
      callbacks = list(print_dot_callback)
    + N- o$ Q" p) `+ t)# ~; V7 ^3 y8 C: f  N2 P
    & h1 k4 p" d( K. O: e2 i
    library(ggplot2)
    : F3 D" Q# k: Z; P1 E+ q) j4 ]) l. Y) d. n3 A$ g6 Z, g
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    , N1 A5 R( w8 d, h, J4 \! S  coord_cartesian(ylim = c(0, 5))
    0 ^$ t& _: w0 {( x5 Z+ O, ~3 k" _& v& A& Y/ J. l
    $ ?) R. u8 V) E- w1 x
    ; _& W8 \! r! b0 D
    小结
    ! l) R2 G$ G$ l2 U5 t1)回归常用的损失函数是均方误差(MSE)。
      K: {; A- K" O0 k2)常见的回归指标是平均绝对误差(MAE)。9 q. {+ R7 Z% q; y/ C) h8 T( }% I
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    5 _7 }: @7 ?$ ~8 ^/ A- o: L+ C4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。: G/ m2 L! }& A7 h, {: A+ v' o
    9 Z# V6 F. _, J* c- ?
    : l9 s5 a' _5 d6 P; i7 J: I8 H% W
      I6 C0 S  e/ z
    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-11-8 05:39 , Processed in 1.481877 second(s), 52 queries .

    回顶部