gpt4 book ai didi

python-3.x - 如何使用 scikit-learn 组合具有不同维度输出的特征

转载 作者:行者123 更新时间:2023-12-04 01:13:53 30 4
gpt4 key购买 nike

我正在使用带有 Pipeline 和 FeatureUnion 的 scikit-learn 从不同输入中提取特征。我的数据集中的每个样本(实例)指的是不同长度的文档。我的目标是独立计算每个文档的最高 tfidf,但我不断收到此错误消息:

ValueError: blocks[0,:] has incompatible row dimensions. Got blocks[0,1].shape[0] == 1, expected 2000.



2000 是训练数据的大小。
这是主要代码:
book_summary= Pipeline([
('selector', ItemSelector(key='book')),
('tfidf', TfidfVectorizer(analyzer='word', ngram_range(1,3), min_df=1, lowercase=True, stop_words=my_stopword_list, sublinear_tf=True))
])

book_contents= Pipeline([('selector3', book_content_count())])

ppl = Pipeline([
('feats', FeatureUnion([
('book_summary', book_summary),
('book_contents', book_contents)])),
('clf', SVC(kernel='linear', class_weight='balanced') ) # classifier with cross fold 5
])

我编写了两个类来处理每个管道功能。我的问题是 book_contents 管道,它主要处理每个样本并独立返回每本书的 TFidf 矩阵。
class book_content_count(): 
def count_contents2(self, bookid):
book = open('C:/TheCorpus/'+str(int(bookid))+'_book.csv', 'r')
book_data = pd.read_csv(book, header=0, delimiter=',', encoding='latin1',error_bad_lines=False,dtype=str)
corpus=(str([user_data['text']]).strip('[]'))
return corpus

def transform(self, data_dict, y=None):
data_dict['bookid'] #from here take the name
text=data_dict['bookid'].apply(self.count_contents2)
vec_pipe= Pipeline([('vec', TfidfVectorizer(min_df = 1,lowercase = False, ngram_range = (1,1), use_idf = True, stop_words='english'))])
Xtr = vec_pipe.fit_transform(text)
return Xtr

def fit(self, x, y=None):
return self

数据样本(示例):
title                         Summary                          bookid
The beauty and the beast is a traditional fairy tale... 10
ocean at the end of the lane is a 2013 novel by British 11

然后每个 id 将引用一个包含这些书的实际内容的文本文件

我试过 toarrayreshape功能,但没有运气。任何想法如何解决这个问题。
谢谢

最佳答案

您可以使用 Neuraxle's Feature Union使用您需要自己编码的自定义木匠。 joiner 是传递给 Neuraxle 的 FeatureUnion 的类,以按照您预期的方式将结果合并在一起。

1. 导入 Neuraxle 的类。

from neuraxle.base import NonFittableMixin, BaseStep
from neuraxle.pipeline import Pipeline
from neuraxle.steps.sklearn import SKLearnWrapper
from neuraxle.union import FeatureUnion

2. 通过从 BaseStep 继承来定义您的自定义类:
class BookContentCount(BaseStep): 

def transform(self, data_dict, y=None):
transformed = do_things(...) # be sure to use SKLearnWrapper if you wrap sklearn items.
return transformed

def fit(self, x, y=None):
return self

3.创建一个joiner以按照您希望的方式加入特征联合的结果:
class CustomJoiner(NonFittableMixin, BaseStep):
def __init__(self):
BaseStep.__init__(self)
NonFittableMixin.__init__(self)

# def fit: is inherited from `NonFittableMixin` and simply returns self.

def transform(self, data_inputs):
# TODO: insert your own concatenation method here.
result = np.concatenate(data_inputs, axis=-1)
return result

4. 最后通过将 joiner 传递给 FeatureUnion 来创建您的管道:
book_summary= Pipeline([
ItemSelector(key='book'),
TfidfVectorizer(analyzer='word', ngram_range(1,3), min_df=1, lowercase=True, stop_words=my_stopword_list, sublinear_tf=True)
])

p = Pipeline([
FeatureUnion([
book_summary,
BookContentCount()
],
joiner=CustomJoiner()
),
SVC(kernel='linear', class_weight='balanced')
])

注意:如果你想让你的 Neuraxle 管道成为 scikit-learn 管道,你可以做 p = p.tosklearn() .

要了解有关 Neuraxle 的更多信息:
https://github.com/Neuraxio/Neuraxle

文档中的更多示例:
https://www.neuraxle.org/stable/examples/index.html

关于python-3.x - 如何使用 scikit-learn 组合具有不同维度输出的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434661/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com