You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cimcb_lite进行PLS_SIMPLS交叉验证时遇AttributeError报错求助

解决cimcb_lite库PLS_SIMPLS模型交叉验证的AttributeError问题

问题场景

运行基于cimcb_lite库的PLS_SIMPLS模型K折交叉验证代码时,触发AttributeError: can't set attribute错误,代码如下:

import cimcb_lite as cb

cv = cb.cross_val.kfold(model=cb.model.PLS_SIMPLS,X=XTknn, 
                        Y=Ytrain, 
                        param_dict={'n_components': [1,2,3,4,5]}, 
                        folds=5, 
                        bootnum=100) 

cv.run()

报错信息

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/folders/rs/f6nsd1894354_821jj157jnr0000gn/T/ipykernel_30013/1292624611.py in <module>
      8 
      9 # run the cross validation
---> 10 cv.run()
     11 

/opt/anaconda3/lib/python3.9/site-packages/cimcb_lite/cross_val/kfold.py in run(self)
     82     def run(self):
     83         """Runs all functions prior to plot."""
---> 84         self.calc_ypred()
     85         self.calc_stats()
     86         if self.bootnum > 1:

/opt/anaconda3/lib/python3.9/site-packages/cimcb_lite/cross_val/kfold.py in calc_ypred(self)
     55             model_i = self.model(**params_i)
     56             # Full
---> 57             model_i.train(self.X, self.Y)
     58             ypred_full_i = model_i.test(self.X)
     59             self.ypred_full.append(ypred_full_i)

/opt/anaconda3/lib/python3.9/site-packages/cimcb_lite/model/PLS_SIMPLS.py in train(self, X, Y)
     77         # Calculates and store attributes of PLS SIMPLS
     78         Xscores, Yscores, Xloadings, Yloadings, Weights, Beta = self.pls_simpls(X, Y, ncomp=self.n_component)
---> 79         self.model.x_scores_ = Xscores
     80         self.model.y_scores_ = Yscores
     81         self.model.x_loadings_ = Xloadings

AttributeError: can't set attribute

原因分析

从报错栈可定位问题根源:PLS_SIMPLS.py的train方法中,代码试图给self.model.x_scores_这类属性赋值,但self.model要么未被正确初始化,要么该属性是只读状态,或者库代码存在笔误——正常情况下,PLS模型的结果应该直接存储在类实例本身,而非self.model这个子属性。

解决方案

  1. 升级库版本
    先尝试将cimcb_lite升级到最新版本,可能官方已修复该bug:

    pip install --upgrade cimcb_lite
    
  2. 临时修改库源码
    若升级后问题依旧,可手动修改库源码(临时方案,建议后续关注官方更新):

    • 找到路径/opt/anaconda3/lib/python3.9/site-packages/cimcb_lite/model/PLS_SIMPLS.py
    • 打开文件,定位到train方法的第79-81行左右,将self.model.xxx的赋值语句改为直接给self赋值:
      # 原代码
      self.model.x_scores_ = Xscores
      self.model.y_scores_ = Yscores
      self.model.x_loadings_ = Xloadings
      # 修改后
      self.x_scores_ = Xscores
      self.y_scores_ = Yscores
      self.x_loadings_ = Xloadings
      
    • 同时需确保test方法中调用的是self的属性,而非self.model的属性,避免后续报错。
  3. 替代方案
    若不想修改源码,可换用更成熟的PLS实现库,比如scikit-learn的PLSRegression,结合其交叉验证工具实现需求,示例代码如下:

    from sklearn.cross_decomposition import PLSRegression
    from sklearn.model_selection import GridSearchCV
    
    # 定义模型和参数网格
    model = PLSRegression()
    param_grid = {'n_components': [1,2,3,4,5]}
    
    # 5折交叉验证
    grid_search = GridSearchCV(model, param_grid, cv=5, n_jobs=-1)
    grid_search.fit(XTknn, Ytrain)
    
    # 查看最优参数和结果
    print("最优参数:", grid_search.best_params_)
    print("交叉验证得分:", grid_search.best_score_)
    

内容的提问来源于stack exchange,提问作者Rey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:35