Scikit-learn模型score方法报错:无法将字符串标签转为浮点数
问题分析与解决方案
让我来帮你排查这个问题,你遇到的ValueError: could not convert string to float: 'positive'本质上是因为你错误地修改了模型输入数据和标签的形状,导致分类模型的评分流程被错误当成了回归任务处理。
核心问题所在
看你代码里的这两行:
X_train = np.array(X_train).reshape((-1,1)) y_train = np.array(y_train).reshape((-1,1))
这完全是画蛇添足的操作,直接破坏了数据的正确格式:
- 原本
X_train是TF-IDF生成的二维特征矩阵(形状为(样本数, 2500)),和你训练模型时的输入维度完全匹配 - 你把它reshape成
(-1,1)后,变成了(样本数*2500, 1)的一维特征列,模型根本无法识别这种输入(它期望2500个特征,现在只有1个) - 同时
y_train被reshape成二维数组(样本数,1),而scikit-learn的分类器score方法期望标签是一维数组(形状(样本数,)),二维标签会被错误判定为回归任务的连续型目标,进而尝试把字符串标签转成浮点数,最终触发报错
修复步骤
删除不必要的reshape操作
直接去掉那两行reshape代码,保留train_test_split输出的原始X_train和y_train即可。确保加载模型时的输入数据格式正确
如果是用新数据测试,需要先通过同一个TF-IDF向量器转换(注意用transform而不是fit_transform,避免重新拟合词汇表):# 假设你保存了vectorizer,加载后处理新数据 new_data_tfidf = loaded_vectorizer.transform(new_text_data).toarray()验证模型保存与加载的正确性
确保你保存的是RandomForestClassifier实例,而不是误保存了回归模型。保存代码应该是这样的:import pickle # 训练完成后保存模型和向量器 with open('text_classifier.pkl', 'wb') as f: pickle.dump(text_classifier, f) with open('tfidf_vectorizer.pkl', 'wb') as f: pickle.dump(vectorizer, f)加载时:
with open('text_classifier.pkl', 'rb') as f: pickle_model = pickle.load(f) with open('tfidf_vectorizer.pkl', 'rb') as f: loaded_vectorizer = pickle.load(f)
修复后的完整测试代码示例
# 假设你已经加载了pickle_model和原始的X_train、y_train(未reshape) print(f"X_train shape: {X_train.shape}") # 应该输出 (样本数, 2500) print(f"y_train shape: {y_train.shape}") # 应该输出 (样本数,) score = pickle_model.score(X_train, y_train) print("Test score: {0:.2f} %".format(100 * score))
这样就能正常计算分类模型的准确率了,不会再出现字符串转浮点数的错误。
内容的提问来源于stack exchange,提问作者ApeLincoln
相关产品推荐
相关产品推荐

