Python使用svm模型时出现测试集和训练集的准确率都是0.5


import numpy as np
from sklearn import svm
from sklearn import model_selection
from sklearn.feature_extraction.text import TfidfVectorizer

import pandas as pd

# 读取数据
data = pd.read_csv('评论数据.csv', encoding='utf-8')
data = data[['pl', 'label']]

# 处理评论文本中可能存在的缺失值或无效字符
data = data.dropna()  # 去除缺失值
data = data[data['pl'].apply(lambda x: isinstance(x, str))]  # 保留字符串类型的评论文本

# 将评论文本列和标签列分开
x = data['pl']
y = data['label']

# 创建 TF-IDF 特征提取器
tfidf_vectorizer = TfidfVectorizer()

# 将评论文本转换为 TF-IDF 特征向量
x_tfidf = tfidf_vectorizer.fit_transform(x)

# 随机分配训练数据和测试数据
data_train, data_test, tag_train, tag_test = model_selection.train_test_split(x_tfidf, y, random_state=1, test_size=0.3)

# 定义SVM(支持向量机)模型
clf = svm.SVC(C=0.5, kernel='linear', decision_function_shape='ovr')

# 训练SVM 模型
clf.fit(data_train, tag_train)

# 打印训练集和测试集的准确率
'''print('training prediction: %.3f' % clf.score(data_train, tag_train))
print('test data prediction: %.3f' % clf.score(data_test, tag_test))'''

def show_accuracy(a, b, tip):
     acc = a.ravel() == b.ravel()
     print('%s Accuracy:%.3f' % (tip, np.mean(acc)))

def print_accuracy(clf, data_train, tag_train, data_test, tag_test):
     # 分别打印训练集和测试集的准确率
     # score(x_train, y_train):表示输出x_train, y_train 在模型上的准确率
     print('training prediction:%.3f' % (clf.score(data_train, tag_train)))
     print('test data prediction:%.3f' % (clf.score(data_test, tag_test)))
     # 原始结果与预测结果进行对比
     # predict() 表示对x_train 样本进行预测,返回样本类别
     show_accuracy(clf.predict(data_train), tag_train, 'training data')
     show_accuracy(clf.predict(data_test), tag_test, 'testing data')
     # 计算决策函数的值,表示x到各分割平面的距离
print('decision_function:\n', clf.decision_function(data_train))
print_accuracy(clf, data_train, tag_train, data_test, tag_test)

img


请问一下,这个代码为什么测试集和训练集的准确率都是0.5呀?应该怎么解决这个问题呀?

img


数据集长这个样子

可以检查下过滤后的数据量,从贴的图看17条里面就3条有效数据。。。

【以下回答由 GPT 生成】

首先,0.5的准确率可能表示模型存在一些问题或者数据特征不适合模型。下面我会为您提供一些优化代码的建议来提高模型的准确率。

  1. 数据清洗和预处理:从问题描述来看,你已经去除了缺失值和非字符串评论文本,这是一个好的开始。但还可以进行其他的数据清洗和预处理的步骤来进一步提高模型的准确率,如去除停用词、词干提取、去除特殊字符等。建议使用NLTK库来完成这些任务。

  2. 调整模型参数:

  3. 更改SVM核函数:尝试使用其他的SVM核函数,例如多项式核函数(poly)、高斯核函数(rbf)等,看看是否能够获得更好的准确率。
  4. 调整正则化参数C:通过调整SVM模型的正则化参数C来控制模型的容错性。一般来说,较小的C值会导致模型更容易容忍错误分类,较大的C值会使模型更强调训练集的准确性。你可以尝试不同的C值,看看是否有所改善。

  5. 特征工程:

  6. 更改特征提取方法:除了使用TF-IDF特征提取器之外,还可以尝试其他的特征提取方法,例如词袋模型(CountVectorizer)或词嵌入模型(Word2Vec)等。不同的特征提取方法可能会对模型的准确率产生影响。
  7. 增加特征:考虑添加其他与目标变量相关的特征,如文本长度、文本中包含的特定词汇的数量、情感分析等。这些额外的特征可能会提供更多的信息以改善模型性能。

  8. 模型评估和调优:

  9. 使用交叉验证:使用交叉验证来评估模型的性能,以减轻数据集分布的影响。可以通过使用cross_val_score函数来评估模型在不同的训练集和测试集上的准确率,并选择最佳的参数组合。
  10. 网格搜索:尝试使用GridSearchCV函数来搜索在给定参数空间内的最佳模型参数组合。GridSearchCV可以帮助你快速找到最佳的参数,以提高模型的准确率。

综上所述,这些是优化你的代码以提高模型准确率的一些建议。请注意,在进行这些优化步骤之前,务必对数据进行进一步的分析和理解,以便选择正确的优化方法。此外,请记得评估每个步骤的改进效果,以便确定做出相应的调整和改进。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^