预测建模已广泛用于定价,准备金分析和风险量化等保险精算应用中。预测建模的核心是使用过去的数据来预测将来结果的概率。在精算界,预测建模已经成为广义线性模型(GLM: Generalized Linear Model)的代名词。其他广泛应用的模型还包括聚类分析 (Clustering)、分类和回归树(CART: Classification and Regression Tree)、随机森林(RF: Random Forest)以及神经网络模型(ANN: Artificial Neural Network)等。作者希望通过例子介绍预测建模的应用和最新发展。

    随着远程信息技术的迅速发展及其在车辆里程保险(UBI: Usage Based Insurance)和驾驶员行为分析中的应用,车险的定价和风险评估变得更为精确,也更为复杂。远程信息技术通过车载设备和手机应用搜集车辆行驶的数据。搜集的数据中包括非传统的地理定位数据,这些数据是非结构化的,不能直接在预测模型中使用。如果能将这些数据转化成可以使用的变量,那么可以驾驶行为进行更加个性化的分析,从而使车险业务的风险评估变得更全面,更可信。比如:每辆车的驾驶纪录中,一般是由投保人驾驶的,偶尔会有他人驾驶的,但是无法确定哪些纪录是非投保人驾驶的。在统计学上,我们称之为无监督学习 (Unsupervised Learning)。由于投保人和其他人的驾驶习惯不同、对车的熟悉程度不同,因此驾驶风险存在差异,有必要加以研究。

    本文探讨将预测建模和远程信息技术相结合,把地理定位数据结构化,并使用随机森林模型来测算由非投保人驾驶投保车辆的概率。在车险定价中,这些信息对于了解车辆的使用,风险评估,确定保险费率和良好驾驶折扣等都有非常好的帮助。文章最后还提供了核心R程序供大家参考。

    我们从驾驶行程的特点差异入手来判断哪些是投保人的驾驶、哪些是其他人的驾驶。本文使用了Kaggle竞赛提供的庞大的分析数据库,包含了由车辆每秒的地理坐标位置组成的车辆驾驶行程的详细信息。表1出了一条驾驶行程的一小部分数据。

    驾驶起点坐标为(0,0),每行为车辆每秒的坐标。例如,一秒钟后,车辆移动到(-7.4-7.5),即距离起点南7.4米,西7.5米。通过驾驶起点归零的方式,我们把实际的经度和纬度数据转变为标准化数据,以去除敏感信息。每个投保人都有相对应的200条驾驶行程数据。图1画出了一位驾驶员的200条驾驶行程。

 

    原始数据库包含复杂的地理位置信息,很难直接在预测建模中使用。数据分析的第一步是从数据中提取可以使用的特征,将非结构化的数据结构化。比如根据驾驶行程数据计算出最大速度、最小速度、平均速度等等。本例使用了表2中列出的特征。在具体实践中,还可以提取其他特征来解决其他的问题。

    在实际业务中,投保车辆是否由投保人驾驶,或者哪些行程由投保人驾驶,在大部分情况下都是未知的,这是精算和风险管理中很少见的无监督学习的问题。大多数预测模型无法解决无监督学习的难题。为了能够使用模型预测和识别某个行程的驾驶员,需要将无监督学习变成监督学习,在训练数据中明确标识行程是否由投保人驾驶。为了解决这个问题,我们在每个驾驶员行程数据集中加入一些其他驾驶员数据集中的行程数据。这些添加的行程基本上不可能是由此驾驶员驾驶的。在模型校准中,我们假设在该驾驶员自身的数据集中所有的行程都属于该驾驶员,所有随机加入的行程都不属于该驾驶员。在本文的例子中,对于每个驾驶员,我们随机从其他车手的数据中抽取500条行程数据,并标记为错误的行程。通过这样的数据处理,无监督学习问题成了一个包含少量数据错误的监督学习(Supervised Learning)问题。图2演示了本文例子中使用的训练数据的组成。每个驾驶员均有各自的训练数据和预测模型。

    随机森林模型是分类回归树(CART)的组合模型(Ensemble),是一个用随机方式建立的,包含多个回归树的分类器。对于每一个分类回归树,我们用随机抽取的数据样本进行校准。根据这些校准后的分类回归树,最终预测按照分类回归树结果中的大多数来决定。图3展示了随机森林模型的基本架构。首先从训练数据库中产生n个随机样本。在本文的例子中,针对每个驾驶员的训练数据,随机抽取了50组样本数据,每组样本数据大约为总样本数据的60%。然后每个样本用来校准一个分类回归树。在驾驶行程识别的例子中,只需要识别是否由某一驾驶员驾驶,所以分类回归树实际上是一个分类树。每个分类树上的节点根据新产生特征进行分类,产生新的分支,直至最终节点没有进一步的划分。每个最终节点都会显示频率最高的可能情况作为预测结果。例子中,Y=0代表此驾驶行程不是由该驾驶员驾驶;Y=1代表此驾驶行程是由该驾驶员驾驶。最终预测由所有分类树的结果投票决定。例子中,Y=1获得了177票,占绝对优势,所以判断此驾驶行程是该驾驶员完成的。

    随机森林模型在运算量没有显著增加的前提下提高了预测精度,比广义线性模型(GLM)的预测精度高很多,而且随机森林对多元共线性不敏感,结果对缺失数据和非平衡的数据比较稳健,预测结果波动性也较小,可以很好地预测多达几千个解释变量的作用。

    利用上面介绍的随机森林模型,我们可以预测行程属于该驾驶员的概率。为提高正确率,我们可以进行多次重复计算。每轮计算中都将重新随机抽取错误行程,并重新校准随机森林模型。最终,根据每轮模型结果计算出的平均概率被用来做预测结论。如果平均概率小于0.5,则判断此行程不属于该驾驶员。图4显示了某驾驶员数据集的预测结果。在给出的200个行程中,有6个行程预测概率小于0.5,意味着这些行程不属于该驾驶员。

    校准之后的模型可用于测试随机抽取的其他驾驶员的驾驶行程。比如说我们可以从其他驾驶员的数据中随机取样200次驾驶行程,看有多少行程被错误的预测为由该司机驾驶。如果预测的正确率低,则说明校准模型的准确率低。但是使用这种方法,高的正确预测率并不一定意味着校准模型的高精度。例如,如果模型预测结果显示所有随机抽取的其他驾驶员行程都不是由该司机驾驶的,那么该模型可达到100%的正确率。但同时模型对于由该司机自己驾驶的真正行程的预测结果也可能都是错误的。

    另一个相对合理的方法是将驾驶数据分为训练数据和验证数据。如,训练数据可以由该驾驶员行程数据的75%,加上500条其他司机的随机行程数据构成。同时,验证数据可以由该驾驶员行程数据剩余的25%,加上200条随机选取的其他司机的行程数据。基于这样的训练数据得到的校准模型可以预测验证数据中的正确行程(由该驾驶员驾驶)和错误行程(有其他驾驶员驾驶)。这样不但可以检验此模型预测错误行程的能力,也可以检验其预测正确行程的能力。5演示了在这种方法下驾驶员1的训练数据和验证数据的构成。

 

    表4出了用于验证模型的混淆矩阵。

    根据实际的混淆矩阵,我们可以使用以下几个指标来评估预测的准确性。查全率(Precision)用来衡量第一类统计错误。查准率(recall)用来衡量第二类统计错误。F-Measure是查全率和查准率的调和平均数,可以视为检验第一类和第二类错误的一个综和指标。

     例子中查全率、查准率和F-Measure均大于70%,可以推断模型预测的准确度较高,两类统计错误都比较小。然而,这种方法的主要缺点是训练数据中正确行程数据量会减少。由于每个驾驶员只有较小的数据集,它可能会显著影响模型校准的可信度。

    通过特征提取等非传统的数据处理方法,可以将非监督学习问题转变为监督学习问题,从而使得远程信息技术采集的地理定位数据用于模型预测,大大提高风险识别的全面性和准确性。另外,模型开发及验证过程中的创意调整,可以改善模型的性能,提高模型结果的应用价值。

    下面列出了用于实现随机森林模型的R程序。

    ### 例子中使用R package “randomForest”.

    library(randomForest)

    ## 建立随机森林模型的公式

    #数据库”FeaturesDataset”包含从地理定位数据中提取的所有新特征

    Xnames <- colnames(FeaturesDataset)

    #去除不需要的解释变量” driver no””trip no”以及预测变量“indicator”,建立解释变量矩阵。

    Xnames <- Xnames[!Xnames %in% c("driverno","trip","indicator")]

    #设置公式

    f<-as.formula(paste("as.factor(indicator)~",paste(Xnames,collapse="+")))

    #从别的驾驶员的数据中随机抽取一些驾驶行程,结合已有的数据建立训练数据库。

    AddWrongTrips = function(driver, NoWrongtrips){

           Correcttrips = FeaturesDataset[which(FeaturesDataset[,'driverno']==driver), ]

           Wrongtrips = FeaturesDataset[sample(which(FeaturesDataset[,'driverno']!=driver), size = NoWrongtrips), ]

           Wrongtrips[,'indicator'] = 0

           Trainingdata = rbind(Correcttrips, Wrongtrips)

           return(Trainingdata)

    }

    # 使用随机森林模型预测每个驾驶员200条驾驶行程中哪些不是由此驾驶员驾驶的。使用的训练数据包括原有的200条驾驶行程以及随机抽取的其他不属于此驾驶员的行程。整个程序循环运行10次,每次随机抽取的行程不同。10次结果共同决定预测概率。

    NoWrongTrips = 500

    # 建立向量存储一个驾驶员所有驾驶行程的预测结果

    TripProb = numeric(NoTrips)

    #建立矩阵存储一个驾驶员所有驾驶行程所有循环的预测结果

    TrainProbIter = matrix(data=NA, nrow=NoTrips, ncol=Iteration)

    # 建立向量存储所有驾驶员所有驾驶行程的预测结果

    TripProbTotal = numeric(NoTrips * NoDrivers)

    # 所有驾驶员的随机森林模型校准和预测

    for (driver in DriveData){

           TrainData = AddWrongTrips(driver, NoWrongTrips)

           rfmodel = randomForest(f , ntree = 50, nodesize=5, importance = TRUE,  data=TrainData)

           rfpred = predict(rfmodel, newdata = TrainData[1:200, ], type = "prob")[,2]

           TrainProbIter[,iter] = rfpred

           TripProb=apply(X=TrainProbIter, 1, mean)

           indicator_pred=ifelse(TripProb>=0.5,1,0)

           FeaturesDataset[seq((i-1)*200+1, i*200 ),"indicator"]=indicator_pred

           TripProbTotal[seq((i-1)*200+1, i*200 )]=TripProb

    }

 

 

尚恺澜,CFAFSA PRM SCJP, ReservePrism预测建模主管,Swin Solutions联合创始人,电子邮箱:kailan.shang@swinsolutions.com

游海,M.S., ReservePrism统计建模主管,技术副总裁。电子邮箱:reservemaster@goouon.com