2017-02-15 15 views
3

これは実際に完全に有用な質問のコピーであり、その回答は質問者が(部分的に)到達しました。原題: "テキスト分析のためにRの神経回路モデルに512文字以上の数式"。彼は最終的に問題を解決しましたが、彼が与えた推論は間違っていました。そして、その質問を削除し、コメントと彼の解決策を見えなくすることによってそのエラーを複合化しました。ニューラルネットへの公式のエラー


2つのバケットのいずれかでウェブサイトを分類するための神経ネットモデルに適合しようとしています。トレーニングデータ機能は、ウェブサイト上のすべてのリンクの単語です。たとえば、1つのウェブサイトには、「自宅」、「約」、「連絡先」、「製品」などの機能があります。クラス列のデータフレーム、トレーニングの各単語の列各行には、そのウェブサイトに表示される各単語のクラス(修飾または非修飾)と0と1があります。

妥当な回数が表示される単語のリストは〜1000であり、それらのすべてを機能として使用したいと考えています。しかし、数式には225文字の制限があるようですので、私はそうすることができません。

再現可能な出力を得るためのデータセットはありませんが、ここでは自分のコードとエラーが表示されます。

私は式を実行しようとした場合、それが切断されます:私はas.formulaを使用する場合

nn.model <- neuralnet(paste("class ~ ", paste(clean.features, collapse = "+", sep = "")), data = training.data, 
       hidden = num.nodes) 
       ) 
Error in parse(text = x, keep.source = FALSE) : :2:0: unexpected end of input 1: ranty+recipes+contract+just+inventory+types+working+wine+hampshire+suppliers+rise+body+selection+laurel+trek+arlington+cabinet+citrus+advertisers+rhode+highway+intl+province+jewelers+cycles+wy 

同じことが起こります。

f <- as.formula(paste("class ~ ", paste(clean.features, collapse = "+", sep = ""))) 
Error in parse(text = x, keep.source = FALSE) : :2:0: unexpected end of input 1: ranty+recipes+contract+just+inventory+types+working+wine+hampshire+suppliers+rise+body+selection+laurel+trek+arlington+cabinet+citrus+advertisers+rhode+highway+intl+province+jewelers+cycles+wy 

私はすべての機能を使用しようとすると回避策のための

nn.model <- neuralnet(class ~ . , data = training.data, 
       hidden = num.nodes, 0)) 
       ) 
Error in terms.formula(formula) : '.' in formula and no 'data' argument 

> sessionInfo() 
R version 3.3.2 (2016-10-31) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200) 

任意のアイデア:データセットでは、それは、「データ」の引数は(あるにもかかわらず)が存在しないと言いますか?

+0

オリジナルへのリンク:http://stackoverflow.com/questions/42235474/formulas-with-more-than-512-characters-for-neuralnet-model-in-r-for-text-analysi –

答えて

1

概要:

  • 問題:reformulate(c(paste(sep="","X",1:5), "for", paste(sep="","X",1:5)), quote(Y))
  • ソリューション:逆パース(引用符( `for`)、バックティック= TRUE)

詳細:

次の行をデバッグした後、R言語で予約されたキーワードの評価に関するエラーであることに同意します。 termtextのテキストが解析され、そのエラーを再現するにはR

Browse[3]> termtext 
# [1] "response ~ X1+X2+X3+X4+X5+for+X1+X2+X3+X4+X5" 

Browse[3]> n 
debug: rval <- eval(parse(text = termtext, keep.source = FALSE)[[1L]]) 

Browse[3]> n 
# Error in parse(text = termtext, keep.source = FALSE) : 
# <text>:1:30: unexpected '+' 
# 1: response ~ X1+X2+X3+X4+X5+for+ 
#        ^

によって評価されたときに

reformulate(c(paste(sep="","X",1:5), "for", paste(sep="","X",1:5)), quote(Y)) 

実際のエラーが発生し、私は一人で+キーワード接尾辞forを評価し、私はプログラム終了を得ました。

eval(parse(text = "for+", keep.source = FALSE)) 
# Error in parse(text = "for+", keep.source = FALSE) : 
# <text>:1:4: unexpected '+' 
# 1: for+ 
#  ^

完全なデバッグトレース:

Browse[3]> n 
debug: if (!is.character(termlabels) || !length(termlabels)) stop("'termlabels' must be a character vector of length at least one") 
Browse[3]> n 
debug: has.resp <- !is.null(response) 
Browse[3]> n 
debug: termtext <- paste(if (has.resp) "response", "~", paste(termlabels, 
                   collapse = "+"), collapse = "") 
Browse[3]> ls() 
# [1] "has.resp" "intercept" "response" "termlabels" 
Browse[3]> has.resp 
# [1] TRUE 
Browse[3]> intercept 
# [1] TRUE 
Browse[3]> response 
# Y 
Browse[3]> termlabels 
# [1] "X1" "X2" "X3" "X4" "X5" "for" "X1" "X2" "X3" "X4" "X5" 

Browse[3]> n 
debug: if (!intercept) termtext <- paste(termtext, "- 1") 
Browse[3]> termtext 
# [1] "response ~ X1+X2+X3+X4+X5+for+X1+X2+X3+X4+X5" 

Browse[3]> n 
debug: rval <- eval(parse(text = termtext, keep.source = FALSE)[[1L]]) 

Browse[3]> n 
# Error in parse(text = termtext, keep.source = FALSE) : 
# <text>:1:30: unexpected '+' 
# 1: response ~ X1+X2+X3+X4+X5+for+ 
#        ^

EDIT:

ソリューション: このような計算が避けられない場合は、1が最初のR言語のキーワードを識別かもしれませんその後、それの周りにdeparse()関数を使用すると、tの評価がなくなりますそのレベルのキーワードとしての裾を代わりにテキストとして評価します。

reformulate(c(paste(sep="","X",1:5), deparse("for"), paste(sep="","X",1:5)), quote(Y)) 
# Y ~ X1 + X2 + X3 + X4 + X5 + "for" + X1 + X2 + X3 + X4 + X5 

ただし、モデル作成中にinvalid modelというエラーが発生します。より良い方法は、deparse()関数内のキーワードを引用し、数式を作成し、データを含むモデルを適用することです。ここで

reformulate(c(paste(sep="","X",1:5), deparse(quote(`for`), backtick = TRUE), paste(sep="","X",1:5)), quote(Y)) 

# Y ~ X1 + X2 + X3 + X4 + X5 + `for` + X1 + X2 + X3 + X4 + X5 

は一例です:

df1 <- data.frame(`for` = 6:10, y = 1:5, stringsAsFactors = FALSE) 
    colnames(df1) <- c('for', 'y') 
    df1 
    # for y 
    # 1 6 1 
    # 2 7 2 
    # 3 8 3 
    # 4 9 4 
    # 5 10 5 

    my_formula <- reformulate(deparse(quote(`for`), backtick = TRUE), 'y') 
    my_formula 
    # y ~ `for` 

    lm(my_formula, data = df1) 
    # Call: 
    # lm(formula = my_formula, data = df1) 
    # 
    # Coefficients: 
    # (Intercept)  `for` 
    #   -5   1 

browser()設定

、あなたのコードをデバッグしてから戻ってそれを変更、options(error = browser)にエラーの閲覧、タイプのグローバル設定を変更するにはoptions(error = NULL)を設定して、エラー時に工場出荷時のデフォルト値にNULLを設定します。

私の上記のデバッグプロセスでは、myfun関数を作成し、browser()コマンドを挿入し、それをソースしました。最後に私がこの関数を呼び出したとき、私はブラウザモードに入った。デバッグプロセスが完了したら、browser()コマンドを機能コードに挿入して削除します。 注:options()を使用して、ブラウザでエラーが発生した場合の工場出荷時のデフォルトのオプションをnullに変更しませんでした。ブラウザ内で使用されるコマンドの詳細(csnQ、など)については

myfun <- function() 
{ 
    browser() 
    reformulate(c(paste(sep="","X",1:5), "for", paste(sep="","X",1:5)), quote(Y)) 
} 

source('myfun.R') 
myfun() 

?browserを参照してください。

+0

洞察を深めるデモンストレーション。ブラウザの使用を許可するオプションの工場出荷時の設定を変更するために、必要なコードを追加することをお勧めします。 –

2

問題を特定するための出発点を提案します。数式自体の長さに問題がある場合は、数式自体を作成するだけで問題を再現することができます。これを試してみてください:

form <- reformulate(clean.features, quote(class)) 

EW、ちょうどそれが私の内部Rパーサーうんざりします入力します。 LHS変数の名前をそのような中央R関数以外の名前に変更してください。おそらく、この:

names(training.data)[ names(training.data) %in% "class"] <- "myclass" 
form <- reformulate(clean.features, quote(myclass)) 

質問者は、私はここに繰り返すことはないよ他のコメントに反応しました。文字の制限が512文字であるという理論は正しくないと言ったが、彼は次に投稿した:

これは、他の投稿に記載されている文字数制限(512)。しかし実際の問題は、 "for"が数式の関数として認識されていたことでした。すべての混乱のために申し訳ありません。ただ正しいではありません


。この問題は、数式の文字数の制限とは関係なく、列の名前が「for」として扱われます。これはRで予約された制御関数であり、数式内の任意の場所で発生しています。このデモンストレーション(示すいくつかの予約語は、それを行うすべてではない)

f <- reformulate(c(paste(sep="","X",1:5), "for", paste(sep="","X",1:5)), quote(Y)) 
Error in parse(text = termtext, keep.source = FALSE) : 
    <text>:1:30: unexpected '+' 
1: response ~ X1+X2+X3+X4+X5+for+ 
           ^
> f <- reformulate(c(paste(sep="","X",1:5), "class", paste(sep="","X",1:5)), quote(Y)) 
# no error ... OK perhaps not a reserved word 
> f <- reformulate(c(paste(sep="","X",1:5), "in", paste(sep="","X",1:5)), quote(Y)) 
Error in parse(text = termtext, keep.source = FALSE) : 
    <text>:1:27: unexpected 'in' 
1: response ~ X1+X2+X3+X4+X5+in 
          ^
> f <- reformulate(c(paste(sep="","X",1:5), "TRUE", paste(sep="","X",1:5)), quote(Y)) 
# no error, so maybe "TRUE" is not reserved and quote(TRUE) is? 

だから用語は機能と名前を共有することができるかどうかの質問を上げることは正しかったを参照してください。その答えは私が期待した通りではありませんでした。誰かがCSの説明をもっと慎重にしたいと思ったら、私はその努力をチェックするのが喜ばしいでしょう。

この問題が発生している他のコンテキストは、ヘルプページを呼び出しprefix- ?演算子です。 ?forのヘルプを取得してください。あなただけの行継続に+プロンプトを取得します。パーザは左括弧を待っています。

関連する問題