使用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这个子属性。
解决方案
升级库版本
先尝试将cimcb_lite升级到最新版本,可能官方已修复该bug:pip install --upgrade cimcb_lite临时修改库源码
若升级后问题依旧,可手动修改库源码(临时方案,建议后续关注官方更新):- 找到路径
/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的属性,避免后续报错。
- 找到路径
替代方案
若不想修改源码,可换用更成熟的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
相关产品推荐
相关产品推荐

