数学建模社区-数学中国

标题: 岭回归 [打印本页]

作者: 2744557306    时间: 2024-3-15 17:22
标题: 岭回归
代码执行了以下操作:
, X7 b5 i6 P0 k/ N: l( |
+ P9 D: @& _" |1 U, \* G, h1.导入所需库:
  1.    import numpy as np
    7 z; N" f" k/ T3 @

  2. * i1 @* M, `0 M9 F8 O& \) ^
  3.    import pandas as pd' |: ~/ E5 ]0 [6 X, w9 t# M

  4. 1 P% [, T3 D$ U2 g0 W9 Q
  5.    import matplotlib.pyplot as plt
    2 v0 w4 _# e* Y$ t" Y5 h3 j

  6. ) _$ Q2 A; j2 u$ l5 v$ F: k; i% o
  7.    from sklearn.linear_model import Ridge, RidgeCV
复制代码
2.定义源数据:
  1.    df = pd.DataFrame({
    - _+ c% e8 O- u

  2. ! S2 T7 h9 ^6 H: y0 S
  3.        'x1': [7, 1, 11, 11, 7, 11, 3],
    ) {- t, ~4 |$ E
  4. 3 N0 u- v7 o6 y
  5.        'x2': [26, 29, 56, 31, 52, 55, 71],8 ]  b6 j1 h% N' j5 a
  6. 4 H/ P" ~) Z1 y$ ^' L3 U
  7.        'y': [78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7],
    ; _" |6 O- X% k

  8. $ `) D/ i4 s, ^! ~: e0 s
  9.    })
复制代码
创建了一个包含两个自变量(x1 和 x2)和一个因变量(y)的 DataFrame。
, d' i3 g! M) P; {" s  U
; W$ g$ l  K9 k6 V4 n' @3.将数据转换为数组格式:
  1.    X = np.array(df[['x1', 'x2']])  # 特征集
    - z% S& [0 ?0 c! j& u* j
  2. 7 ]: [' I$ i# P  v
  3.    y = np.array(df[['y']])          # 目标集
复制代码
4.遍历不同的正则化参数 ( k ):
  1.    k_array = np.logspace(-4, 1.5, 100)
    7 o9 O6 B! [% {# Q

  2. % k# ^, U9 [' z. ~, A
  3.    x1_list, x2_list = [], []
    ' z2 y" i0 x& D$ Q5 X. C% I

  4. ' S/ w/ d$ r  q" V- d% F! Z( R3 [2 f
  5.    for k in k_array:
    ; Z) G7 W8 a0 z, ~: f) P
  6. ' V" y% ^& s+ w4 ?* X
  7.        model = Ridge(alpha=k).fit(X, y)
    3 ]3 b. S6 A! V& E2 x6 d
  8. 1 J  w" y, @6 _" m  L4 L4 N
  9.        x1_list.append(model.coef_[0][0]); T" Z7 Z( q! b  X0 j

  10. 5 G/ u0 H% L% o4 h/ [
  11.        x2_list.append(model.coef_[0][1])
复制代码
遍历了一系列正则化参数 ( k ),对每个参数值使用 Ridge 回归模型拟合数据,并将得到的系数存储到 x1_list 和 x2_list 中。
* U# w, X6 u( A) @& x; y% S' W6 D! g, U% n4 V; h4 f
5.绘制岭迹图:
  1.    plt.scatter(k_array, x1_list)
    . d. k/ y: `0 \

  2. $ h& x9 e% N: i3 e) F' ]# F* j7 u9 O
  3.    plt.scatter(k_array, x2_list)
    . v3 m0 R5 B4 o6 C& S, w

  4. : F* O  A/ |1 ?0 G( V
  5.    plt.plot(k_array, x1_list, label='x1')
    % b% s! u+ x% s0 }( P& y
  6. ; J# Y- ~- e$ x" n$ }
  7.    plt.plot(k_array, x2_list, label='x2')% k  J2 B( v2 }& q! p

  8. : M. l: {. Y7 Y0 O: L
  9.    plt.legend()
复制代码
绘制了岭迹图,展示了不同正则化参数 ( k ) 下,系数 ( b1 ) 和 ( b2 ) 的变化趋势。1 ~! v# k: }1 l2 c$ v
& W0 f& m/ u  u. ^
6.自动匹配最佳 ( k ) 值:
  1.    model2 = RidgeCV().fit(X, y)
复制代码
使用 RidgeCV 自动匹配最佳正则化参数 ( k ) 并拟合数据。
0 L  v/ o8 d% j4 R% e  n/ d4 J: n5 x  m5 Z, E  k
7.输出最佳模型的参数和拟合优度:
  1.    b0 = model2.intercept_[0]  # 截距4 U5 e! n& t% N/ n5 K

  2. & i' E# a7 e4 [& g
  3.    b1, b2 = model2.coef_[0][0], model2.coef_[0][1]  # 系数8 V) s. O! @1 Y3 x, h. {1 E
  4. 7 f# S7 F8 Q  }. F1 D  K" s
  5.    print('y = {:.4f} + {:.4f}*x1 + {:.4f}*x2'.format(b0, b1, b2))
    4 h* x) k) u* x

  6. ( a% |; c0 b: X
  7.    print('R_square =', model2.score(X, y))
    ; K. n8 e+ e0 T+ g3 G1 ^" `9 U
  8. 7 l; m2 d, k" U0 ~
  9.    print('k =', model2.alpha_)
复制代码
输出了最佳模型的截距、系数、拟合优度以及对应的最佳正则化参数 ( k )。
5 k! h- n2 e+ D" S% M3 c. N通过这段代码,你可以对 Ridge 回归模型进行正则化,并选择最佳的正则化参数来提高模型的泛化能力。同时,岭迹图可以帮助你直观地观察不同正则化参数下模型系数的变化趋势。: d3 D* M0 e9 r9 J  ~
# C. P. h) D0 P- V

* c! |! W! A& {1 H5 ?5 L; P& K# x5 }1 H7 V
: X# X% _; \0 o4 S2 M  D
/ ]( _! Z- S( m; T, u

12.ridge_regression.py

1.17 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5