2013-04-18 3 views
2

Я читаю через предсказать() в R и смущает:Понимания предсказать() в R

Существует набор данных от спама, который мы создали поезд данные и данные испытаний с использованием случайной выборки. Мы использовали trainSpam (набор обучающих данных для обучения системы). Мы хотим видеть, насколько хороша модель, путем тестирования тестового набора данных (testSpam).

predictionModel = glm(numType ~ charDollar, family = "binomial", data = trainSpam) 

predictionTest = predict(predictionModel, testSpam) 
predictedSpam = rep("nonspam", dim(testSpam)[1]) 
predictedSpam[predictionModel$fitted > 0.5] = "spam" #Here is my problem 
table(predictedSpam, testSpam$type) 

В строке, где мы говорим:

predictedSpam[predictionModel$fitted > 0.5] = "spam" 

Как predictionModel$fitted предсказать спам в тестовых данных. Кажется, что используется предсказаниеModel $, установленное из данных обучения. Затем мы продолжаем сравнивать с спамом тестовых данных. Может кто-нибудь объяснить?

Вот что я понял. В строке:

predictionModel = GLM (numType ~ charDollar, семьи = "бином", данные = trainSpam)

Мы создаем модель, используя данные trainSpam.

В следующей строке:

predictionTest = предсказать (predictionModel, testSpam)

Мы создаем predictionTest с использованием той же модели, но тестовые данные.

В следующей строке:

predictedSpam = Rep ("nonspam", тусклое (testSpam) [1])

Мы создали вектор со всеми значениями "nonspam"

В следующей строке:

predictedSpam [predictionModel $ установлен> 0,5] = "спам"

Мы используем установленное предсказаниеModel $, которое было установлено над данными обучения, чтобы решить, какие из строк следует классифицировать как спам. Разве мы не должны использовать что-то вроде предсказания для идентификации спама?

Моя идея о том, что это должно быть это:

> predictionModel = glm(numType ~ charDollar, family = "binomial", data = trainSpam) 

> predictionTest = predict(predictionModel, testSpam,type="response") 
> predictedSpam = rep("nonspam", dim(testSpam)[1]) 
> predictedSpam[predictionTest > 0.5] = "spam" 
> table(predictedSpam, testSpam$type) 
+1

shoudn't быть 'predictedSpam [predictionTest> 0,5] = "спам"' вместо 'predictedSpam [predictionModel $ установлен> 0,5] = "спам" '? – Rcoster

+0

См. Слайды Хэдли Уикхема, показывающие применение функции прогнозирования(): http://stat405.had.co.nz/lectures/23-modelling.pdf –

+0

Я не уверен, что я придерживаюсь любого варианта, пока вы, не предоставил e, что «trainSpam». Конечно, если 'length (predictionModel $ установлен)' is! = 'Length (predictedSpam)', примечание Rcoster не будет выполнено. Можете ли вы переделать, чтобы уточнить, что такое ваш код и данные? –

ответ

1

Я думаю, что вы хотите type="response" в predict вызова, так как по умолчанию в противном случае будет линейным предсказателем.

?predict.glm # different than ?predict 

(Это, конечно, если я правильно ваша интуиции неустановленной цели находить случаи в тесте, установленные с вероятностью большей, чем 0,5.Кроме того, если вы действительно получаете прогнозы на основе данных обучения, это означает, что ваш тестовый фреймворк был искажен, и что вам нужно отредактировать свой вопрос, чтобы содержать вывод как из str(trainSpam), так и str(testSpam), чтобы мы могли показать вам, как правильно создать аргумент data для predict)

После обновления:. так что, похоже, charDollar в обоих испытаний и поездов наборов, так что вы не должны получать прогнозы в predictionTest из обучающего набора. Вы должны получить предсказывал> 50% случаев спам с: testSpam [предсказать (FIT, данные = testSpam, тип = "ответ)> 0,5]

я не уверен, что код был использован для создания predictionTest и удивиться, если вы имели в виду ввести predictedSpam Это то, что я думал, что получится:.

predictedSpam = predict(predictionModel, testSpam) 
spam <- predictedSpam[ predictedSpam$fitted > 0.5 ] 
+0

Ссылка на Pdf, где указан этот пример: https: //github.com/jtleek/dataanalysis/blob/master/week2/002structureOfADataAnalysis2/structureOfADataAnalysis2.pdf – Arc

Смежные вопросы