【问题标题】:Issue with usages of `transform` vs. `fit_transform` in CountVectorizer在 CountVectorizer 中使用 `transform` 与 `fit_transform` 的问题
【发布时间】:2019-01-30 23:25:44
【问题描述】:

我已经使用CountVectorizer() 成功地训练和测试了一个逻辑回归模型:

def train_model(classifier, feature_vector_train, label):
    # fit the training dataset on the classifier
    classifier.fit(feature_vector_train, label)

    return classifier

def getPredictions (classifier, feature_vector_valid):    
    # predict the labels on validation dataset
    predict = classifier.predict(feature_vector_valid)

    return metrics.accuracy_score(predict, valid_y)

def createTrainingAndValidation(column):
    global train_x, valid_x, train_y, valid_y
    train_x, valid_x, train_y, valid_y = model_selection.train_test_split(finalDF[column], finalDF['DeedType1'])

def createCountVectorizer(column):
    global xtrain_count, xvalid_count
    # create a count vectorizer object 
    count_vect = CountVectorizer()
    count_vect.fit(finalDF[column])

    # transform the training and validation data using count vectorizer object
    xtrain_count =  count_vect.transform(train_x)
    xvalid_count =  count_vect.transform(valid_x)

createTrainingAndValidation('Test')
createCountVectorizer('Test')
classifier = train_model(linear_model.LogisticRegression(), xtrain_count, train_y, xvalid_count)
predictions = getPredictions(classifier, xvalid_count)

我使用了一个名为 finalDF 的 DataFrame,其中包含所有标记的文本。由于这个模型给了我 0.68 的准确度,我打算在带有未知标签的 DataFrame 子集上对其进行测试。这不包括在培训和测试阶段。我将训练好的模型保存为bestClassifier

现在我得到了未知文本的子集并尝试执行以下操作:

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])
text = unknownDf['Text']
xvalid_count =  count_vect.transform(text)

bestClassifier.predict(xvalid_count)

finalDF 有 800 行,而 unknownDf 在我上面的操作之后只有 32 行。我该如何纠正这个问题?

【问题讨论】:

  • 你能发布错误的内容吗?
  • ValueError: X 每个样本有 4386 个特征;期待 17744
  • 我的意思是完整的错误日志。

标签: python python-3.x scikit-learn countvectorizer


【解决方案1】:

我想我知道发生了什么,在这段代码中:

def createCountVectorizer(column):
    global xtrain_count, xvalid_count
    # create a count vectorizer object 
    count_vect = CountVectorizer()
    count_vect.fit(finalDF[column])

    # transform the training and validation data using count vectorizer object
    xtrain_count =  count_vect.transform(train_x)
    xvalid_count =  count_vect.transform(valid_x)

您正在声明CountVectorizer(),调用fit,然后调用transform。您需要做的是,在unknownDf['Text'] 上使用相同的CountVectorizer()transform

当你这样做时:

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])
text = unknownDf['Text']
xvalid_count =  count_vect.transform(text)

您正在创建一个全新的CountVectorizer(),它为unknownDf['Text'] 创建一个新的词袋,而您应该做的是删除这两行

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])

并让现有的CountVectorizer() FITfinalDF[column] 上使用 transform unknownDf['Text']

找到一种方法来使用您声明为count_vectcreateCountVectorizer(column) 中的CountVectorizer()transform unknownDf['Text']

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 2022-08-20
    • 2021-03-11
    • 2020-11-05
    • 2016-08-25
    • 2020-06-23
    • 2021-02-18
    • 2014-07-13
    相关资源
    最近更新 更多