Ошибка моделирования GLM - PullRequest
0 голосов
/ 29 мая 2018

У меня есть данные (я приведу главу данных) и хочу модель GLM по «точности».Моя R студия постоянно зависает, пока я запускаю финальный код, GLM.Я понятия не имею, что делать, и я полностью застрял ..

ContractNr Year ValidFrom  ValidThru    Exposure EarnedPremium
1    3006024 2013  1.1.2013  31.3.2013 0,246575342   53,79877695
2    3006024 2013  1.4.2013  22.4.2013 0,060273973   13,48774798
3    3012819 2013  1.1.2013 31.12.2013           1   367,0053327
4    3012819 2014  1.1.2014 31.12.2014           1   367,0053327
5    3012819 2015  1.1.2015  26.4.2015 0,317808219   116,6373112
6    3014874 2013  1.1.2013  28.2.2013 0,161643836   57,71979747
YearlyNetPremium     ClaimNr ClaimDate ClaimYear NClaims   Incurred
1      218,1839288          NA                  NA       0          0
2      223,7740007          NA                  NA       0          0
3      367,0053327 61861914012 21.8.2013      2013       1 1390,86693
4      367,0053327          NA                  NA       0          0
5      367,0053327          NA                  NA       0          0
6       357,080103          NA                  NA       0          0
    Payments Reserve County ConstrYear EngPerfKW Weight BonusMalus Age Gender
1          0       0     GM       1999        40    975          0  51 female
2          0       0     GM       1999        40    975          0  51 female
3 1390,86693       0      L       2003       132   1834         -1  58 female
4          0       0      L       2003       132   1834         -1  59 female
5          0       0      L       2003       132   1834         -1  60 female
6          0       0     PE       2004        55   1318          0  79   male
  ClaimReason    Make Telematics CarAge G_EngPerfKW G_Weight G_Age
1          NA Renault          0     16          25      500    50
2          NA Renault          0     16          25      500    50
3           1    Audi          0     12         125     1500    50
4          NA    Audi          0     12         125     1500    50
5          NA    Audi          0     12         125     1500    60
6          NA    Opel          0     11          50     1000    70

То, что я хочу сделать, это для "NClaims", который является двоичным, делает веса и, следовательно, делает GLM.Я пробовал что-то похожее с машинным обучением (данные обучения / тестирования), это сработало.

library(caret)
library(FSelector)
set.seed(42)
dataset<-read.csv(file.choose(),header=T,sep=";")
str(dataset)
dataset$NClaims[is.na(dataset$NClaims)]<-names(which.max(table(dataset$NClaims)))
dataset$ClaimReason<-NULL
dataset$ClaimNr<-NULL
dataset$ClaimDate<-NULL
dataset$ClaimYear<-NULL
dataset$Incurred<-NULL
dataset$Payments<-NULL
dataset$Reserve<-NULL
colSums(is.na(dataset))
dataset$ValidFrom<-NULL
dataset$ValidThru<-NULL
dataset$County<-NULL
dataset$Gender<-NULL
dataset$Make<-NULL
weights_info_gain<-information.gain(NClaims ~ ., data=dataset)
weights_info_gain
weights_gain_ratio = gain.ratio(NClaims ~ ., data=dataset)
weights_gain_ratio
most_important_attributes <- cutoff.k(weights_gain_ratio, 20)
most_important_attributes
formula_with_most_important_attributes <- as.simple.formula(most_important_attributes, "NClaims")
formula_with_most_important_attributes
fitCtrl = trainControl(method="repeatedcv", number=5, repeats=3)
modelGLM = train(formula_with_most_important_attributes, data=dataset, method="glm", trControl=fitCtrl, metric="Accuracy",na.action = na.pass)

Я отбросил дату, я не был уверен, возьмет ли GLM (например, «Make» или что-то еще, не числовое).Спасибо за помощь !!

1 Ответ

0 голосов
/ 15 июля 2018

Я попытался re-sampling data из вопроса, чтобы создать больший набор data для ответа на вопрос.code, кажется, работает нормально на sample data set:

  • заменил commas в columns 'YearlyNetPremium', 'Exposure', 'EarnedPremium','Incurred', 'Payments' и т. Д. Через точку. '
  • Добавлены NA's к blank rows (в любом случае они установлены на NULL позже)
  • Преобразование strings в date или year

Code ниже, похоже, работает с приведенным выше примером data:

Импорт библиотек

library(lubridate)
library(caret)
library(FSelector)

Создание выборочных данных путем выборки данных из вопроса

ContractNr <- c(3006024, 3006024, 3012819, 3012819, 3012819, 3014874)
Year <- c(2013,2013,2013,2014,2015,2013)
ValidFrom <- c('1.1.2013', '1.4.2013', '1.1.2013', '1.1.2014', '1.1.2015', '1.1.2013')
ValidThru <- c('31.3.2013', '22.4.2013', '31.12.2013', '31.12.2014', '26.4.2015', '28.2.2013')
Exposure <-c(0.246575342, 0.060273973, 1,1,0.317808219, 0.161643836)
EarnedPremium <- c(53.79877695, 13.48774798, 13.48774798, 367.0053327, 116.6373112, 57.71979747)
YearlyNetPremium <- c(218.1839288, 223.7740007, 367.005332, 367.0053327, 367.0053327, 357.080103)
ClaimNr <- c(NA,NA,61861914012,NA,NA,NA)
ClaimDate <- c(NA,NA,'21.8.2013',NA,NA,NA)
ClaimYear <- c(NA,NA,2013,NA,NA,NA)
NClaims <- c(0,0,1,0,0,0)
Incurred <- c(0,0,1390.86693,0,0,0)
Payments <- c(0,0, 1390.86693, 0,0,0)
Reserve <- c(0,0,0,0,0,0)
County <- c('GM', 'GM', 'L', 'L', 'L', 'PE')
ConstrYear <- c(1999, 1999, 2003,2003,2003,2004 )
EngPerfKW <- c(40,40,132,132,132,55)
Weight <- c(975, 975, 1834,1834,1834,1318)
BonusMalus <- c(0,0,-1,-1,-1,0)
Age <- c(51,51,58,59,60,79)
Gender <- c('female','female','female','female','female','male')
ClaimReason <- c(NA,NA,1,NA,NA,NA)
Make <- c('Renault','Renault','Audi','Audi','Audi','Opel' )
Telematics <- c(0,0,0,0,0,0)
CarAge <- c(16,16,12,12,12,11)
G_EngPerfKW <- c(25,25,125,125,125,50)
G_Weight <- c(500, 500, 1500, 1500, 1500, 1000)
G_Age <- c(50,50,50,50,60,70)


df <- data.frame(ContractNr,Year,ValidFrom,ValidThru,Exposure,EarnedPremium,YearlyNetPremium,ClaimNr,ClaimDate,
                 ClaimYear,Incurred,Payments,Reserve,County,ConstrYear,EngPerfKW,Weight,BonusMalus,
                 Age,Gender,ClaimReason,Make,Telematics,CarAge,G_EngPerfKW,G_Weight,G_Age )

# Sample to create a larger dataset
t <- df[sample(nrow(df), 100, replace = TRUE), ]
t['ContractNr'] = abs(floor(1e6*rnorm(100,sd=1)))
t['NClaims'] = floor(runif(100,0,1.9))
# Convert to date
t['ValidFrom'] = as.Date(t$ValidFrom, "%d.%m.%Y")
t['ValidThru'] = as.Date(t$ValidThru, "%d.%m.%Y")
t['ConstrYear'] = year(as.Date(as.character(t$ConstrYear), format = "%Y"))

t <- subset(t, select=-c(Reserve,Telematics,ClaimReason,ClaimNr,ClaimDate, ClaimYear))
dataset <- t

Код из поста вопроса выше

set.seed(42)
#dataset<-read.csv(file.choose(),header=T,sep=";")
str(dataset)
dataset$NClaims[is.na(dataset$NClaims)]<-names(which.max(table(dataset$NClaims)))

dataset$ClaimReason<-NULL
dataset$ClaimNr<-NULL
dataset$ClaimDate<-NULL
dataset$ClaimYear<-NULL
dataset$Incurred<-NULL
dataset$Payments<-NULL
dataset$Reserve<-NULL
colSums(is.na(dataset))
dataset$ValidFrom<-NULL
dataset$ValidThru<-NULL
dataset$County<-NULL
dataset$Gender<-NULL
dataset$Make<-NULL



weights_info_gain <- information.gain(NClaims ~ ., data=dataset)
wgr = gain.ratio(NClaims ~ ., data=dataset)
mia <- cutoff.k(wgr, 20)
fia <- as.simple.formula(mia, "NClaims")
fitCtrl = trainControl(method="repeatedcv", number=5, repeats=3)
modelGLM = train(fia, data=dataset, method="glm", trControl=fitCtrl, metric="Accuracy",na.action = na.pass)
summary(modelGLM)

enter image description here

...