pandas SKLearn VotingClassifier抛出了一个关于参数不可迭代的问题?

af7jpaap  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(149)

这可能看起来有点简单化,老实说,我已经花了几个小时看这个,并尝试来回,现在不能看到木材从树上。
当我试图将dataFrameseries拟合到votingClassifer时,我经常陷入同样的错误,即zip参数不可迭代。
我目前有以下安排:

​def MethodName(Data, Models):
    YColumn = list(Data["target"].values) # Pandas.series = Data["target"]
    XColumn = Data.drop([~ArrayOfColumnsToDrop~],axis=1).to_records() #Pandas.DataFrame =Data[...]
    model = VotingClassifier(estimators=Models, voting='hard')
    model.fit(XColumn, YColumn)
    return(model, score)

当前返回以下错误:

/opt/conda/lib/python3.7/site-packages/sklearn/ensemble/_voting.py in fit(self, X, y, sample_weight)
    322         transformed_y = self.le_.transform(y)
    323 
--> 324         return super().fit(X, transformed_y, sample_weight)
    325 
    326     def predict(self, X):

/opt/conda/lib/python3.7/site-packages/sklearn/ensemble/_voting.py in fit(self, X, y, sample_weight)
     63     def fit(self, X, y, sample_weight=None):
     64         """Get common fit operations."""
---> 65         names, clfs = self._validate_estimators()
     66 
     67         if self.weights is not None and len(self.weights) != len(self.estimators):

/opt/conda/lib/python3.7/site-packages/sklearn/ensemble/_base.py in _validate_estimators(self)
    245                 " of (string, estimator) tuples."
    246             )
--> 247         names, estimators = zip(*self.estimators)
    248         # defined by MetaEstimatorMixin
    249         self._validate_names(names)

TypeError: zip argument #1 must support iteration

我的理解是,它希望X或Y参数都是可迭代的,并且两者都是:`
第一次
我对它的理解有限,这意味着两者都是可迭代数组;其中YColumn数组是1d [条目,条目,[...],条目],XColumn数组是[(元组),(元组),[...],(元组)]的1d。
以前的尝试:

  • 只需分别将两者作为panda.series和panda.dataFrame传入即可
  • 让YColumn是一个元组数组,格式为[(0,Y),(1,Y),...,(D,Y)]。
  • 使用test_train_split。这导致了与现在相同的关于zip迭代器的错误消息。

查看文档,它指出需要:
形状的X{类似阵列的稀疏矩阵}(n个样本,n个特征)
这会是问题所在吗?以普通形式传递dataFrame肯定是类似数组的形式吗?
我错过了什么?

nqwrtyyt

nqwrtyyt1#

事实证明,我是一个傲慢的程序员,过于依赖于跟踪抛出错误消息的位置,而不是从头到尾阅读它们。Kaggle Notebooks没有IDE意义上的调试器,但事实证明,我可以将%debug添加到code block的开头,它将提供一个传统的调试器。
问题并不在于上面提到的.fit()方法和数据类型,而是我传递了错误的估计量。我传递了一个[estimator1,estimator2,estimator3]的列表,而实际上它需要[("str",estimator1),("str",estimator2),...]。它甚至在示例中声明了,但我太专注于它是一个数据类型问题。
我现在要认真思考一下我的傲慢和拖延是如何导致我浪费了一个星期的时间。尽管为了公平起见,我确实决定,如果我在19:30之前没有得到答案,我就自己写VotingClassifier。
不要相信错误消息,只读最后一部分,试着找到一个调试器,彻底阅读该死的文档和错误消息。
"这完全是我的愚蠢"

相关问题