2016-09-25 80 views
2

私はRには新しく、Rで自分のsvmモデルを保存しようとしていますが、ドキュメントを読みましたが、何が間違っているのか分かりません。Rオブジェクトは行列ではありません

"オブジェクトはマトリックスではありません"というエラーが表示されます。これは、データがマトリックスではないように見えるかもしれませんが、それは...欠けているものです。

私のデータは次のように定義されています。それがあるべきようにこれはそう

​​

:として

data = read.table("data.csv") 
trainSet = as.data.frame(data[,1:(ncol(data)-1)]) 
最後の行は、私のラベル

である私は私のモデルを定義しようとしています

正しいが、私は他の例を探すのに苦労している。

# load libraries 
require(e1071) 
require(pracma) 
require(kernlab) 
options(warn=-1) 

# load dataset 
SVMtimes = 1 
KERNEL="polynomial" 
DEGREE = 2 
data = read.table("head.csv") 
results10foldAll=c() 

# Cross Fold for training and validation datasets 
for(timesRun in 1:SVMtimes) { 
    cat("Running SVM = ",timesRun," result = ") 

    trainSet = as.data.frame(data[,1:(ncol(data)-1)]) 
    trainClasses = as.factor(data[,ncol(data)]) 
    model = svm(trainSet, trainClasses, type="C-classification", 
       kernel = KERNEL, degree = DEGREE, coef0=1, cost=1, 
       cachesize = 10000, cross = 10) 
    accAll = model$accuracies 
    cat(mean(accAll), "/", sd(accAll),"\n") 

    results10foldAll = rbind(results10foldAll, c(mean(accAll),sd(accAll))) 
} 


# create model 

svm.model <- svm(type ~ ., data = trainSet, type='C-classification', kernel='polynomial',scale=FALSE) 

私のサンプルのうちの一つの例は、次のようになります:

ここ
10.135338 7.214543 5.758917 6.361316 0.000000 18.455875 14.082668 31 
+0

再現可能な例がないと難しいです。どのパッケージからの 'svm'関数は' data '引数が行列であると期待していますか?もしそうなら、それはあなたの問題です。 'read.table'は、より高いレベルの構造であるdata.frameオブジェクトとしてデータをインポートします。 'data = as.matrix(trainSet)'を試してください。 – jdobres

+0

@jdobresこれはe1071パッケージからのものです。私は現在のコードを追加しました。私のデータセットは本当に大きいですが、私は例を示しました。私のデータセットは実際に各サンプルに対して約3000の特徴を持っていますので、ここでは簡略化しました。 – badner

+0

'model.matrix()'や 'sparse.model.matrix()'のようなものを使うとエラーになります(データサイズが大きいためです)。 'svm()'の前に 'sparse.model.matrix()'を使うときのヒントは、コード内のデータを標準化します。 – abhiieor

答えて

1

編成がデータフレームであるが、SVMにここ

は、これまでの私のコードです。モデルの機能データは(trainSetをデータに割り当てる)行列になると予測します。したがって、データ= as.matrix(trainSet)を設定します。これは正常に動作するはずです。

+0

これは意味がありますが、model.frame.defaultのエラー(式=タイプ〜、データ=リスト(V1 = c(21.933418、: オブジェクトは行列ではありません – badner

1

実際、@ user5196900で指摘されているように、svm()を実行するには行列が必要です。ただし、行列オブジェクトは、すべての列が同じデータ型、すべて数値またはすべてのカテゴリ/ファクタを持つことを意味します。これがあなたのデータに当てはまる場合はas.matrix()かもしれません。

実際には、多くの場合、カテゴリ変数のダミー列を与える数値型変数の列を1つ持ちながら、model.matrix()またはsparse.model.matrix()(パッケージMatrix)を使用することがよくあります。しかし確かに行列。

関連する問題