小白,用SVM自带函数对训练集建立模型的时候提示参数错误,请问问题该如何解决?

using LIBSVM
using RDatasets#导入库
iris=dataset("datasets","iris")#导入数据集,此数据集为150*5的DataFrame,前四列为Float64,第五列为String
features=Matrix(iris[!,1:4])#特征
labels=Vector(Array(iris[!,5]))#标志
features_train,features_test=features[1:2:end,:],features[2:2:end,:]
labels_train,labels_test=labels[1:2:end,:],labels[2:2:end,:]#此处划分训练集和测试集
model = svmtrain(features_train,labels_train)#建立模型,也是在这一步报错

在最后一步报错:

MethodError: no method matching svmtrain(::Matrix{Float64}, ::Matrix{String})
Closest candidates are:
  svmtrain(::AbstractMatrix{U}) where U<:Real at C:\Users\ASUS\.julia\packages\LIBSVM\IZl0L\src\LIBSVM.jl:307
  svmtrain(::AbstractMatrix{U}, ::AbstractVector{T}; svmtype, kernel, degree, gamma, coef0, cost, nu, epsilon, tolerance, shrinking, probability, weights, cachesize, verbose, nt) where {T, U<:Real} at C:\Users\ASUS\.julia\packages\LIBSVM\IZl0L\src\LIBSVM.jl:307

求问问题解决方法

报错里说第二个参数 labels_train 应该是一个 AbstractVector 而实际上是一个 Matrix.

是的,是这个意思,所以应该怎么改呢,在前面第五行不是已经转换成vecctor类型了吗

labels=Vector(Array(iris[!,5]))#标志

怎么改能够让程序完成正常的机器模型的建立呢?

MethodError 是方法报错,也即输入参数的数据类型错误,报错行是

model = svmtrain(features_train,labels_train)

你应该试试 typeof(features_train), typeof(labels_train) 检查输入类型。


我尝试了下,这里的 labels_train75 x 1 矩阵,并不是向量。你试试把 labels[1:2:end, :] 改成 labels[2:2:end]

(后续新的报错是 DimensionMismatch,这个方向我不在行,调整数据尺寸试试?)


另外,如果切片只是用于查看,没有涉及修改,建议使用 @view 宏,减少内存开销,比如 @view(features[1:2:end,:])

感谢回复,我找到原因了,按你的建议修改后确实有dimensionmismatch的报错,这个是矩阵尺寸不匹配的原因,因为SVM机器模型建模的时候是以每列数据为一个单位建模,所以需要前一个参数(矩阵)的列数和后面向量的长度匹配,所以把前面一个矩阵转置就行。把第七行和第八行改成

labels_train,labels_test=labels[1:2:end],labels[2:2:end]
model = svmtrain(features_train',labels_train)

程序就可以正常运行了