实现 SVM 时出错
Error in implementing 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表示dog.The文件格式为:
0.270150 0.070257 0.040265 0.037243 0.013678 :0
注意:特征向量大小在1765*1左右只是为了问问题我给的大小为5*1.The问题是特征向量是一个字符串,我想转换它变成一个浮点数组,以提供给 SVM.This 我得到的错误:
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
这个错误是因为你的文件有这样的行:
f1 f2 f3 f4 ............................................f1565 :0
如您所见,特征之间用白色 space 分隔,整个特征向量与标签之间用冒号 (:) 分隔。
现在在您的代码中,您使用的是 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]
这是我的猫狗图像识别代码:
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表示dog.The文件格式为: 0.270150 0.070257 0.040265 0.037243 0.013678 :0
注意:特征向量大小在1765*1左右只是为了问问题我给的大小为5*1.The问题是特征向量是一个字符串,我想转换它变成一个浮点数组,以提供给 SVM.This 我得到的错误:
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
这个错误是因为你的文件有这样的行:
f1 f2 f3 f4 ............................................f1565 :0
如您所见,特征之间用白色 space 分隔,整个特征向量与标签之间用冒号 (:) 分隔。
现在在您的代码中,您使用的是 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]