2016-05-13 3 views
2

Ich lese eine ähnliche post related zu diesem Problem, aber ich fürchte, dieser Fehlercode ist etwas anderes. Ich habe eine CSV-Datei mit 8-Beobachtung und 10 Variablen:C50-Code namens Ausfahrt mit Wert 1 (mit Faktor Entscheidung Variable a nicht leere Werte)

> str(rorIn) 

'data.frame': 8 obs. of 10 variables: 
$ Acuity    : Factor w/ 3 levels "Elective ","Emergency ",..: 1 1 2 2 1 2 2 3 
$ AgeInYears   : int 49 56 77 65 51 79 67 63 
$ IsPriority   : int 0 0 1 0 0 1 0 1 
$ AuthorizationStatus: Factor w/ 1 level "APPROVED ": 1 1 1 1 1 1 1 1 
$ iscasemanagement : Factor w/ 2 levels "N","Y": 1 1 2 1 1 2 2 2 
$ iseligible   : Factor w/ 1 level "Y": 1 1 1 1 1 1 1 1 
$ referralservicecode: Factor w/ 4 levels "12345","278",..: 4 1 3 1 1 2 3 1 
$ IsHighlight  : Factor w/ 1 level "N": 1 1 1 1 1 1 1 1 
$ RealLengthOfStay : int 25 1 1 1 2 2 1 3 
$ Readmit   : Factor w/ 2 levels "0","1": 2 1 2 1 2 1 2 1 

Ich rufe den Algorithmus wie folgt aus:

library("C50") 
rorIn <- read.csv(file = "RoRdataInputData_v1.6.csv", header = TRUE, quote = "\"") 
rorIn$Readmit <- factor(rorIn$Readmit) 
fit <- C5.0(Readmit~., data= rorIn) 

Dann bekomme ich:

> source("~/R-workspace/src/RoR/RoR/testing.R") 
c50 code called exit with value 1 
> 

ich andere Empfehlungen bin nach wie zum Beispiel: - Verwenden eines Faktors als Entscheidungsvariable - Vermeiden von leeren Daten

Irgendwelche Hilfe zu diesem ?, Ich lese das ist einer der besten Algorithmus für maschinelles Lernen, aber ich bekomme diesen Fehler die ganze Zeit.

Hier ist das Original-Datensatz:

Acuity,AgeInYears,IsPriority,AuthorizationStatus,iscasemanagement,iseligible,referralservicecode,IsHighlight,RealLengthOfStay,Readmit 
Elective ,49,0,APPROVED ,N,Y,SNF   ,N,25,1 
Elective ,56,0,APPROVED ,N,Y,12345,N,1,0 
Emergency ,77,1,APPROVED ,Y,Y,OBSERVE  ,N,1,1 
Emergency ,65,0,APPROVED ,N,Y,12345,N,1,0 
Elective ,51,0,APPROVED ,N,Y,12345,N,2,1 
Emergency ,79,1,APPROVED ,Y,Y,278,N,2,0 
Emergency ,67,0,APPROVED ,Y,Y,OBSERVE  ,N,1,1 
Urgent ,63,1,APPROVED ,Y,Y,12345,N,3,0 

Vielen Dank im Voraus für jede Hilfe,

David

+1

Sind Ihre Daten nicht zu klein? Sie haben noch mehr Variablen als Beobachtungen, die möglicherweise ein Problem sein können. – Psidom

+0

p> n ist ein Problem, aber selbst dann sind die Daten relativ klein. Der Versuch, ein robustes Modell mit diesen wenigen Beobachtungen zu erstellen, wird normalerweise nicht empfohlen. – zacdav

Antwort

2

Sie müssen Ihre Daten in ein paar Möglichkeiten reinigen.

  • Entfernen Sie die unnötigen Spalten mit nur einer Ebene. Sie enthalten keine Informationen und führen zu Problemen.
  • Konvertieren Sie die Klasse der Zielvariablen rorIn$Readmit in einen Faktor.
  • Trennen Sie die Zielvariable von dem Datensatz, den Sie für das Training bereitstellen.

sollte diese Arbeit:

rorIn <- read.csv("RoRdataInputData_v1.6.csv", header=TRUE) 
rorIn$Readmit <- as.factor(rorIn$Readmit) 
library(Hmisc) 
singleLevelVars <- names(rorIn)[contents(rorIn)$contents$Levels == 1] 
trainvars <- setdiff(colnames(rorIn), c("Readmit", singleLevelVars)) 
library(C50) 
RoRmodel <- C5.0(rorIn[,trainvars], rorIn$Readmit,trials = 10) 
predict(RoRmodel, rorIn[,trainvars]) 
#[1] 1 0 1 0 0 0 1 0 
#Levels: 0 1 

Sie dann Genauigkeit auswerten können, Rückruf und andere Statistiken, die von diesem mit dem aktuellen Wert der Zielvariablen vorhergesagten Ergebnis Vergleich:

rorIn$Readmit 
#[1] 1 0 1 0 1 0 1 0 
#Levels: 0 1 

Des Der übliche Weg besteht darin, eine Verwirrungsmatrix zu erstellen, um die tatsächlichen und vorhergesagten Werte in binären Klassifizierungsproblemen zu vergleichen. Bei diesem kleinen Datensatz kann man leicht erkennen, dass es nur ein falsch negatives Ergebnis gibt. So scheint der Code ziemlich gut zu funktionieren, aber dieses ermutigende Ergebnis kann aufgrund der sehr geringen Anzahl von Beobachtungen trügerisch sein.

library(gmodels) 
actual <- rorIn$Readmit 
predicted <- predict(RoRmodel,rorIn[,trainvars])  
CrossTable(actual,predicted, prop.chisq=FALSE,prop.r=FALSE) 
# Total Observations in Table: 8 
# 
# 
#    | predicted 
#  actual |   0 |   1 | Row Total | 
#--------------|-----------|-----------|-----------| 
#   0 |   4 |   0 |   4 | 
#    |  0.800 |  0.000 |   | 
#    |  0.500 |  0.000 |   | 
#--------------|-----------|-----------|-----------| 
#   1 |   1 |   3 |   4 | 
#    |  0.200 |  1.000 |   | 
#    |  0.125 |  0.375 |   | 
#--------------|-----------|-----------|-----------| 
# Column Total |   5 |   3 |   8 | 
#    |  0.625 |  0.375 |   | 
#--------------|-----------|-----------|-----------| 

Bei einem größeren Datensatz wäre es sinnvoll, wenn nicht notwendig, das Set in Trainingsdaten und Testdaten zu unterteilen. Es gibt eine Menge guter Literatur zum maschinellen Lernen, die Ihnen bei der Feinabstimmung des Modells und seiner Vorhersagen helfen wird.

+0

RHertel, danke für deine Detailantwort. Es funktioniert nach der Behebung des 1-Level-Problems. Ich ziehe es vor, den Algorithmus über: 'fit <- C5.0 (y ~ x1 + x2 + x3, Daten = Zug, Versuche = 10)' aufzurufen.Für lange Formeln speichere ich es vorher mit 'as.formula (einfügen (" a + "," b "))'. Aber es ist nur eine Frage der Vorlieben, ich bekomme das gleiche Ergebnis. Danke vielmals! –

+0

@DavidLeal Gern geschehen! Ich freue mich zu hören, dass es jetzt funktioniert - und es ist beruhigend zu wissen, dass Sie eine große Anzahl von Beobachtungen haben. Was die unterschiedliche Syntax anbelangt, denke ich, dass dies in die Kategorie "mehr als eine Art, eine Katze zu häuten" fällt ;-) Ich war mir der "Formel" -Syntax für C5.0 nicht bewusst, aber es macht sicherlich Sinn. Wenn die Antwort zur Lösung Ihres Problems beigetragen hat, beachten Sie bitte [akzeptieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), indem Sie auf das Häkchen auf der linken Seite klicken . Prost, – RHertel