QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 10:50 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    预测房价:回归问题——R语言: P3 x, n% L% E" A* K
    在回归问题中,我们的目标是预测连续值的输出,如价格或概率。将此与分类问题进行对比,分类的目标是预测离散标签(例如,图片包含苹果或橙色)。$ J* ?: k. L$ O, l4 S5 j+ U
    + W& u8 i3 O# z8 n
    问题描述
    / s+ W' r3 j# I' F: G- r; ?我们将要预测20世纪70年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。
    0 H! @. K  O. z% o6 |! N1 q本次用到的数据集包含的数据点相对较少,只有506个,分为404个训练样本和102个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特征是比例,取值范围0 ~ 1;有的取值范围为1 ~ 12;还有的取值范围0 ~ 100,等等。
      v6 K) A2 ]/ Q. Z数据特征:
    $ @1 A3 M' {5 w; P' z$ C人均犯罪率。
    / }. J2 _) `2 v5 A$ {7 X占地面积超过25,000平方英尺的住宅用地比例。
    4 h. E) Y) b: f9 M. K% q$ ~每个城镇非零售业务的比例。- G; o9 ^+ H1 B) V. n2 X( X8 E
    Charles River虚拟变量(如果管道限制河流则= 1;否则为0)。" U& _+ w' d2 B4 U) I
    一氧化氮浓度(每千万份)。
    5 X8 z6 F+ I  [* B每栋住宅的平均房间数。
    : N& o, ]  d5 s1940年以前建造的自住单位比例。
    ' F# f+ {( c2 O8 N+ f4 {2 o到波士顿五个就业中心的加权距离。0 R/ a8 z2 G* j+ {$ L0 E
    径向高速公路的可达性指数。; `4 ]' v- V* r  I% c4 j' k9 u
    每10,000美元的全额物业税率。
    . A. l1 }- v, N. E2 B3 A城镇的学生与教师比例。: Z; S( `( f' M' \) h9 V4 @
    1000 (Bk - 0.63)* 2其中Bk是城镇黑人的比例。
    : h9 M& O' l1 d2 C3 R; Z7 A人口比例较低的百分比。
    3 d  y9 T1 c3 \6 V. o% X9 N1. 加载波士顿房价数据
    , ]% w- j+ F- [+ L6 \% Elibrary(keras)
    9 {5 M# p( k8 C! q+ f+ q7 P* \* k9 k# c: ]; |
    boston_housing <- dataset_boston_housing()& J; W. _! \4 C/ I7 c& J4 N
    7 I$ P! W; d3 a8 w* _
    c(train_data, train_labels) %<-% boston_housing$train! {. n! q" ?0 o2 B
    c(test_data, test_labels) %<-% boston_housing$test
    8 M( F* e; N. J$ r8 w
    1 r4 y3 e2 u$ `' x+ {6 b

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

    2. 准备数据

    数据标准化

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

      {5 c+ |4 ^6 q
    # Test data is *not* used when calculating the mean and std.8 X7 m' G2 s8 T3 X$ s2 ~5 }

    3 Z- S- E; m: {9 s# Normalize training data) p( ^. D. N4 w* H1 `
    train_data <- scale(train_data)
    ( S6 {& |# y1 d# R: ?
    , l& P! K) @, g- q' P# Use means and standard deviations from training set to normalize test set8 h2 O" B5 D( o. e" @
    col_means_train <- attr(train_data, "scaled:center")   M# G  C6 @0 o8 B9 l
    col_stddevs_train <- attr(train_data, "scaled:scale")6 o+ @* R2 Q% u; u& Z/ X
    test_data <- scale(test_data, center = col_means_train, scale = col_stddevs_train)* c$ y) H2 V- L% B4 T# A* |* T
    6 {# _! F/ h4 T( f  d( d* E: \
    3. 构建网络

    创建模型

    4 H9 V; T7 p# E- ]5 A
    build_model <- function() {& e* {/ Q+ G9 T9 C

    : M1 R. \$ b: F# }  model <- keras_model_sequential() %>%
    2 a* }! Z/ i% i6 S& a! @# U    layer_dense(units = 64, activation = "relu",
    % u. {( V2 I3 y0 R! Q! h8 a) ?: n                input_shape = dim(train_data)[2]) %>%* q! s5 H8 @% l- m  {
        layer_dense(units = 64, activation = "relu") %>%
    - Z* p1 X/ G$ q/ w7 S' M    layer_dense(units = 1)
    5 B6 g: e7 j% x! C* d% H0 }: j. \6 ]. P+ R- t3 q
      model %>% compile(
    7 A+ r: y5 U7 B6 c; ]    loss = "mse",
    1 R  l/ ^* v" p$ c* ~# D; _    optimizer = optimizer_rmsprop(),
    ! X$ K! ?, B8 ?. _) s+ ]2 O7 h    metrics = list("mean_absolute_error")3 I3 K2 s8 Z' T) F9 N# G
      )
    # L  Q6 P" _& R/ D& r# |7 d
    5 g. \  h$ |% g  model, P7 z- V) T& [  ^. E4 i
    }) Z% M; l& H" S2 U. b

    6 n" z7 ^3 ~8 K3 S8 Wmodel <- build_model()  j& T! {6 H  M% _' ^
    model %>% summary()
    # V6 F7 H$ X, `+ l( G5 m/ o( W& _; o- R- L- @) M

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

    4. 训练模型
    3 I9 O4 t4 r4 c* V  g6 [# Display training progress by printing a single dot for each completed epoch.- n8 }9 t( j3 {
    print_dot_callback <- callback_lambda(! y) p8 T1 G" ~) \
      on_epoch_end = function(epoch, logs) {0 N/ A# |9 A9 Z4 s. \! a6 B
        if (epoch %% 80 == 0) cat("\n")1 c- j) y  n* ]) b. u7 c
        cat("."); ]) r7 ~, X" {
      }
    8 y! Q# z$ G6 `( B0 ?. \' y, P)   
    ' P* h* I; Z8 O7 L, w# k6 g% Q1 O6 ~9 ?- m! R( I
    epochs <- 500
    ( r5 U  Q( q& f' r6 m; ^  I4 W
    / |% B0 |0 W) r. e. M/ T" j2 K1 \! D# Fit the model and store training stats
    ! _" p' X3 C  j* z' [( Q2 ahistory <- model %>% fit(5 i7 a* B: u4 g+ \, f& F3 V+ ]9 `/ O
      train_data,
    $ ^5 p# H) }5 j  train_labels,
    . u. m" y7 k# A% l4 p: d6 V" L; x  epochs = epochs,
    2 Z. Q, e8 ?. c6 H8 `; \6 q7 X5 y  validation_split = 0.2,
    4 ]1 ?# a2 y) Y' Y4 w" P  o  verbose = 0,
    - @# `: V" [7 t8 X: H( M+ S  callbacks = list(print_dot_callback)
    7 c6 w7 ~4 g* `6 Q, d9 S! ^/ K)
    0 @3 o9 W2 K# C% w. }  r
    3 W) }: L; f0 ]: d0 W9 ulibrary(ggplot2)
    2 i# P5 g7 M- P. s* W) j" l5 ?( m. v  K: y
    plot(history, metrics = "mean_absolute_error", smooth = FALSE) +
    . E( k! g  B" r7 R/ g. M  coord_cartesian(ylim = c(0, 5))
    4 Y) t7 M6 J9 y0 w  l" r3 `) u
    5 Q! o3 N$ v  ~, f) o* f1 N- K. v6 {5 g; x5 h- p
    " Z4 R& V$ F9 t9 b* o
    小结
    6 X* S7 `+ Q4 y9 T% F1)回归常用的损失函数是均方误差(MSE)。+ K0 X- M4 F! k; E( z* o" x5 T
    2)常见的回归指标是平均绝对误差(MAE)。
    % j/ i) N( c5 J7 a3)如果输入数据的特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。
    * N( `% {- y4 x) B: G7 T+ q. {4)如果可用训练数据很少,最好使用隐藏层较少(通常只有1~2个)的小型网络,以避免严重的过拟合。% p" `7 }0 d  F" u

    " b0 V; k6 D7 o" W/ U
    0 I+ ~" j1 c$ j8 z5 G
    5 Z8 m/ W& e* P9 w
    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 01:12 , Processed in 0.388053 second(s), 51 queries .

    回顶部