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
相关产品推荐
相关产品推荐

