实施 SVM 时出错

Posted

技术标签:

【中文标题】实施 SVM 时出错【英文标题】:Error in implementing SVM 【发布时间】:2018-06-07 04:30:33 【问题描述】:

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

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 的问题。问题是特征向量是一个字符串,我想将其转换为数组提供给 SVM 的浮点数。这是我得到的错误:

clf.fit(X_train,y_train)
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\svm\base.py", line 149, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\utils\validation.py", line 573, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\utils\validation.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

【问题讨论】:

请展示一些您的数据样本。两个文件中的一些行。您确定您读取的数据正确吗? 两个文件包含相同的数据,文件很大。它包含特征向量,然后是分隔符“:”,然后是标签“0”或“1”。 数据是这样的:f1 f2 f3 f4 ................... ..........f1565 :0 对于单个图像(即第一行),特征向量由空格字符分隔。每个图像由大小为 1565*1 的向量表示。 【参考方案1】:

错误是因为你的文件有这样的行:

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

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

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

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

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

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

    在当前程序中完成后拆分features_data

    features_data = np.array([l.strip().split(' ') for l in features_data])
    

    推荐:使用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]
    

【讨论】:

是的,你是对的,feature_data 是这样的:'f1 f2 f3 ..f1565' 对于每一行,据我所知应该将其转换为 am 数组像这样浮动[f1,f2,f3,........f1565],那么只有它可以输入SVM?? 使用这个: features_data = np.array([l.split(' ') for l in features_data]),我得到这种格式的数据:[ list(['f1','f2' ,'f3'............'f1565', ' '] 啊,是的。那是因为你的字符串中的最后一个空格。请检查修改后的答案。 不,我将 feature_data 作为字符串数组获取,如下所示: [ list(['f1','f2'...'f1565'])]........ ...据我所知,SVM 只理解数字,它应该被转换成这样的 folats 数组:[ [f1 f2....f1565],[f1 f2 ....f1565]..... .....................]??????? 当我尝试这个时,features_data = features_data.astype(np.float) ,我得到一个错误: features_data = features_data.astype(np.float) ValueError: setting an array element with a sequence。

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

实现SVM时出错

将 SVM 与 SURF 结合使用时出错

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

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

实施 Google Play 游戏时出错

在 CI/CD 实施期间使用 MSBuild 构建 SSIS 项目时出错