QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言
    - d% H8 \) t% X+ ]5 v5 V# a在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。/ `/ Y* b2 ~3 o8 h! p

    $ V4 N+ |. x9 p5 k问题描述
    : R8 L4 K6 v1 S8 }5 p我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。8 S# a8 Q  M( G* Z
    本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。# F9 z/ k8 r: b3 b6 g
    数据特征:1 \3 w: Q2 V0 ~7 A/ K7 z% Q
    人均犯罪率。% E3 f! ^8 P( D! \* Z
    占地面积超过25,000平方英尺的住宅用地比例。
    # q6 O7 l9 E+ v  e% c$ I; k1 s每个城镇非零售业务的比例。* \3 I: G3 E/ N  Y7 `
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。0 d6 z# c# z" ]5 O, f  }
    一氧化氮浓度(每千万份)。! o* @6 t; g: F& ?! O/ i
    每栋住宅的平均房间数。9 j0 G" g4 {. ]' D: C# }$ }0 d
    1940年以前建造的自住单位比例。
    . a& V& U- Z# b; n' \到波士顿五个就业中心的加权距离。
    * b& z3 p9 M$ R5 |* Z径向高速公路的可达性指数。
    , [4 Y4 Z, w8 T% D* T3 f每10,000美元的全额物业税率。5 v0 U  X2 p0 g% F  w
    城镇的学生与教师比例。$ w; W/ E; M7 t3 Z" {: s! T2 [: V, t) ^, _
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。% \5 K, e7 [5 }+ B( s- _
    人口比例较低的百分比。
    ( C2 j5 {# E9 j3 `/ E: T1. 加载波士顿房价数据5 s$ j& @( c" t* D3 a8 k- d
    library(keras)
    5 k/ u( R- D6 X8 q5 K! J+ R4 \1 q- m4 @. a& @" ^7 }
    boston_housing <- dataset_boston_housing()
    % s, z. `4 C  f0 E' o2 T- T' I
    c(train_data, train_labels) %<-% boston_housing$train
    9 V9 z* |2 B9 _) yc(test_data, test_labels) %<-% boston_housing$test
    # S& E! ~0 f8 C5 C! F- p4 n* u% P+ u

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

    2. 准备数据

    数据标准化

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

    ! h! A5 N) Z0 i% N
    # Test data is *not* used when calculating the mean and std.. {$ T/ u8 u( ~, X& m1 p% F
    $ m# G8 x5 E! y. [, i
    # Normalize training data
    & \; Z% L+ \: B$ [train_data <- scale(train_data)
    6 s. M' F# E4 N$ j+ R6 w# ]
    . x+ c' y7 v7 D1 p/ T4 ~# Use means and standard deviations from training set to normalize test set% A1 ~# D3 c; g5 C/ V/ t8 m0 Q' T
    col_means_train <- attr(train_data, "scaled:center") , w$ }" G. C' P$ i
    col_stddevs_train <- attr(train_data, "scaled:scale")
    3 h0 v3 z- @3 U' k# ltest_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)
    / o: H& j5 ?1 v% a4 F4 U! B& w  q% J2 w7 e) w8 \2 q6 I
    3. 构建网络

    创建模型

    % x+ z8 V) }2 R+ p, j. g
    build_model <- function() {
    2 l$ S+ v6 w. r# ?; J/ F8 t3 Y, v# i: u  X
      model <- keras_model_sequential() %>%' B- N' a4 c- ?2 H# n% u
        layer_dense(units = 64, activation = "relu",& b3 i( J2 |  I5 d
                    input_shape = dim(train_data)[2]) %>%5 ~) G/ S( e, e1 Q1 Q) B1 g. I: U
        layer_dense(units = 64, activation = "relu") %>%
    1 Z) ?- ?! [9 X- a. A, B( n    layer_dense(units = 1)
    5 q  T6 g& h. A6 Y/ Y" V
    : B5 t6 n$ l+ h$ r, q  model %>% compile(
    7 k% u, U: {" v    loss = "mse",+ h% f- t  v  y6 V4 K0 Y
        optimizer = optimizer_rmsprop(),
    $ S% u2 U; C8 `% d/ l& X2 |    metrics = list("mean_absolute_error")
    8 y" q0 x! p: {  )
    2 }' U* ]  V  l( O& D0 {
    : c* ^( P9 q/ q+ [1 c  model* g8 F. `. J, B( m: i( O, m9 q
    }
    - R! Y1 o* n$ V9 w% l
    , d: k) L/ a' smodel <- build_model()
    $ a; ~6 K) J* l% k: J! N4 Jmodel %>% summary()
    ' W# H& |; H% l; u* }$ n! b! J' }- g
    " `" l- y7 T; h. T3 C  k* A

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

    4. 训练模型9 v! ^4 F+ y8 o  E4 ^
    # Display training progress by printing a single dot for each completed epoch.5 w( |7 b& Q4 {6 |3 y
    print_dot_callback <- callback_lambda(
    0 s& R0 o: h( d5 {( _% P  on_epoch_end = function(epoch, logs) {
    9 q6 ~. A  y' N, c! A3 F    if (epoch %% 80 == 0) cat("\n")
    & j. r9 G- M2 s$ F    cat(".")1 l+ r9 A4 Q# {+ P" y, z
      }
    * S( I# J! a* q0 r; Y* n4 l)   
    . {- W1 L, l4 d% X* t5 z
    ' @) n5 ^& a: i* tepochs <- 500
    & P" M2 a2 W0 N7 c) H# H  d! `. I/ ~* }5 a) ?4 {- _
    # Fit the model and store training stats- M. D0 i% o8 \! x
    history <- model %>% fit(
    $ n  M' y' z5 ~, |2 i  train_data,8 _$ ?' T  x4 q1 J  @4 _: N
      train_labels,% c5 O$ J1 D0 I5 f9 {
      epochs = epochs,) p$ M& ]$ p9 g! n7 ?
      validation_split = 0.2,/ Q' k) @" u  E
      verbose = 0,! t) S3 B' d8 H# L
      callbacks = list(print_dot_callback)
    / Z5 q. Q, g: C* i% Z& n1 H)
    4 N: W% t- E8 ~1 g# Z
    7 X  z, b+ ~1 }) G; p0 N6 s' Q8 olibrary(ggplot2)
    % k1 |& w5 Z( }& J8 k  l5 E+ V/ x/ }5 t8 q& {; F# m
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +' y$ U% J2 C$ }6 |( w2 e
      coord_cartesian(ylim = c(0, 5))3 U' s6 X# z+ t8 j* Z1 l

    8 S5 ?* j7 B& K9 B# v+ [/ A
    ) v# m8 b* p4 ^( b$ d
    3 Y  m& Y0 H! r, I* d0 c小结
    & D- b$ B7 }8 r; T5 [1)回归常用的损失函数是均方误差(MSE)。/ |; R- r2 O4 \( ^
    2)常见的回归指标是平均绝对误差(MAE)。  @9 p; b+ |" w8 n  {4 Q2 U6 d
    3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    7 S0 Y% x: L+ h+ R7 X4 ~" u4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。
    . ~8 g: |% L# q0 J- U8 o5 p2 `! r2 t6 t, M

    # n# ^- b! o% O! k( @. D( ]' E* L: w
    9 X) I2 @0 m7 {7 I* _7 X
    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-7-8 15:32 , Processed in 1.186466 second(s), 50 queries .

    回顶部