【问题标题】:Sklearn Pipeline ValueError: could not convert string to floatSklearn Pipeline ValueError:无法将字符串转换为浮点数
【发布时间】:2019-02-06 22:24:00
【问题描述】:

我是第一次玩 sklearn 和 NLP,并认为我理解我所做的一切,直到我不知道如何修复这个错误。以下是相关代码(大部分改编自http://zacstewart.com/2015/04/28/document-classification-with-scikit-learn.html):

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import TruncatedSVD
from sgboost import XGBClassifier
from pandas import DataFrame

def read_files(path):
    for article in os.listdir(path):
        with open(os.path.join(path, doc)) as f:
            text = f.read()
        yield os.path.join(path, article), text

def build_data_frame(path, classification)
    rows = []
    index = []
    for filename, text in read_files(path):
        rows.append({'text': text, 'class': classification})
        index.append(filename)
    df = DataFrame(rows, index=index)
    return df

data = DataFrame({'text': [], 'class': []})
for path, classification in SOURCES: # SOURCES is a list of tuples
    data = data.append(build_data_frame(path, classification))
data = data.reindex(np.random.permutation(data.index))

classifier = Pipeline([
    ('features', FeatureUnion([
        ('text', Pipeline([
            ('tfidf', TfidfVectorizer()),
            ('svd', TruncatedSVD(algorithm='randomized', n_components=300)
            ])),
        ('words', Pipeline([('wscaler', StandardScaler())])),
    ])),
    ('clf, XGBClassifier(silent=False)),
])
classifier.fit(data['text'].values, data['class'].values)

加载到 DataFrame 中的数据是经过预处理的文本,其中包含所有停用词、标点符号、unicode、大写字母等。这是我在分类器上调用 fit 时遇到的错误,其中 ... 表示应该在管道中进行 vecorized 的文档之一:

ValueError: could not convert string to float: ...

我一开始以为 TfidfVectorizer() 不起作用,导致 SVD 算法出错,但是在我从管道中提取每个步骤并按顺序执行它们之后,同样的错误只出现在 XGBClassifer.fit() 上。

让我更困惑的是,我试图在解释器中逐步拆分这个脚本,但是当我尝试导入 read_files 或 build_data_frame 时,同样的 ValueError 出现了我的一个字符串,但这是仅仅在:

from classifier import read_files

我不知道这是怎么发生的,如果有人知道我的明显错误可能是什么,我将不胜感激。试图独自思考这些概念,但遇到这样的问题让我感到非常无能为力。

【问题讨论】:

    标签: python scikit-learn nlp text-classification


    【解决方案1】:

    管道的第一部分是FeatureUnionFeatureUnion 会将它获得的所有数据并行传递给所有内部部件。 FeatureUnion 的第二部分是一个包含单个 StandardScaler 的管道。这就是错误的来源。

    这是您的数据流:

    X --> classifier, Pipeline
                |
                |  <== X is passed to FeatureUnion
                \/
          features, FeatureUnion
                          |
                          |  <== X is duplicated and passed to both parts
            ______________|__________________
           |                                 |
           |  <===   X contains text  ===>   |                         
           \/                               \/
       text, Pipeline                   words, Pipeline
               |                                  |   
               |  <===    Text is passed  ===>    |
              \/                                 \/ 
           tfidf, TfidfVectorizer            wscaler, StandardScaler  <== Error
                     |                                   |
                     | <==Text converted to floats       |
                    \/                                   |
                  svd, TruncatedSVD                      |
                           |                             |
                           |                             |
                          \/____________________________\/
                                          |
                                          |
                                         \/
                                       clf, XGBClassifier
    

    由于将文本传递给StandardScaler,因此引发错误,StandardScaler 只能与数字特征一起使用。

    正如您使用 TfidfVectorizer 将文本转换为数字一样,在将其发送到 TruncatedSVD 之前,您需要在 StandardScaler 之前执行相同的操作,否则只为其提供数字特征。

    看有问题的描述,你打算在TruncatedSVD的结果之后保留StandardScaler吗?

    【讨论】:

    • 太棒了,这很有帮助。我不明白 FeatureUnion 并行化它的输入。 StandardScaler 是我仍在纠结的另一个难题。我读过很多分类器需要它来规范化数据,所以我保留了它
    猜你喜欢
    • 2020-05-25
    • 2018-09-20
    • 2019-02-08
    • 2020-08-26
    • 2020-05-05
    • 2020-01-22
    • 2019-04-27
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多