You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python NLP情感分析项目ValueError无法将字符串转为float错误如何解决?

错误原因
  • 预测阶段输入的原始字符串没有经过文本向量化处理,你搭建的Pipeline仅包含TF-IDF转换和逻辑回归分类两个环节,没有包含文本转数值向量的TfidfVectorizer步骤,模型无法直接处理字符串输入,因此抛出类型转换错误。
  • 现有流程存在数据泄露问题:你先对全量数据集做文本向量化和SMOTE过采样,再划分训练测试集,会导致测试集信息提前泄露到预处理阶段,最终得到的模型评估结果不符合真实效果。
  • 重复计算问题:你已经提前用TfidfVectorizer将文本转换为TF-IDF矩阵,后续Pipeline中又加入了TfidfTransformer做重复的TF-IDF计算,属于冗余逻辑。
修复代码
import pandas as pd
import numpy as np
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline # 改用imblearn的Pipeline支持采样步骤
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,classification_report

# 读取数据
df = pd.read_csv("data/Apple-Twitter-Sentiment-DFE.csv",encoding="ISO-8859-1")
# 这里保留你原本的clean_text预处理逻辑

# 先划分训练测试集,避免数据泄露
x_train_text, x_test_text, y_train, y_test = train_test_split(df["clean_text"], df["sentiment"], test_size=0.2, random_state=42)

# 构建完整Pipeline,包含向量化、过采样、分类三个步骤
logreg = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('smote', SMOTE(random_state=42)),
    ('clf', LogisticRegression(n_jobs=1, C=1e5, max_iter=1000)) # 增加迭代次数避免收敛警告
])

# 训练模型
logreg.fit(x_train_text, y_train)

# 评估模型
y_pred = logreg.predict(x_test_text)
print('accuracy %s' % accuracy_score(y_pred, y_test))
print(classification_report(y_test, y_pred))

# 预测新文本
exl = "this book was so interstening it made me not happy"
print(logreg.predict([exl])) # 注意输入要包装成列表,符合模型输入格式要求
关键修改说明
  • 改用imblearn.pipeline.Pipeline替代sklearn原生Pipeline,可以完美兼容SMOTE采样步骤,自动实现仅对训练集做过采样、不对测试集做采样的正确逻辑,避免数据泄露。
  • 将TfidfVectorizer纳入Pipeline,保证训练和预测阶段的文本向量化逻辑完全一致,无需单独处理新文本的转换步骤。
  • 预测新文本时需要将字符串包装成列表格式,符合predict方法的输入要求。
  • 给逻辑回归增加max_iter=1000参数,避免高维数据下模型不收敛的警告。

内容的提问来源于stack exchange,提问作者DevLeb2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:48:04