美文网首页
2019-05-22

2019-05-22

作者: Jason_小菠菜 | 来源:发表于2019-05-22 11:34 被阅读0次

    岭回归

    岭回归通过在系数的大小上加入一个惩罚函数来解决最小二乘法的一些问题。岭系数最小化了一个惩罚的剩余平方和。

    \min_{w}=\parallel{Xw-y}\parallel^2_2+\alpha\parallel{w}\parallel^2_2

    复杂度参数\alpha控制收缩量:如果\alpha越大,收缩量就会越大,因此系数对共线性鲁棒性更强。和其他线性模型一样,岭回归线性模型拟合数组X,y,并且将线性模型的系数储存在coef_成员中。

    from sklearn import linear_model
    reg = linear_model.Ridge(alpha=.5)
    reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
    
    Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
       normalize=False, random_state=None, solver='auto', tol=0.001)
    
    reg.coef_
    
    array([0.34545455, 0.34545455])
    
    reg.intercept_
    
    0.1363636363636364
    

    实例1:将岭函数作为正则化函数绘制出来

    显示了共线性对一个函数系数的影响。岭回归是本例中使用的估计量,每种颜色代表系数向量的不同特征,并显示为正则化参数的函数。这个例子还显示了将岭回归用于高度病态矩阵的有用性。对于这样的矩阵,目标函数变量的微小变化将会导致计算出的权重发生巨大的变化。在这样的情况下,设置一个特定的正则化来减少这种变化(噪声)是很有用的。

    \alpha非常大时,正则化效应支配平方损失函数,系数趋近于0。在趋近于0的过程中,随着\alpha趋近于0,解趋近于普通最小二乘法得出的解,因此系数表现出较大的震荡。在实践中,有必要调整\alpha的值,使两者之间保持平衡。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import linear_model
    
    X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
    y = np.ones(10)
    n_alphas = 200
    alphas = np.logspace(-10, -2, n_alphas)
    
    coefs = [ ]
    for a in alphas:
        ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X, y)
        coefs.append( ridge.coef_)
    
    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    ax.set_xlim(ax.get_xlim()[ : : -1])
    plt.xlabel('alpha')
    plt.ylabel('weights')
    plt.title('Ridge coefficients as a function of the regularization')
    plt.axis('tight')
    plt.show()
    
    output_2.png

    接下来我们逐行分析代码。

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import linear_model
    

    从各种包中导入需要的函数

    X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
    y = np.ones(10)
    n_alphas = 200
    alphas = np.logspace(-10, -2, n_alphas)
    
    print(np.arange(1, 11))
    print(np.arange(0, 10)[ :, np.newaxis])
    print(np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
    print(np.ones(10))
    
    [ 1  2  3  4  5  6  7  8  9 10]
    [[0]
     [1]
     [2]
     [3]
     [4]
     [5]
     [6]
     [7]
     [8]
     [9]]
    [[ 1  2  3  4  5  6  7  8  9 10]
     [ 2  3  4  5  6  7  8  9 10 11]
     [ 3  4  5  6  7  8  9 10 11 12]
     [ 4  5  6  7  8  9 10 11 12 13]
     [ 5  6  7  8  9 10 11 12 13 14]
     [ 6  7  8  9 10 11 12 13 14 15]
     [ 7  8  9 10 11 12 13 14 15 16]
     [ 8  9 10 11 12 13 14 15 16 17]
     [ 9 10 11 12 13 14 15 16 17 18]
     [10 11 12 13 14 15 16 17 18 19]]
    [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
    

    我们使用print函数输出以上的结果,我们可以更好地理解X的值。

    n_alphas = 200
    alphas = np.logspace(-10, -2, n_alphas)
    

    创建一个有200个alpha的列表,列表的开始值是e^{-10},结束值是e^{-2},步长是8/200

    coefs = [ ]
    for a in alphas:
        ridge = linear_model.Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X, y)
        coefs.append( ridge.coef_)
    

    创建模型,没有截距;训练模型;将权重值添加到列表中。

    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    ax.set_xlim(ax.get_xlim()[ : : -1])
    plt.xlabel('alpha')
    plt.ylabel('weights')
    plt.title('Ridge coefficients as a function of the regularization')
    plt.axis('tight')
    plt.show()
    
    output_2.png

    获取坐标,根据alpha和权重的值绘图,设置x轴的显示比例并翻转坐标轴。设置坐标轴的各种参数和图形名称。

    相关文章

      网友评论

          本文标题:2019-05-22

          本文链接:https://www.haomeiwen.com/subject/sxuyzqtx.html