如何用Numpy数组解决Scikit-learn预处理管道错误?

2024-04-23 23:42:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用scikit learn建立一个分类器来预测两个句子是否为释义(例如,释义:爱因斯坦有多高,而阿尔伯特·爱因斯坦的长度是多少)。在

我的数据由2列字符串(短语对)和1列目标列(0和1)组成(=无释义,释义)。我想试试不同的算法。在

我希望下面的最后一行代码符合模型。相反,预处理管道不断产生一个我无法解决的错误:“AttributeError:”努比·恩达雷'对象没有'lower'属性。“

代码如下所示,我隔离了在最后一行显示的错误(为了简洁起见,我排除了其余部分)。我怀疑是因为目标列包含0和1,它们不能变为小写。在

我已经在stackoverflow上尝试过类似问题的答案,但到目前为止还没有运气。在

你怎么能解决这个问题?在

question1               question2                        is_paraphrase
How long was Einstein?  How tall was Albert Einstein?    1
Does society place too  How do sports contribute to the  0
much importance on      society?
sports?                 
What is a narcissistic  What is narcissistic personality 1  
personality disorder?   disorder?

======

^{pr2}$

Tags: 代码目标is错误scikitwhatlearnhow
1条回答
网友
1楼 · 发布于 2024-04-23 23:42:24

错误不是因为最后一列,而是因为trainxdataset将包含两列question1和{}。现在这将导致X_train将每一行作为值列表。所以当CountVectorizer试图将其转换为小写时,它将返回一个错误,因为努比·恩达雷不包含lower函数。在

为了克服这个问题,您需要将数据集X_train分成两部分,比如X_train_pt1和{}。然后对这些单独执行CountVectorizer,然后对每个结果执行tfiddtransformer。还要确保在这些数据集上进行转换的对象是相同的。在

最后,将这两个数组堆叠在一起,并将其作为分类器的输入。您可以找到类似的implementation here。在

更新:
我认为以下几点应该会有所帮助(我承认可以进一步改进此代码以提高效率):

def flat_list(my_list):
    return [str(item) for sublist in my_list for item in sublist]


def transform_data(trans_obj_list,dataset_splits):
    X_train = dataset_splits[0].astype(str)
    X_train = flat_list(X_train)

    for trfs in trans_obj_list:
        transformed_vector = trfs().fit(X_train)
        for x in xrange(0,len(dataset_splits)):
            dataset_splits[x] =flat_list(dataset_splits[x].astype(str))
            dataset_splits[x]=transformed_vector.transform(dataset_splits[x])

    return dataset_splits

new_X_train,new_X_test = transform_data([CountVectorizer,TfidfTransformer],[X_train,X_test])

相关问题 更多 >