实现SVM时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现SVM时出错相关的知识,希望对你有一定的参考价值。

这是我的猫狗图像识别代码:

import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split


filename= 'catdog_datasets.txt'
filename1= 'catdog_datasets.txt'
raw_data = open(filename, 'rt')
raw_data1 = open(filename1, 'rt')
#data = numpy.loadtxt(raw_data,dtype='object',delimiter=":")
features_data = np.loadtxt(raw_data,dtype='object',delimiter=":",usecols=(0))
labels_data = np.loadtxt(raw_data1,dtype='object',delimiter=":",usecols=(1))
print(features_data.shape)
print(labels_data.shape)

#print(labels_data)
#print(features_data)

X_train, X_test, y_train, y_test = train_test_split(features_data,labels_data,test_size=0.2)
print (y_train.shape)
print (y_test.shape)
print (X_train.shape)
print (X_test.shape)


clf = SVC(kernel='linear',C=1.0)
clf.fit(X_train,y_train)
predictions = clf.predict(X_test)

catdog_datsets.txt包含每个猫和狗500张图像的HOG特征向量,标签分配为0表示猫,1表示狗。文件格式为:0.270150 0.070257 0.040265 0.037243 0.013678:0

注意:特征向量的大小约为1765 * 1,只是为了问我给出的大小为5 * 1的问题。问题是特征向量是一个字符串,我想把它转换成一个float数组提供给SVM。这是我得到的错误:

clf.fit(X_train,y_train)
  File "C:UsersTIKA-OPT790-04AppDataLocalProgramsPythonPython36-32libsite-packagessklearnsvmase.py", line 149, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "C:UsersTIKA-OPT790-04AppDataLocalProgramsPythonPython36-32libsite-packagessklearnutilsvalidation.py", line 573, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)
  File "C:UsersTIKA-OPT790-04AppDataLocalProgramsPythonPython36-32libsite-packagessklearnutilsvalidation.py", line 433, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float:0.270150 0.070257 0.040265 0.037243 0.013678
答案

该错误是因为您的文件包含以下行:

f1 f2 f3 f4 ............................................f1565 :0

如您所见,功能由空格分隔,整个特征向量通过冒号(:)与标签分隔。

现在在您的代码中,您正在使用delimiter=":",因此您的features_data将仅包含每行的单个值,如下所示:

f1 f2 f3 f4 ............................................f1565

您还需要将其拆分为多个功能才能正确使用它。

现在numpy.loadtxt本身不支持多个分隔符,因此您必须使用其他选项或解决方法。

  1. 在完成当前程序后拆分features_datafeatures_data = np.array([l.strip().split(' ') for l in features_data])
  2. 推荐:使用pandas.read_csv()all_data = pd.read_csv(raw_data, sep=':|s+', engine='python', header=None) # All but last column features_data = all_data.iloc[:,0:-1] #last column labels_data = all_data.iloc[:,-1]

以上是关于实现SVM时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 SVM 与 SURF 结合使用时出错

检查交叉验证 svm 的敏感性和特异性时出错

使用 LIBSVM 将我的 svm.cpp 文件与我的 C 程序链接时出错

Python 中的 SVM 拟合数据集时出错

在片段中创建自定义列表视图时出错。必需的活动,找到的片段

使用片段从数据库 SQLite 获取数据时出错