2016-08-08 53 views
2

Ich versuche ein Modell mit BstTree-Methode zu trainieren und die Konfusionsmatrix auszudrucken. adverse_effects ist mein Klassenattribut.Konfusionsmatrix von bstTree-Vorhersagen, Fehler: 'Die Daten müssen einige Ebenen enthalten, die die Referenz überlappen.'

set.seed(1234) 
splitIndex <- createDataPartition(attended_num_new_bstTree$adverse_effects, p = .80, list = FALSE, times = 1) 
trainSplit <- attended_num_new_bstTree[ splitIndex,] 
testSplit <- attended_num_new_bstTree[-splitIndex,] 

ctrl <- trainControl(method = "cv", number = 5) 
model_bstTree <- train(adverse_effects ~ ., data = trainSplit, method = "bstTree", trControl = ctrl) 


predictors <- names(trainSplit)[names(trainSplit) != 'adverse_effects'] 
pred_bstTree <- predict(model_bstTree$finalModel, testSplit[,predictors]) 


plot.roc(auc_bstTree) 

conf_bstTree= confusionMatrix(pred_bstTree,testSplit$adverse_effects) 

Aber ich bekomme die Fehlermeldung 'Fehler bei confusionMatrix.default (pred_bstTree, testSplit $ adverse_effects): Die Daten einige Stufen enthalten, die den Verweis überlappen.'

max(pred_bstTree) 
[1] 1.03385 
min(pred_bstTree) 
[1] 1.011738 

> unique(trainSplit$adverse_effects) 
[1] 0 1 
Levels: 0 1 

Wie kann ich dieses Problem beheben?

> head(trainSplit) 
    type New_missed Therapytypename New_Diesease gender adverse_effects change_in_exposure other_reasons other_medication 
5  2   1    14   13  2    0     0    0    0 
7  2   0    14   13  2    0     0    0    0 
8  2   0    14   13  2    0     0    0    0 
9  2   0    14   13  2    1     0    0    0 
11 2   1    14   13  2    0     0    0    0 
12 2   0    14   13  2    0     0    0    0 
    uvb_puva_type missed_prev_dose skintypeA skintypeB Age DoseB DoseA 
5    5    1   1   1 22 3.000  0 
7    5    0   1   1 22 4.320  0 
8    5    0   1   1 22 4.752  0 
9    5    0   1   1 22 5.000  0 
11    5    1   1   1 22 5.000  0 
12    5    0   1   1 22 5.000  0 
+0

Sieht aus, als ob Sie Regression nicht klassifizieren. Überprüfen Sie, ob adverse_effects als Faktor in Ihren Daten festgelegt ist. – phiver

+0

Ja, es ist ein Faktor Phiver mit 0 und 1. Auch wenn ich nach der Konvertierung auf numerische vorhersagen bekomme ich den gleichen Fehler – SaikiHanee

+0

Versuchen Sie, ein Beispiel für Ihre Daten hinzuzufügen. Es ist schwer zu erkennen, wo das Problem liegt. – phiver

Antwort

0

max(pred_bstTree) [1] 1.03385
min(pred_bstTree) [1] 1.011738

und Fehler sagt alles. Plotting ROC prüft einfach die Wirkung verschiedener Schwellenwerte. Basierend auf der Schwellenrundung geschieht z.B. 0.7 wird in 1 (TRUE-Klasse) umgewandelt und 0.3 wird 0 (FALSE-Klasse); falls der Schwellenwert 0,5 ist. Schwellenwerte liegen im Bereich von (0,1)

In Ihrem Fall werden Sie unabhängig vom Schwellenwert immer alle Beobachtungen in die TRUE-Klasse bekommen, da die Mindestvorhersage sogar größer als 1 ist. (Deshalb fragte sich @phiver, ob Sie das tun) Regression statt Klassifizierung). Ohne irgendeine Null in der Vorhersage gibt es keinen Pegel in der "Vorhersage", der mit dem Nullpegel in adverse_effects und daher diesem Fehler zusammenfällt.

PS: Es wird schwierig seine Ursache des Fehlers zu sagen, ohne dass Sie Ihre Daten

+0

abhiieur, der Datensatz enthält fast 40000 Datensätze, aber 88% der Daten gehören zu Klasse 0 und der Rest gehört zur Klasse 1. – SaikiHanee

+0

Daten, die Sie angegeben haben, ist zu wenig, um zu replizieren. Ich hoffe, dass Sie bei der Erstellung des "adverse_effects" -Faktors entweder 'model_bstTree <- train (as.factor (adverse_effects) ~., Data = trainSplit, method =" bstTree ", trControl = ctrl)' oder sonst 'betitled_num_new_bstTree $ adverse_effects <- as.factor (beachte_num_new_bstTree $ adverse_effects) '. Wenn ja, würde ich vorschlagen, dass Sie eine andere Klassifizierungsmethode wie logistische Regression, zufällige Gesamtstruktur, GBM usw. ausprobieren, um zu sehen, ob Sie dasselbe Verhalten sehen. Im Idealfall werden Sie nicht das gleiche Verhalten erhalten. – abhiieor

3

Ich hatte ähnliches Problem veröffentlichen, die zu diesem Fehler bezieht. Ich benutzte Funktion confusionMatrix:

confusionMatrix(actual, predicted, cutoff = 0.5)

Ein bekam ich folgende Fehlermeldung: Error in confusionMatrix.default(actual, predicted, cutoff = 0.5) : The data must contain some levels that overlap the reference.

ich einige Dinge geprüft, wie:

class(actual) -> numerische

class(predicted) -> integer

unique(actual) -> viele Werte, da es wahrscheinlich ist

unique(predicted) -> 2 Ebene: 0 und 1

folgerte ich, dass es ein Problem mit Cutoff-Teil der Funktion der Anwendung, also tat ich es vor von:

predicted<-ifelse(predicted> 0.5,1,0)

und führen Sie die confusionMatrix Funktion, die jetzt ganz gut funktioniert:

cm<- confusionMatrix(actual, predicted) cm$table

, die das richtige Ergebnis generiert.

Ein Service für Ihren Fall, die Interpretation verbessern könnten, wenn Sie Code Arbeits machen: Sie mischten Eingabewerte für Ihre Verwirrung Matrix (wie pro Konfusionsmatrix Paket-Dokumentation über) statt:

conf_bstTree= confusionMatrix(pred_bstTree,testSplit$adverse_effects)

Sie geschrieben haben sollte:

conf_bstTree= confusionMatrix(testSplit$adverse_effects,pred_bstTree)

Wie gesagt, es wird höchstwahrscheinlich helfen Ihnen Verwirrung Matrix interpretieren, wenn Sie figur Es geht darum, dass es funktioniert.

Ich hoffe, es hilft.