讲讲共线性问题

作者: JSong1122 | 来源:发表于2017-09-23 16:15 被阅读952次

    多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中,例如决策树和贝叶斯,前者的建模过程是逐步递进,每次拆分只有一个变量参与,这种建模机制含有抗多重共线性干扰的功能;后者干脆假定变量之间是相互独立的,因此从表面上看,也没有多重共线性的问题。但是对于回归算法,不论是一般回归,逻辑回归,或存活分析,都要同时考虑多个预测因子,因此多重共线性是不可避免需要面对的,在很多时候,多重共线性是一个普遍的现象。在构造预测模型时如何处理多重共线性是一个比较微妙的议题。既不能不加控制,又不能一刀切,认为凡是多重共线性就应该消除。

    1、共线性的原理

    假设有k个自变量的多元线性回归模型:

    10个特征的VIF

    最后我们试着用模型的方法来检测共线性问题

    from sklearn.linear_model import Ridge
    plt.figure()
    n_alphas = 20
    alphas = np.logspace(-1,4,num=n_alphas)
    coefs = []
    for a in alphas:
        ridge = Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X2, y)
        coefs.append(ridge.coef_)
    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    handles, labels = ax.get_legend_handles_labels()
    plt.legend(labels=[0,1,2,3,4,5,6,7,8,9])
    plt.xlabel('alpha')
    plt.ylabel('weights')
    plt.title('Ridge coefficients as a function of the regularization')
    plt.axis('tight')
    plt.show()
    
    岭回归各个系数的岭迹

    其中当alpha取0.1时,岭回归估计的系数分别为

    >>>print(coefs[0])
    [  2.70748655   0.95748918   3.53687372   5.2073456    8.70186695
       9.84484102  10.67351759  11.74614246   2.46502016   3.19919212]
    

    可以看到第0、1、2、3、8、9个变量都出现了波动,代表它们之间存在一定的共线性。观察岭迹,我们可以考虑剔除其中波动比较大的第1、8、9个变量。

    另外Lasso回归类似,可以用sklearn中的linear_model.Lasso来学习,这里就不展示了。最后对于逻辑回归任务,sklearn函数内部提供了L1或L2正则化方案,通过它们也可以去检测共线性问题。

    参考文献

    [1]. variance inflation factor
    [2]. 多重共线性的解决方法之——岭回归与LASSO
    [3]. ridge regression

    相关文章

      网友评论

      本文标题:讲讲共线性问题

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