2017-03-12 34 views
2

我有以下的訓練集:使用Rtexttools lib中機器學習

Text,y 
    MRR 93345,1 
    MRR 93434,1 
    MRR 93554,1 
    MRR 938900,1 
    MRR 93970,1 
    MRR 937899,1 
    MRR 93868,1 
    MRR 938769,1 
    MRR 93930,1 
    MRR 92325,1 
    MRR 931932,1 
    MRR 933922,1 
    MRR 934390,1 
    MRR 93204,1 
    MRR 93023,1 
    MRR 930982,1 
    MRR 87678,-1 
    MRR 87956,-1 
    MRR 87890,-1 
    MRR 878770,-1 
    MRR 877886,-1 
    MRR 87678367,-1 
    MRR 8790,-1 
    MRR 87345,-1 
    MRR 87149,-1 
    MRR 873790,-1 
    MRR 873493,-1 
    MRR 874303,-1 
    MRR 874343,-1 
    MRR 874304,-1 
    MRR 879034,-1 
    MRR 879430,-1 
    MRR 87943,-1 
    MRR 879434,-1 
    MRR 871984,-1 
    MRR 873949,-1 

我的代碼如下:

# Create the document term matrix 
dtMatrix <- create_matrix(data["Text"],language="english", removePunctuation=TRUE, stripWhitespace=TRUE, 
          toLower=TRUE, 
          removeStopwords=TRUE, 
          stemWords=TRUE, removeSparseTerms=.998) 

# Configure the training data 
container <- create_container(dtMatrix, data$y, trainSize=1:nrow(dtMatrix), virgin=FALSE) 
# train a SVM Model 
model <- train_model(container, "SVM", kernel="linear" ,cost=1) 

# new data 
predictionData <- list("MRR 93111") 

# create a prediction document term matrix 
predMatrix <- create_matrix(predictionData, originalMatrix=dtMatrix,language="english", removePunctuation=TRUE, stripWhitespace=TRUE, 
          toLower=TRUE, 
          removeStopwords=TRUE, 
          stemWords=TRUE, removeSparseTerms=.998) 

# create the corresponding container 
predSize = length(predictionData); 
predictionContainer <- create_container(predMatrix, labels=rep(0,predSize), testSize=1:predSize, virgin=FALSE) 

# predict 
results <- classify_model(predictionContainer, model) 

現在使用train_model功能,我想預測:MRR 93111因爲y = 1。 這意味着如果字符串以「MRR 93」開頭,則輸出應爲1,而詞幹「MRR 87」則爲-1。其實它不起作用,因爲我得到了MRR 93111 -1 0.5778781

此外,如果我以不同的方式對訓練集進行整理,或者如果我針對相同的數據集多次運行該腳本,似乎結果會發生變化聽起來對我來說很奇怪。

UPDATE1:dput(數據)

structure(list(Text = structure(c(26L, 28L, 30L, 34L, 36L, 31L, 
32L, 33L, 35L, 21L, 24L, 27L, 29L, 25L, 22L, 23L, 10L, 20L, 14L, 
13L, 12L, 11L, 15L, 3L, 1L, 5L, 4L, 7L, 9L, 8L, 16L, 18L, 17L, 
19L, 2L, 6L), .Label = c("MRR 87149", "MRR 871984", "MRR 87345", 
"MRR 873493", "MRR 873790", "MRR 873949", "MRR 874303", "MRR 874304", 
"MRR 874343", "MRR 87678", "MRR 87678367", "MRR 877886", "MRR 878770", 
"MRR 87890", "MRR 8790", "MRR 879034", "MRR 87943", "MRR 879430", 
"MRR 879434", "MRR 87956", "MRR 92325", "MRR 93023", "MRR 930982", 
"MRR 931932", "MRR 93204", "MRR 93345", "MRR 933922", "MRR 93434", 
"MRR 934390", "MRR 93554", "MRR 937899", "MRR 93868", "MRR 938769", 
"MRR 938900", "MRR 93930", "MRR 93970"), class = "factor"), Y = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, -1L, 
-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 
-1L, -1L, -1L, -1L, -1L, -1L)), .Names = c("Text", "Y"), class = "data.frame", row.names = c(NA, 
-36L)) 
+0

你能爲我們提供dput而不是寫出來你的訓練集的? – JonGrub

+0

UPDATE1:你需要這個嗎? – unclejohn00

回答

1

你的問題是,您的代碼使用的詞級別的訓練數據和分類。

> dtMatrix$dimnames$Terms 
[1] "87149" "871984" "87345" "873493" "873790" "873949" "874303" "874304" "874343" "87678" "87678367" 
[12] "877886" "878770" "87890" "8790"  "879034" "87943" "879430" "879434" "87956" "92325" "93023" 
[23] "930982" "93111" "931932" "93204" "93345" "933922" "93434" "934390" "93554" "937899" "93868" 
[34] "938769" "938900" "93930" "93970" "mrr" 

我不entirly肯定的SVM如何excatly對待這些數字字符串,但它似乎沒有在乎弦的93部分。分割字符串成caharcter規定對個人數字更大的重量:

df$Text <- sapply(1:length(df$Text), function(i) paste(unlist(strsplit(df$Text[i], split = "")), collapse = " ")) 

我使用的DF而不是數據,因爲數據是在RTextTools已經是一個對象,並在運行你的代碼給了我一些問題。爲了創建矩陣,必須改變最小字長的選項。

dtMatrix <- create_matrix(df$Text,language="english", minWordLength=1, #! 
          removePunctuation=TRUE, stripWhitespace=TRUE, 
          toLower=TRUE, removeStopwords=TRUE, 
          stemWords=TRUE, removeSparseTerms=.998) 

現在,我們得到:

> dtMatrix$dimnames$Terms 

[1] 「0」 「1」 「2」 「3」 「4」 「5」 「6」 「7」 「8」「9 「‘M’,‘R’

而且更重要的是:

> results 
    SVM_LABEL SVM_PROB 
1   1 0.9144185 

我是一個關於RTextTools和SVM車間最近,他們指出,與SVM你每次訓練模型的時間獲得稍有不同的結果。我不完全確定,爲什麼我不會試圖解釋,但我們推薦了一本名爲「統計學習與R中的應用程序簡介」的免費書籍來閱讀支持向量機。

下面是完整的代碼:

df <- structure(list(Text = structure(c(26L, 28L, 30L, 34L, 36L, 31L, 
             32L, 33L, 35L, 21L, 24L, 27L, 29L, 25L, 22L, 23L, 10L, 20L, 14L, 
             13L, 12L, 11L, 15L, 3L, 1L, 5L, 4L, 7L, 9L, 8L, 16L, 18L, 17L, 
             19L, 2L, 6L), .Label = c("MRR 87149", "MRR 871984", "MRR 87345", 
                   "MRR 873493", "MRR 873790", "MRR 873949", "MRR 874303", "MRR 874304", 
                   "MRR 874343", "MRR 87678", "MRR 87678367", "MRR 877886", "MRR 878770", 
                   "MRR 87890", "MRR 8790", "MRR 879034", "MRR 87943", "MRR 879430", 
                   "MRR 879434", "MRR 87956", "MRR 92325", "MRR 93023", "MRR 930982", 
                   "MRR 931932", "MRR 93204", "MRR 93345", "MRR 933922", "MRR 93434", 
                   "MRR 934390", "MRR 93554", "MRR 937899", "MRR 93868", "MRR 938769", 
                   "MRR 938900", "MRR 93930", "MRR 93970"), class = "factor"), Y = c(1L, 
                                    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, -1L, 
                                    -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 
                                    -1L, -1L, -1L, -1L, -1L, -1L)), .Names = c("Text", "Y"), class = "data.frame", row.names = c(NA, 
                                                           -36L)) 



df$Text <- as.character(df$Text) 
# new data 
df[nrow(df)+1,] <- c("MRR 93111","") 
df$Text <- sapply(1:length(df$Text), function(i) paste(unlist(strsplit(df$Text[i], split = "")), collapse = " ")) 

# Create the document term matrix 
dtMatrix <- create_matrix(df$Text,language="english", minWordLength=1, 
          removePunctuation=TRUE, stripWhitespace=TRUE, 
          toLower=TRUE, removeStopwords=TRUE, 
          stemWords=TRUE, removeSparseTerms=.998) 


dtMatrix$dimnames$Terms 
dtMatrix$dimnames$Docs 

# Configure the training data 
container <- create_container(dtMatrix, df$Y, trainSize=1:36, testSize = 37, virgin=TRUE) 

container <- create_container(dtMatrix, 
           labels=df$Y, trainSize=1:36, testSize = 37, virgin=TRUE) 

# train a SVM Model 
model <- train_model(container, "SVM",kernel="linear" ,cost=1) ##?? 

results <- classify_model(container,model) 

results 
+0

非常感謝JonGrub,你已經明確了這個問題。 順便說一句,我還沒有得到爲什麼「stripWhitespace」標誌實際上不工作。根據我的理解,它應該刪除空格,這樣訓練集就不會空白,例如:「MRR 93345」應該變成「MRR93345」並且被視爲一個獨特的詞位。 在這種情況下,我們將有一個較少的分散矩陣,並且匹配「MRR93」的預測的可能性絕對更高。 但也許我錯過了什麼...... – unclejohn00

+1

你對stripWhitespace做了什麼錯誤的想法。來自tm help:「具有多個空白字符的文本文檔摺疊爲一個空白字符」。這可以是有用的,因爲文本被分成單詞的方式是從一個空白提取到下一個。但是,在RTexTools中,它似乎根本不起作用,因爲stripWhitespace = TRUE或FALSE具有相同的結果。嘗試用'dtMatrix < - create_matrix(「MRR bla 93111」,stripWhitespace = TRUE)''和'dtMatrix $ dimnames $ Docs' – JonGrub

+0

好吧,我的想法就像trim()函數一樣工作,而它只是基本上減少了N個空格到1.例如:[MRR/x20/x20/x2093111] - > [MRR 93111] – unclejohn00