Функция Predict для регрессии logisti c, возвращающая результаты для всего набора данных, а не только для обучающего набора данных - PullRequest
1 голос
/ 06 апреля 2020

У меня возникла проблема, когда функция прогнозирования для моей регрессионной модели логистики c возвращает прогнозы для всего набора данных, а не только для тестовых данных. Мои данные испытаний содержат 6931 строк. Вот моя модель:

test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_test,family="binomial")

, а вот моя функция прогнозирования:

probabilities <- predict(test_model,newdata=Loan_test, type="response") 

Любая помощь в том, что я делаю неправильно, приветствуется.

Хорошо, вот что я изменил, используя свой обучающий набор данных, который имеет ~ 27000 строк:

test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,data=Loan_training,family="binomial")

probabilities <- predict(test_model,newdata=Loan_test, type="response")

, но вероятности по-прежнему содержат 34000+ строк.

1 Ответ

0 голосов
/ 06 апреля 2020

Для прогнозирования относительно набора данных удержания необходимо разбить исходные данные на кадры данных обучения и тестирования. Так как комментарии OP отмечают, что были отдельные фреймы обучающих и тестовых данных, мы просто будем использовать фрейм обучающих данных для построения модели и делать прогнозы относительно фрейма тестовых данных.

# use training data for model
test_model <- glm(status2~grade +  verified  + term + income + revolRatio +totalAcc + totalRevLim + accOpen24 ,
                  data=Loan_training,family="binomial")

#make predictions using hold out data (test)
probabilities <- predict(test_model,newdata=Loan_test, type="response")

Полный пример: прогноз с биномиальной регрессией

Вот полный рабочий пример с использованием данных о сердечно-сосудистых заболеваниях в Южной Африке из пакета ElemStatLearn, который отображается при разделении фрейма данных при тестировании и обучении установите биномиальную модель с glm() и сделайте прогнозы с помощью фреймов тестовых и обучающих данных, число прогнозов будет равно размеру фрейма данных, использованного в predict().

library(ElemStatLearn)
data(SAheart)
set.seed(801248)
train = sample(1:dim(SAheart)[1],size=dim(SAheart)[1]*.6,replace=F)
trainSA = SAheart[train,]
nrow(trainSA)
testSA = SAheart[-train,]
nrow(testSA)

На данный момент мы видим, что в trainSA и testSA имеется различное количество строк.

> nrow(trainSA)
[1] 277
> testSA = SAheart[-train,]
> nrow(testSA)
[1] 185
> 

Далее мы подгоняем биномиальную общую линейную модель с glm().

modFit <- glm(chd ~ age + alcohol + obesity + tobacco + typea + ldl,
            data=trainSA,
            family="binomial")

Когда мы делаем прогнозы для тестовых и обучающих фреймов данных, мы отмечаем, что длины выходных векторов соответствуют количеству строк в исходных фреймах данных.

predicted_test <- predict(modFit,testSA)
length(predicted_test)
predicted_train <- predict(modFit,trainSA)
length(predicted_train)

... и вывод:

> length(predicted_test)
[1] 185
> predicted_train <- predict(modFit,trainSA)
> length(predicted_train)
[1] 277

Наконец, мы демонстрируем эту разницу в результатах predict(), вычисляя коэффициент ошибочной классификации для каждого фрейма данных.

missClass = function(values,prediction){sum(((prediction > 0.5)*1) != values)/length(values)}
# Classification errors on TrainSA
missClass(trainSA$chd,predicted_train)
# Classification Errors on TestSA
missClass(testSA$chd,predicted_test)

... и вывод:

> missClass(trainSA$chd,predicted_train)
[1] 0.2924188
> # Classification Errors on TestSA
> missClass(testSA$chd,predicted_test)
[1] 0.2594595
> 

ВЫВОД: Каким-то образом код в исходном сообщении ссылается на исходный фрейм данных при вводе в predict(), но мы не видим его, потому что он не включает минимальный воспроизводимый пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...