QQ登录

只需要一步,快速开始

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

搞 AI 建模预测都在用 Python,其实入门用 SPL 也不错

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

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-7 15:33 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    搞 AI 建模预测都在用 Python,其实入门用 SPL 也不错, t3 d8 x* T/ e8 k  R6 M
    : }% T. k5 L" f" e& n
    可用来做人工智能建模预测的工具非常多,比如Python, R, SAS,SPSS等,其中Python由于简单易学、丰富的数据科学库、开源免费等特点备受欢迎。但是对于不太熟悉数据建模算法的程序员来说,使用Python建模还是比较复杂,很多时候拿到数据并不清楚该做怎样的处理,选择什么样的算法。其实,在做数据分析和数据建模时,SPL也是不错的选择,它比Python更简单易用,计算速度也快,交互式的界面对数据分析十分友好,同时还提供自动数据建模功能和一些数据处理以及统计学函数,用起来也很方便。
    + ]0 |' }0 w1 S% ~! c
    2 h4 J0 @0 N( S下面就以一份用户贷款违约预测的数据为例,使用SPL手把手的进行数据建模预测。6 J% Z2 k5 D, N$ X' j' ^

    * V9 \7 h4 {! h1. 确定目标,准备数据8 R1 X( H# H6 p3 E
    建模预测就是从历史数据中挖掘出规律,然后使用规律对未来可能发生的事情做出预测。这个规律就是一般所说的模型。' |! w: N& G% Q' z. E$ X, |: P
    + W$ C( Q4 G$ W- Z; q
    历史数据通常是一张我们俗称的宽表,比如在用户贷款违约预测的例子中历史数据是如下图这样的Excel表格:
    4 t! E& D2 e. M; K
    ; p/ m1 B  d2 ^* Y首先,宽表中一定要包括我们想预测的事情,通常称作预测目标,上图中的预测目标就是历史用户的违约行为,也就是图中y那一列,yes表示违约,no表示不违约。预测目标还可以是一个数值,比如产品的销量、售价……,或者是预测属于什么种类,比如预测产品质量是优、良、合格还是差。有时目标在原始数据里就有,可以直接使用,有时目标还需要人工标注。
    # E) \9 B* Q* h) s
    & c( O6 Q4 v# e  X1 Y* J除了预测目标外,这里还需要很多信息,如表中的用户年龄、工作,房产,贷款情况……,这里的每一列称为变量,也就是和贷款人将来是否违约可能会相关的信息,原则上能收集到的变量越多越好。例如预测客户是否会购买产品,可以搜集客户的行为信息,购物偏好,以及产品的特征信息,促销力度等;预测汽车保险理赔风险,需要保单数据,车辆信息、车主交通习惯以及历史理赔情况等等,如果是预测健康险还需要一些被保人的生活习惯,身体状况,就医看病的信息;预测商场超市的销售情况,需要历史的销售订单,客户信息,商品信息;预测不良产品,需要生产的工艺参数,环境,原料情况等数据。总之,收集到的相关信息越多,预测效果也会越好。
    & J* K; o' O, x8 g
    ( _/ l2 t* D2 ]2 M4 D( C采集数据时,通常会截取某一段时期的历史数据来制作宽表,比如我们想预测7月份用户的违约情况,可以采集1-6月份的数据来训练建立模型。数据采集的时间范围并不是固定的,可以灵活操作,例如也可以是近1年或者近3个月等等。
    5 A! ~# p) E3 e( M: q' x% c
    " h7 \" K9 g0 R准备好的宽表可以是Excel格式或csv格式,第一行是标题,后面每一行都是一条历史记录。) I3 m+ `) G$ ?- A
    2 v5 z/ h9 n" \# }; |: H/ \
    如果企业有建设好的信息系统,那可以找IT部门要这些数据,很多企业的BI系统中可以直接导出这种数据。- t: d& _4 Y7 z( \3 T, ]' _8 M
    $ D! L' G8 A; F$ O# E  V6 A' N$ c
    2. 下载软件,配置建模外部库
      F5 G' Z9 v7 E0 Z0 |; D" N# vSPL 在易明建模外部库的配合下可以提供全自动化的建模预测功能。3 e7 ], j8 V$ Y0 \

    , w! r  J( m) [- U9 D(1)下载安装集算器(SPL)和易明建模软件
    6 o* U4 l+ @! P; L7 Z集算器下载:- ?2 ~" s3 L& G  T
    “http://c.raqsoft.com.cn/article/1595816810031”5 c1 i8 c2 n* R+ t( u1 {* `
    9 L7 H) L2 J5 D
    易明建模下载: “http://www.raqsoft.com.cn/download/download-ymodel”7 p' T, w  A# S7 }. T: i

    " J6 W' V  J) e5 J$ H& Z; |安装集算器和建模软件,并记录安装目录,比如:C:\Program Files\raqsoft\ymodel5 ~8 E. e0 l& h0 {' U

    % `5 a* v0 l6 |7 F
    7 _( A* ]9 v, j
    - [# {$ ]0 {  l1 q3 z2 W! b' E6 a  C+ _(2)在SPL中配置外部库
      w1 B9 l$ ]' X3 g# o(a)复制外部库所需要的文件# B; z" f8 p2 o& v
    在易明建模的安装目录下找 YModelCil 和 lib 文件夹: m' B: _" d* V2 m+ U3 u* o
    0 R1 q- p  ]1 W* S& p
    * M& Y+ l" p; ~) S# C; L5 x

    , `/ {& c( X. a) t5 N+ [$ s+ P' q然后去这两个文件夹里找到建模外部库所需要的文件,复制到集算器目录(【安装根目录】\esProc\extlib\YModelCil),比如C:\Program Files\raqsoft\esProc\extlib\YModelCli。; Z" P# g- p! l! U% p; e$ B) D: M

    . Q* N. _& H- Z6 h; |建模外部库所需的文件有:
    8 _* |; T% v2 K6 y/ a5 M9 j( ^2 a/ z5 W5 _5 P0 _
    1>易明建模目录的YModelCil中含有以下jar和xml
    - {/ `7 N7 p0 f; J
    7 b, k$ Z0 u) s( B) c) s) nant-1.8.2.jar- a3 w! a9 F! B( F6 X$ h3 _8 d
    commons-beanutils.jar/ @% H1 l6 s/ e3 H" o$ v1 Q
    commons-lang-2.6.jar
    5 e% i1 {0 w5 m( ?- `% yezmorph-1.0.2.jar
    8 Y5 @' C. h5 D# C2 rjson-lib-1.1-jdk13.jar: L# m9 X/ r. b2 p0 _
    raq-ymodel-cli-2.10.jar0 {, r0 M1 ~& E) W2 x
    userconfig.xml: L/ Y+ m& k$ e# W# W/ w
    * u8 \0 p" c* N7 S# ]5 P
    2>易明建模的lib中含有以下jar, I8 _  [$ A- ^. _- F2 A
    ) N$ [. q( v1 p' B, u
    commons-io-2.4.jar  ~: W/ q+ s$ v6 ~. e: T
    esproc-ext-20211104.jar6 p; U( R6 a$ B# g  _
    fastjson-1.2.58.jar
    ! P' q% |, \5 z! j$ `& agson-2.8.0.jar+ d5 T) f7 v5 D, t  R9 V
    jackson-annotations-2.9.6.jar8 L# P7 G6 o& }
    jackson-core-2.9.6.jar: V" r/ X, v) D) l
    jackson-databind-2.9.6.jar3 }" K3 l3 E. {$ R: }) _1 t
    jackson-databind-2.9.6-sources.jar6 M6 r0 t9 Y5 \+ M$ a
    jackson-dataformat-msgpack-0.8.14.jar; W+ t8 O# l) l  m
    mining.jar: i+ |. F7 C2 Y! O/ p: @
    msgpack-0.6.12.jar
    7 {4 U; R- C3 A" ^$ bmsgpack-core-0.8.16.jar
    $ @) @7 d! V9 B: a  H
    ; e% X) j: S$ ]. R0 B3 n6 H(b)设置userconfig.xml文件参数
    ' Z0 t2 V# @/ }+ }( ^  O在集算器目录esProc\extlib\YModelCil下的userconfig.xml文件中设置参数% J$ X: Z9 K: ~4 B; k$ l5 A- L$ ]
    6 z9 y2 m$ ]5 g5 R. k
    名称        参数说明0 }& g7 P/ E7 [4 j0 S; j7 r  N
    sAppHome        易明建模的安装目录7 {; }) \6 I; n  f$ [& @) r
    sPythonHome        易明建模目录的Python路径 Windows: raqsoft\ymodel\Python37 Linux: raqsoft/ymodel/Python37/bin/python3.7
    ; [+ a% I$ ~; v& T( \4 NiPythonServerPort        Python服务网络端口( Z. P7 s/ f: C
    iPythonProcessNumber        Python进程数
    * Y  I, a. F+ m% D+ ^" SbAutoDecideImpute        是否智能补缺
    ) I6 {& R) }$ GiResampleMultiple        重抽样次数1 A. S. w% Z! `7 y) d
    其中必须要配置的参数为sAppHome和sPythonHome,其他参数可以采用默认值,有需要再进行修改。比如可以配置参数如下,加粗部分是必须要配置的,根据自己的安装路径。
    1 _' o4 f! h( X! ~8 S; d- ]! ^9 Y8 V* z4 Q$ g8 _4 b0 l0 J
    <?xml version="1.0" encoding="UTF-8"?>
    7 a# m0 e$ g0 K! H$ c<Config Version="1">
    0 e7 }, W7 v1 |$ ^    <Options>
    , N# q4 K* `/ \* H: E6 ?        <Option Name="sAppHome" Value="C:\Program Files\raqsoft\ymodel"/>
    1 g  K$ `' g7 k$ M+ G                <Option Name="sPythonHome" Value="C:\Program Files\raqsoft\ymodel\Python37\python.exe"/>+ _" j9 b$ ^# r$ O3 ~  w
                    <Option Name="iPythonServerPort" Value="8510"/>% B$ |) ]9 i- G" [! z6 @7 X4 ?
                    <Option Name="iPythonProcessNumber" Value="2"/>4 m" f( z/ F! n+ w
                  <Option Name="bAutoDecideImpute" Value="true"/>; @1 t/ o. F" [2 n  S* j6 r
                    <Option Name="iResampleMultiple" Value="150"/>                                ( S3 D6 o. D5 V' ]% {# }) u
        </Options>8 o1 ]8 o  K2 C
    </Config>3 p5 i& d8 i( B( ]
    1
    . `. e8 r2 ?. {5 G7 Z) c26 h6 |7 E; P  y: \
    3
    ! X# ~- E  U9 M4. T* G/ s; `1 [, G9 r6 D, G
    5
    . ?+ r' `5 @. x4 S3 u, i$ R* R6, A& E" w/ Q& ~
    77 a& S+ t" T8 {! N
    8
    7 L' ^- v1 m1 e) M: N( B9 h- W0 q99 B+ Y, U3 t" u' E+ y
    10
    $ [/ T* \+ v2 K  i& r! S11
    + D4 t. o9 f! }* I9 n其实,从这里可以看出,易明建模也是基于Python写的,但它将Python算法做了封装后,程序员就不必再理解算法的数学原理和运行细节了。" `. r! x# K3 K$ @" m+ B4 S) ^( a
    . v, G- @/ J0 r2 p3 U# g
    (c)SPL环境配置
    ; ], {4 q9 b$ d. P  z1>. 配置外部库6 {: B- |1 c- k9 Z7 E
    ' l) ^4 o) u: X( @
    打开SPL,在选项菜单里,外部库选择里勾选YModelCli,使其生效。外部库的路径为第(1)步骤中集算器YModelCli的安装路径。
    ; ^/ v( ]0 f1 w2 @5 N3 v0 m' l: Z/ P' D

    % _" q. g0 z: K
    6 h$ B( D3 l7 s+ ]4 l/ [在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置外部库路径和名称。
    # ?: ?; z2 u% a$ m+ X6 J
    + N( Z6 J$ |& {8 J- _8 j- F' v& X- [<extLibsPath>外部库路径
    1 w. Q3 l$ h6 K$ [! M
    ( _, e% G/ v# P- u1 V- f8 n<importLibs>外部库名称(可多个)4 ~& Z+ z2 P1 @5 _* L4 P

    " F& U0 f3 v" k' e6 ]- e2>. 线程数设置+ A# ?0 ]+ [% z& P% x$ S

    5 x7 E; A8 P" f1 @9 Z如果有并发预测,还需要在SPL设置“最大并行数”,也就是线程数。设置多少用户根据需求和机器情况自行设定。- q6 ?, \" d) j3 j$ S1 S
    8 n# S8 c. B; o% x* k
    $ H2 r  t1 o7 F- e$ U3 e# U2 D
    6 n3 ]+ |# `3 e7 A6 c, h& X* M
    在无图形界面的服务器中去集算器的安装目录下esProc\config\raqsoftConfig.xml文件中进行配置。
    1 h8 z# U, c  G
    0 ?$ |  v1 a, s1 i1 S" O6 L/ v<parallelNum>最大并行数
    % C$ S- o' N' i. G5 i* w7 W
    3 s+ a$ P/ T7 u" }6 c+ U到此,环境配置完成。
    0 [& y# t. j) b
    6 z9 m: i; J: g3. 建模和预测( s& K  G9 f+ j9 T$ `
    (1)加载数据; H: t! j, L! @0 ?5 R# R
    SPL能支持csv,excel或数据库中的数据用于建模,这里以csv为例,其它数据源类似。
    % f5 y4 l! J% n5 b& a* p$ G3 i1 _( H  c7 X' z2 D) k( `
    设有一个贷款违约数据表如下,需要建模来预测新用户是否会发生违约行为。
    & h+ h4 X  t+ T. w2 @' m, C+ W- }6 D: o5 A5 [! |% Z1 Z( g
    4 Y5 A/ {# s' ]3 ?" i4 w
    & d$ ?  T% o2 f8 _" p
    文件命名为bank-full.csv;9 j. J( ]- J. B4 j3 m9 }( z. F
    ! p, p+ R/ c' B6 X  u' }. d
    A
    - Z3 p6 ^/ c/ Q* Y5 d8 ]5 F1        =file("bank-full.csv").import@tc()
    3 F% z1 v  G  w7 G$ H6 M2        =ym_env()& _# m" M) E$ N/ ]
    3        =ym_model(A2,A1)7 M" }! ?- f; K2 i+ D& ^7 h2 o$ A
    A1 导入建模数据,读成序表
    : y3 k; k/ P2 l- \8 p* O
    # n9 d6 m2 O1 G5 q! z0 {7 \+ {& F( N' n' Q7 ]

    3 K+ R1 m  T7 G9 d8 wA2 初始化环境,执行A2后会在易明建模的安装目录下生成store目录及子目录用以保存数据及结果文件。* U! ~' l+ P* \

    9 Q9 V, s8 |- t" y' l  I5 ~A3 加载建模文件,生成md对象5 G. v9 Y6 M, j* k; ]- a

    " E1 W  p, d) l+ r! {8 S) ]4 g(2)目标变量设置和变量统计
    9 x# j; S/ K5 G5 {( ]! g数据加载进来后要设置目标变量
    ! |2 R5 q: L" t  u! G  S/ A; J( U' |& R6 i
    A7 n5 O7 o8 E, P" k
    …        …- T# e2 m; ^# d7 z
    4        =ym_target(A3,"y")
    - U; G0 W1 W1 u, l5        =ym_statistics(A3,"age")
    . a( u/ {3 l, D6        =A1.fname().(ym_statistics(A3,~))
    ! a8 P2 A( n7 }0 Q! D9 n5 }A4 表示将字段“y”设置为目标变量,目标变量可以是二值变量或数值型变量。+ `5 ?6 r& K. X; A5 c/ v
    . ?9 E/ b7 g2 w. I& I; G' M
    A5 查看某个变量的统计指标,比如 “age”,返回值中可以看到缺失率,最大最小值,异常值,数据分布图等参数。& z- \/ f' T: j( W4 I

    3 L5 ^- y& P8 ~' J; |5 \2 A1 U, d) G; A$ A

    $ n- V4 {- q& J5 q! D  {A6 循环变量名查看所有字段的统计信息,返回包含所有字段的统计信息二级序列。
    2 O& k! l3 V. C3 n# @8 R- {! H7 o8 z* y; u$ x# S# X) J

    ' Q/ I# d! h+ I. R) F7 _/ e2 R$ c1 r
    (3)建立模型和模型表现, s# S# D; x4 y' @2 B/ q0 G5 U
    A
    1 H' E, I( i1 u% }…        …9 [4 K# c4 t, F+ l! r- E0 g
    7        =ym_build_model(A3)
    " L% s) e4 n$ K) z6 W8        =ym_present(A7)% l) `. U) Q- y+ F' N/ n
    9        =ym_performance(A7)
    ! I+ Y- K. S5 b10        =ym_importance(A7).sort@z(Importance)0 j" J6 H0 }( x' ]+ F
    A7 使用建模函数建立模型,执行后在后台会进行全自动化数据预处理和建模过程,此过程会耗费一些时间,时间长短取决于数据量。结果返回pd模型对象。
    $ v7 r3 h- ^! p/ Y( r+ D% D4 l0 w9 m+ h
    模型建好后,可以调用pd模型对象查看模型信息、模型质量和重要度。# X& M3 U9 f; g2 @! G4 C/ Q

    6 @0 |+ {6 Y0 @% xA8 返回模型AUC值及参数
    . h! h  |7 j( \) v6 R
    5 w- N, u* M+ C) u6 w# v  t+ J# I% @9 q& L
    % X6 h5 s: Z& k* v0 {
    A9 返回多种模型指标和图形,诸如AUC,ROC, Lift……
    $ s. t  S: v7 p4 }5 l' ]6 G
    ) @" w4 o, ?8 {8 f1 ]- h; |. j
    ( Q( r) E4 Z( B6 |. D: n, H+ `1 u
    ; i/ E4 S! J9 h+ i比如点击A9的第6条记录的Value,然后点击右上角“图形浏览”图标,数值字段选择“Lift”,就可以查看Lift曲线
    " u4 d+ m1 R; p/ {6 j' S% m4 t
    3 ]0 ~0 [2 p. i3 }# q8 A& w  Q' L" f" |8 }

    / t) Z& r; j2 J6 h; V4 ZA10 会返回每个变量对目标变量的影响程度并且按照重要度降序排列。数值越大对目标变量的影响程度越大。降序排列分析起来更加直观。% g) ^" a  \* ]  U2 z  i* k# o
    5 G# `, i; e5 h- S7 N' W+ x
    : N- W4 M2 y; q3 c
    $ V# ]& |! s; u7 u" }: }
    (4)保存模型
    : H6 z' |9 @* k' |/ zA9 r0 u) u$ F4 ^/ q, E( Z
    …        …
    + h9 C6 X  U1 Q3 ~11        =ym_save_pcf(A7,"bankfull.pcf")
    . r8 F3 ^+ D0 Y- P" v' A12        =ym_json(A7); W1 M/ d3 `, J) J, K/ T5 c
    13        >ym_close(A2)
    8 K1 n* x+ D! B3 L6 [6 @6 bA11 将模型保存为”bankfull.pcf”,默认保存路径为[sAppHome]/store/predict。
    $ e* B/ W! Y( @7 v. b  y
    5 _/ R7 p5 z; F9 q, z; X* U, @A12 将模型信息以json串形式返回。json内容详解可参考在线文档《json参数说明》
    8 c- W/ M' N* R/ q4 j6 {1 ]7 X. A1 t/ A$ Z
    A13 关闭环境,释放资源。) u1 v. W. \7 I6 E2 O- v

    , l! H& f0 G9 k. G4 U(5)预测
    8 C9 t1 q) _- p9 e- X/ f预测之前需要有pcf模型文件和预测数据集
    - U0 X9 L) q, U4 i, t
    ! L3 _) u$ f% q! X$ SA' k  G& G: W' S+ w5 u
    1        =ym_env()
    : f2 L+ z/ i: ?& [2        =ym_load_pcf("bankfull.pcf")
    9 U) U1 H2 c3 d% }; S  M1 Q& B3        =file("bank-full2.csv").import@tc()
    , a2 i9 x' k$ m& u+ H  _/ e1 q& ~. Z2 |4        =ym_predict(A2,A3)9 q/ I  W" L6 I+ @8 @1 y& ^5 r* l
    5        =ym_result(A3)* J/ {) l3 V- i0 w$ W
    6        =file("bank-full_result.csv").export@tc(A4)/ @& J" [# y0 n
    7        >ym_close(A1)
    ) D6 @. m; G) p! _* \; A! ^2 QA1 初始化环境4 \! J& J9 F/ {; b$ g+ J( ?

    # M9 ?: R( Z  M) D+ b( tA2 导入pcf模型文件,生成pd模型对象。
    - }4 H6 V" x: a+ e4 |5 C( m/ L- |
    ! I+ o( l% x- G" _- g5 }1 z  IA3 导入预测数据集,读成序表, ^+ V4 o$ B+ ~( Q  x
    - C6 n$ s  c5 J5 g- [, B
    A4 对序表数据执行预测。除序表外,还支持游标、csv文件和mtx文件,比如A4也可以直接写成ym_predict(A2,“bankfull2.csv”)0 b, `- k0 h/ ^% {; ~; N+ x  K+ P

    - @7 ?1 J2 @1 s0 O; l& PA5 获取预测结果
    ( Z0 |/ Q! _- [, a7 G" h5 O) n3 I& g
    A6 将预测结果导出,在本例中预测结果为用户发生违约行为的概率。
    ! j& T! }0 G; k! z- Q4 w: S: C- z$ }& d7 X: d5 @' B7 u
    ; ]; T+ D% H! C* C2 _) G2 s! G
    A7 关闭环境,释放资源" D0 w8 l3 t- F. Y+ x5 {
    - G. d4 b3 Z5 ?; U
    4. 集成调用
    ( w9 x3 R- K# I. ySPL还可以被上层应用集成调用,比如SPL可以嵌入到Java应用,详情请参考:http://c.raqsoft.com.cn/article/1615765346560* k: g4 ^8 _, w7 m0 l! d

    ' D4 e  t) ?# S. s5 A总结9 E! x3 c0 f4 J  |# C
    使用SPL配合易明建模来实现数据建模预测非常简单,程序员不需要理解深奥的数学原理,只要准备好训练数据,简单几步就可以完成数据建模任务了。而且还可以轻松地把这个功能嵌入到应用程序中,高深的人工智能不再是少量数据科学家的专利。' q, v4 E; J. P9 E7 Q% X
    ! ~: F/ i: S! Y0 z5 b( K$ C
    SPL本来就超强的数据处理能力,能更方便地完成人工智能算法之前的数据准备工作,同时也提供了丰富的数学函数: SPL Math 例程,有些数学基础想自己实现建模过程的同学也可以进一步研究。
    : F4 p7 O$ D- \/ \————————————————
    1 K0 [4 L: x5 H+ O版权声明:本文为CSDN博主「java李杨勇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' [  q/ m& |3 L. _原文链接:https://blog.csdn.net/weixin_39709134/article/details/126698462  X6 B1 b& T5 l! o4 z3 W9 N, @8 F

    5 [4 j; y7 N" {3 T) G! E/ t; F# i% Q) d' p0 r) E3 z9 q+ K) b* L
    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-5-30 18:49 , Processed in 0.453014 second(s), 56 queries .

    回顶部