gpt4 book ai didi

python - 多个 scikit 学习管道的奇怪行为

转载 作者:太空狗 更新时间:2023-10-30 01:17:48 27 4
gpt4 key购买 nike

我正在使用 sklearn 训练一个模型,我的一系列训练需要运行两个不同的特征提取管道。

出于某种原因,每个管道都可以毫无问题地拟合数据,并且当它们按顺序出现时,它们也可以毫无问题地转换数据。

但是,当第二条管道已安装后调用第一条管道时,第一条管道已被更改,这会导致尺寸不匹配错误。

在下面的代码中,您可以重新创建问题(我已经大大简化了它,实际上我的两个管道使用不同的参数,但这是一个可重现性最低的示例)。

from sklearn.pipeline import Pipeline
from sklearn.decomposition import TruncatedSVD
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

vectorizer = CountVectorizer()

data1 = ['foo bar', 'a foo bar duck', 'goose goose']
data2 = ['foo', 'duck duck swan', 'goose king queen goose']

pipeline1 = Pipeline([('vec', vectorizer),('svd', TruncatedSVD(n_components = 3))]).fit(data1)

print(pipeline1.transform(data1))

# Works fine

pipeline2 = Pipeline([('vec', vectorizer),('svd', TruncatedSVD(n_components = 3))]).fit(data2)

print(pipeline2.transform(data2))

# Works fine

print(pipeline1.transform(data1))

# ValueError: dimension mismatch

很明显,“pipeline2”的安装在某种程度上干扰了“pipeline1”,但我不知道为什么。我希望能够同时使用它们。

最佳答案

发生了什么:

当您首先定义 vectorizer 时,会发生以下情况:

  1. 您创建vectorizer
  2. 你适合第一个管道:

    • 已安装矢量化器,输出 dim 为 (3,4),例如 3 个元素,4 个单词:foo、bar、duck、goose
    • svd 适合有 4 列作为输入
  3. 你适合第二条管道:

    • 再次安装向量化器,这次输出 6 个词(例如列):foo、duck、swan、goose、king、queen
    • 安装了另一个 svd,此处不相关
  4. 你回调第一个管道:

    • 向量化器输出一个 (3,6) 矩阵,使用最后一次匹配的单词,例如第二个管道
    • svd 已适合接受 4 列作为输入,引发异常。

如何验证这一点:

vectorizer = CountVectorizer()

data1 = ['foo bar', 'a foo bar duck', 'goose goose']
data2 = ['foo', 'duck duck swan', 'goose king queen goose']

pipeline1 = Pipeline([('vec', vectorizer)]).fit(data1)
print(pipeline1.transform(data1).shape)

(3, 4)

# Works fine
pipeline2 = Pipeline([('vec', vectorizer)]).fit(data2)
print(pipeline2.transform(data2).shape)

(3, 6)

# Works fine

# vectorizer = CountVectorizer()
print(pipeline1.transform(data1).shape)

(3, 6)

如何解决:

你只需要在管道中包含向量化器的定义,就像这样:

from sklearn.pipeline import Pipeline
from sklearn.decomposition import TruncatedSVD
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd


data1 = ['foo bar', 'a foo bar duck', 'goose goose']
data2 = ['foo', 'duck duck swan', 'goose king queen goose']

pipeline1 = Pipeline([('vec', CountVectorizer()),('svd', TruncatedSVD(n_components = 3))]).fit(data1)

print(pipeline1.transform(data1))

# Works fine

pipeline2 = Pipeline([('vec', CountVectorizer()),('svd', TruncatedSVD(n_components = 3))]).fit(data2)

print(pipeline2.transform(data2))

# Works fine

print(pipeline1.transform(data1))

关于python - 多个 scikit 学习管道的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683995/

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