Я попытался 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)