【问题标题】:Partial Least Squares Variance Explained by components in sklearn偏最小二乘方差由 sklearn 中的组件解释
【发布时间】:2014-10-05 15:40:29
【问题描述】:

我正在尝试使用来自 sklearn 的代码执行 PLSRegression,并且我想保留那些解释某种程度的差异的组件,例如在 PCA 中。

有没有办法知道 PLS 中每个组件解释了多少方差

【问题讨论】:

    标签: scikit-learn pls


    【解决方案1】:

    我也有计算每个组件的解释方差的相同要求。我是 PLS 的新手,不是以英语为母语的人,请参考我的解决方案。

    背景: 如果您选择“deflation_mode”作为“回归”,这是默认选项。估计的 Y 可以通过 "PLSRegression"[1] 中的这个表达式来计算:

    Y = TQ' + Err

    其中 T 是 x_scores_,Q 是 y_loadings_ 该表达式可以提供来自所有主成分的估计 Y。因此,如果我们想知道第一主成分解释了多少方差,我们可以使用 x_scores_ 和 y_loadings_ 的第一个向量来计算估计的 Y1:

    Y1 = T[0]Q[0]' + Err

    请参阅下面的 Python 代码,该代码计算每个组件的 R 平方。

    import numpy as np
    from sklearn.cross_decomposition import PLSRegression
    from sklearn.metrics import r2_score
    
    pls = PLSRegression(n_components=3)
    pls.fit(X,Y_true)
    r2_sum = 0
    for i in range(0,3):
            Y_pred=np.dot(pls.x_scores_[:,i].reshape(-1,1),pls.y_loadings_[:,i].reshape(-1,1).T)*naY.std(axis=0, ddof=1)+naY.mean(axis=0)
            r2_sum += round(r2_score(Y_true,Y_pred),3) 
            print('R2 for %d component: %g' %(i+1,round(r2_score(Y_true,Y_pred),3)))
    print('R2 for all components (): %g' %r2_sum) #Sum of above
    print('R2 for all components (): %g' %round(r2_score(Y_true,pls.predict(X)),3)) #Calcuted from PLSRegression's 'predict' function.
    

    输出:

    R2 for 1 component: 0.633
    R2 for 2 component: 0.221
    R2 for 3 component: 0.104
    R2 for all components: 0.958
    R2 for all components: 0.958
    

    [1] 请注意这个表达式。 'score'、'weight'和'loading'的术语和值在不同的计算方法中可能会略有不同。

    【讨论】:

    • 你的脚本有什么不妥?
    • @B.Gees 抱歉,我好像忘记粘贴缩放过程了。 'naY' 是缩放前的响应变量,即原始训练数据。
    猜你喜欢
    • 2019-12-09
    • 2012-07-13
    • 2014-04-12
    • 2018-03-01
    • 2018-07-06
    • 2010-11-17
    • 1970-01-01
    • 2017-05-14
    • 2013-02-20
    相关资源
    最近更新 更多