2015-09-08 4 views
5

मैं मॉडल कैरट पैकेज द्वारा बनाई गई के लिए एक निर्णय सीमा साजिश करना चाहते हैं। आदर्श रूप से, मैं कैरेट से किसी भी वर्गीकृत मॉडल के लिए एक सामान्य मामला विधि चाहता हूं। हालांकि, मैं वर्तमान में केएनएन विधि के साथ काम कर रहा हूं। मैंने नीचे कोड शामिल किया है जो यूसीआई से वाइन गुणवत्ता डेटासेट का उपयोग करता है जो मैं अभी के साथ काम कर रहा हूं।कैसे कैरट पैकेज में KNN मॉडल के लिए एक निर्णय सीमा ग्राफ़ बनाने के लिए?

मैं इस पद्धति है कि आर में जेनेरिक KNN विधि के साथ काम करता है पाया है, लेकिन समझ नहीं कैसे कैरट से मैप करने के लिए ->https://stats.stackexchange.com/questions/21572/how-to-plot-decision-boundary-of-a-k-nearest-neighbor-classifier-from-elements-o/21602#21602

library(caret) 

    set.seed(300) 

    wine.r <- read.csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv', sep=';') 
    wine.w <- read.csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv', sep=';') 

    wine.r$style <- "red" 
    wine.w$style <- "white" 

    wine <- rbind(wine.r, wine.w) 

    wine$style <- as.factor(wine$style) 

    formula <- as.formula(quality ~ .) 

    dummies <- dummyVars(formula, data = wine) 
    dummied <- data.frame(predict(dummies, newdata = wine)) 
    dummied$quality <- wine$quality 

    wine <- dummied 

    numCols <- !colnames(wine) %in% c('quality', 'style.red', 'style.white') 

    low <- wine$quality <= 6 
    high <- wine$quality > 6 
    wine$quality[low] = "low" 
    wine$quality[high] = "high" 
    wine$quality <- as.factor(wine$quality) 

    indxTrain <- createDataPartition(y = wine[, names(wine) == "quality"], p = 0.7, list = F) 

    train <- wine[indxTrain,] 
    test <- wine[-indxTrain,] 

    corrMat <- cor(train[, numCols]) 
    correlated <- findCorrelation(corrMat, cutoff = 0.6) 

    ctrl <- trainControl(
         method="repeatedcv", 
         repeats=5, 
         number=10, 
         classProbs = T 
         ) 

    t1 <- train[, -correlated] 
    grid <- expand.grid(.k = c(1:20)) 

    knnModel <- train(formula, 
         data = t1, 
         method = 'knn', 
         trControl = ctrl, 
         tuneGrid = grid, 
         preProcess = 'range' 
        ) 

    t2 <- test[, -correlated] 
    knnPred <- predict(knnModel, newdata = t2) 

    # How do I render the decision boundary? 

उत्तर

5

पहला कदम है वास्तव में क्या कोड को समझने के लिए आप जुड़े हुए हैं! वास्तव में आप केएनएन के साथ कुछ भी करने के बिना ऐसा ग्राफ उत्पन्न कर सकते हैं।

उदाहरण के लिए, बस कुछ नमूना डेटा, जहां हम सिर्फ "रंग" कम अपने डेटा के वृत्त का चतुर्थ भाग है की सुविधा देता है।

चरण 1

एक ग्रिड उत्पन्न करें। असल में ग्राफिंग कैसे काम करता है, प्रत्येक समन्वय पर एक बिंदु बना देता है ताकि हम जान सकें कि यह किस समूह से संबंधित है। आर में यह सभी संभावित बिंदुओं पर जाने के लिए expand.grid का उपयोग करके किया जाता है।

x1 <- 1:200 
x2 <- 50:250 

cgrid <- expand.grid(x1=x1, x2=x2) 
# our "prediction" colours the bottom left quadrant 
cgrid$prob <- 1 
cgrid[cgrid$x1 < 100 & cgrid$x2 < 170, c("prob")] <- 0 

यदि यह KNN किया गया था, यह होगा prob कि विशेष स्थल के लिए भविष्यवाणी होगा।

चरण 2

अब साजिश रचने यह अपेक्षाकृत सरल है। तुम्हें पता है, contour समारोह के अनुरूप तो आप सबसे पहले संभावनाओं के साथ एक मैट्रिक्स बनाने की जरूरत है।

matrix_val <- matrix(cgrid$prob, 
        length(x1), 
        length(x2)) 

चरण 3

तो फिर तुम क्या लिंक किया था के रूप में आगे बढ़ सकते हैं:

contour(x1, x2, matrix_val, levels=0.5, labels="", xlab="", ylab="", main= 
      "Some Picture", lwd=2, axes=FALSE) 
gd <- expand.grid(x=x1, y=x2) 
points(gd, pch=".", cex=1.2, col=ifelse(prob==1, "coral", "cornflowerblue")) 
box() 

उत्पादन:

somepic


तो फिर अपने विशेष उदाहरण पर वापस जाएं। मैं आईरिस का उपयोग करने जा रहा हूं, क्योंकि आपका डेटा देखने के लिए बहुत दिलचस्प नहीं था, लेकिन एक ही सिद्धांत लागू होता है। ग्रिड बनाने के लिए आपको अपने एक्स-वाई धुरी को चुनने और बाकी सब कुछ तय करने की आवश्यकता होगी!

knnModel <- train(Species ~., 
        data = iris, 
        method = 'knn') 

lgrid <- expand.grid(Petal.Length=seq(1, 5, by=0.1), 
        Petal.Width=seq(0.1, 1.8, by=0.1), 
        Sepal.Length = 5.4, 
        Sepal.Width=3.1) 

अगला उपरोक्त कार्य का उपयोग करें जैसा आपने ऊपर किया है।

knnPredGrid <- predict(knnModel, newdata=lgrid) 
knnPredGrid = as.numeric(knnPredGrid) # 1 2 3 

और फिर ग्राफ का निर्माण:

pl = seq(1, 5, by=0.1) 
pw = seq(0.1, 1.8, by=0.1) 

probs <- matrix(knnPredGrid, length(pl), 
       length(pw)) 

contour(pl, pw, probs, labels="", xlab="", ylab="", main= 
      "X-nearest neighbour", axes=FALSE) 

gd <- expand.grid(x=pl, y=pw) 

points(gd, pch=".", cex=5, col=probs) 
box() 

यह इस तरह एक निर्गम उपज चाहिए:

iris


अपने मॉडल से परीक्षण/ट्रेन परिणाम जोड़ने के लिए, आप जो भी कर चुके हैं उसका पालन कर सकते हैं। फर्क सिर्फ इतना है कि आप (भविष्यवाणी अंक जोड़ने की जरूरत है इस ग्रिड जो सीमा उत्पन्न करने के लिए इस्तेमाल किया गया के समान नहीं है

library(caret) 
data(iris) 

indxTrain <- createDataPartition(y = iris[, names(iris) == "Species"], p = 0.7, list = F) 

train <- iris[indxTrain,] 
test <- iris[-indxTrain,] 

knnModel <- train(Species ~., 
        data = train, 
        method = 'knn') 

pl = seq(min(test$Petal.Length), max(test$Petal.Length), by=0.1) 
pw = seq(min(test$Petal.Width), max(test$Petal.Width), by=0.1) 

# generates the boundaries for your graph 
lgrid <- expand.grid(Petal.Length=pl, 
        Petal.Width=pw, 
        Sepal.Length = 5.4, 
        Sepal.Width=3.1) 

knnPredGrid <- predict(knnModel, newdata=lgrid) 
knnPredGrid = as.numeric(knnPredGrid) 

# get the points from the test data... 
testPred <- predict(knnModel, newdata=test) 
testPred <- as.numeric(testPred) 
# this gets the points for the testPred... 
test$Pred <- testPred 

probs <- matrix(knnPredGrid, length(pl), length(pw)) 

contour(pl, pw, probs, labels="", xlab="", ylab="", main="X-Nearest Neighbor", axes=F) 
gd <- expand.grid(x=pl, y=pw) 

points(gd, pch=".", cex=5, col=probs) 

# add the test points to the graph 
points(test$Petal.Length, test$Petal.Width, col=test$Pred, cex=2) 
box() 

आउटपुट:।

enter image description here

वैकल्पिक रूप से आप उपयोग कर सकते हैं ggplot रेखांकन जो हो सकता है करना आसान:

ggplot(data=lgrid) + stat_contour(aes(x=Petal.Length, y=Petal.Width, z=knnPredGrid), 
          bins=2) + 
    geom_point(aes(x=Petal.Length, y=Petal.Width, colour=as.factor(knnPredGrid))) + 
    geom_point(data=test, aes(x=test$Petal.Length, y=test$Petal.Width, colour=as.factor(test$Pred)), 
      size=5, alpha=0.5, shape=1)+ 
    theme_bw() 

आउटपुट:

enter image description here

+0

यह एक बहुत अच्छी प्रतिक्रिया है और मैं बहुत करीब सोचता हूं। मैंने निर्णय सीमा को साकार करने के प्रयास के साथ अपने कोड का एक सारांश अपडेट किया: https://gist.github.com/jameskyle/729945f6fa38a343b8ab। लेकिन मुझे प्राप्त ग्राफ एक राक्षसी, प्लेड गड़बड़ है (http://i.imgur.com/TYCpleT.png)। क्या यह कार्यान्वयन में त्रुटि के कारण है या यह डेटा ही है? मैंने शराब + क्लोराइड को मेरे एक्स, वाई के रूप में चुना क्योंकि वे उच्चतम महत्व की विशेषताएं थे। –

+0

मैंने आईरिस में आधारित एक स्क्रिप्ट लिखी है जो परीक्षण सेट उत्पन्न करने के बजाय आईरिस डेटा को विभाजित करता है, मुझे एक समान आंशिक ग्राफ मिलता है। मुझे लगता है कि निर्णय सीमाएं कैसे काम करती हैं? स्क्रिप्ट: https://gist.github.com/jameskyle/ffed976dfef1cbc778d5 ग्राफ: http://i.imgur.com/UX1xmp9.png –

+0

अपने नए डेटा भाग में, डेटा को ग्रिड की तरह होना चाहिए; मैं अपना जवाब अपडेट करूंगा। – chappers

संबंधित मुद्दे