如何以数组作为参数调用scikit-learn的make_pipeline方法?
解决scikit-learn make_pipeline传入数组的问题
你的需求其实可以通过Python的参数解包特性直接实现,完全不需要用eval这种容易出错的方式,而且完全符合你不能修改make_pipeline逻辑的要求。
核心解决方案:使用*操作符解包数组
make_pipeline函数接受的是可变数量的位置参数(也就是一个个estimator对象),而Python的*操作符可以把列表/数组中的元素逐个拆解出来,作为独立的位置参数传递给函数。具体写法如下:
from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 定义你的estimator数组 my_array = [StandardScaler(), LogisticRegression()] # 使用*解包数组,直接传入make_pipeline my_pipeline = make_pipeline(*my_array)
这样调用的效果和你手动写make_pipeline(my_array[0], my_array[1])完全一致,而且不管数组里有多少个estimator,都能一次性传递,非常灵活。
为什么你之前的eval方法无效?
你尝试的eval((', '.join(map(str, my_array))).replace("\n", ""))存在两个关键问题:
- 当你把数组元素转成字符串再用逗号拼接时,得到的内容并不是合法的Python表达式(比如
StandardScaler(), LogisticRegression()这种写法单独放在eval里会报错,因为逗号分隔的两个对象不能直接作为表达式求值)。 - 就算你给表达式加上括号变成
(StandardScaler(), LogisticRegression()),eval后得到的是一个元组,此时你把这个元组传给make_pipeline,相当于只传了一个参数(这个元组对象),而make_pipeline需要的是多个独立的estimator参数,自然无法正常工作。
补充说明
如果你的参数是以字典形式存储的(比如每个estimator的配置参数),可以用**操作符解包字典,但在这个场景下,用*解包列表/数组就完全足够了。
内容的提问来源于stack exchange,提问作者GeoRie
相关产品推荐
相关产品推荐

