gpt4 book ai didi

python - 即使使用训练数据,LIBSVM 也无法准确预测

转载 作者:行者123 更新时间:2023-11-30 09:38:05 24 4
gpt4 key购买 nike

我有以下代码,它获取一组图像,每个训练集中大约 50 个图像,然后创建一个线性模型并尝试对数据进行分类。我也有一个测试集,但它甚至无法以任何准确性对训练数据进行分类。我加载图像的方式是否存在错误?如果有帮助的话,我很乐意提供更多代码或我的输出。

def create_image_list(file_path):
image_list = []
for filename in glob.glob(file_path):
img = Image.open(filename)
img_resized = img.resize((32, 32), Image.ANTIALIAS)
pix = img.load()
pixlist = []
for x in range(0, 32):
for y in range(0,32):
pixlist.append(pix[x,y][0])
pixlist.append(pix[x,y][1])
pixlist.append(pix[x,y][2])
image_list.append(pixlist)
return image_list

dalmation_training = create_image_list('/images/dalmatian/training/*')
dollabill_training = create_image_list('/images/dollar_bill/training/*')
pizza_training = create_image_list('/images/pizza/training/*')
soccer_ball_training = create_image_list('/images/soccer_ball/training/*')
sunflower_training = create_image_list('/images/sunflower/training/*')

c = '1e2'
testing_set = dalmation_training + dollabill_training + pizza_training + soccer_ball_training + sunflower_training

dalmation_y = [1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
dalmation_model_linear = svm_train(dalmation_y, testing_set, '-t 0 -c %s -b 1 -q' % c)

dollabill_y = [-1]*len(dalmation_training ) + [1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
dollabill_model_linear = svm_train(dollabill_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

pizza_y = [-1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
pizza_model_linear = svm_train(pizza_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

soccer_ball_y = [-1]*len(dalmation_training ) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [1]*len(soccer_ball_training) + [-1]*len(sunflower_training)
soccer_ball_model_linear = svm_train(soccer_ball_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

sunflower_y = [-1]*len(dalmation_training) + [-1]*len(dollabill_training) + [-1]*len(pizza_training) + [-1]*len(soccer_ball_training) + [1]*len(sunflower_training)
sunflower_model_linear = svm_train(sunflower_y, testing_set, "-t 0 -c %s -b 1 -q" % c)

print 'dalmation linear'
result1, something, p1 = svm_predict([1]*len(testing_set), testing_set, dalmation_model_linear, "-b 1")
print 'dollabill linear'
result2, something, p2 = svm_predict([1]*len(testing_set), testing_set, dollabill_model_linear, "-b 1")
print 'pizza linear'
result3, something, p3 = svm_predict([1]*len(testing_set), testing_set, pizza_model_linear, "-b 1")
print 'soccer linear'
result4, something, p4 = svm_predict([1]*len(testing_set), testing_set, soccer_ball_model_linear, "-b 1")
print 'sunflower linear'
result5, something, p5 = svm_predict([1]*len(testing_set), testing_set, sunflower_model_linear, "-b 1")

当我运行这个程序并进行一些准确度测量时,最后一个数据集每次的准确度约为 20%,向日葵的准确度接近 100%,其他的准确度接近 5%。我相信我将其设置为 libsvm 的正确格式,但我找不到任何线索。我尝试了从 1e-8 到 1e8 的可能不同的 c 值,并且每个值的准确度略有变化,不超过 5%。

任何意见都将不胜感激,我很乐意提供更多信息!

最佳答案

  1. 您在设计中做出了一个重大假设,即“多个类的每个样本中所有像素的 RGB 像素值创建了可线性区分的独特模式”。根据我的经验,这是不正确的。大多数使用 SVM 处理图像分类问题的人都会寻找比图像中的纯 RGB 或强度值更高级别的特征(例如边缘、角点等),并且已经有几种已知技术在提取有用特征方面效果相对较好(例如HOG 用于行人检测)。 这是迄今为止代码中最大的问题,即使您可能认为接下来的三部分可以更好地回答您有关准确性问题的问题。
  2. 您的负训练集大约是正训练集的 4 倍。默认情况下,Libsvm 不能很好地处理训练中的这种偏差,从而导致超平面严重倾斜。无论如何,您当前的所有 SVM 模型很可能都会为所有测试样本返回 -1。在准备训练集时,通过随机选择一些负样本来调整负样本的数量,使其几乎与正样本的数量相匹配。
  3. 您的测试设计不正确。您将整个 testing_set 列表传递给 svm_predict,对于真正的标签,您传递 [1]*len(testing_set) 这是不正确的。对于 dalmation 模型,真实的类别值应提前计算 dalmation_y
  4. 请记住,您在这里所做的是“测试训练样本的准确性”,这不是一种完全可以接受的测量准确性的方法。相反,您需要将整个样本集分为训练和测试,或者更好地分为训练、验证、测试三个部分,其中训练大约比测试集大 3-4 倍,然后使用训练来训练模型在测试集上进行设置和测试。

关于python - 即使使用训练数据,LIBSVM 也无法准确预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23314153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com