KNN算法在保险业精准营销中的应用

版权所有,可以转载,禁止修改。转载请注明作者以及原文链接。

一、KNN算法概述

KNN是Machine Learning领域一个简单又实用的算法,与之前讨论过的算法主要存在两点不同:

  1. 它是一种非参方法。即不必像线性回归、逻辑回归等算法一样有固定格式的模型,也不需要去拟合参数。
  2. 它既可用于分类,又可应用于回归。

KNN的基本思想有点类似“物以类聚,人以群分”,打个通俗的比方就是“如果你要了解一个人,可以从他最亲近的几个朋友去推测他是什么样的人”。

在分类领域,对于一个未知点,选取K个距离(可以是欧氏距离,也可以是其他相似度度量指标)最近的点,然后统计这K个点,在这K个点中频数最多的那一类就作为分类结果。比如下图,若令K=4,则?处应分成红色三角形;若令K=6,则?处应分类蓝色正方形。

在回归(简单起见,这里讨论一元回归)领域,如果只知道某点的预测变量,要回归响应变量,只需要在横坐标轴上(因为不知道纵坐标的值,所以没法计算欧氏距离)选取K个最近的点,然后平均(也可以加权平均)这些点的响应值,作为该点的响应值即可。比如下图中,已知前5个点的横纵坐标值,求时,为多少?若令K=2,则距6.5最近的2个点是(5.1, 8)和(4, 27),把这两个点的纵坐标平均值17.5就可以当作回归结果,认为

KNN具体的算法步骤可参考延伸阅读文献1。

二、KNN性能讨论

KNN的基本思想与计算过程很简单,你只需要考虑两件事:

  1. K预设值取多少?
  2. 如何定义距离?

其中如何定义距离这个需要结合具体的业务应用背景,本文不细致讨论,距离计算方法可参看延伸阅读文献2。这里只讨论K取值时对算法性能的影响。

在上图中,紫色虚线是贝叶斯决策边界线,也是最理想的分类边界,黑色实线是KNN的分类边界。

可以发现:K越小,分类边界曲线越光滑,偏差越小,方差越大;K越大,分类边界曲线越平坦,偏差越大,方差越小。

所以即使简单如KNN,同样要考虑偏差和方差的权衡问题,表现为K的选取。

KNN的优点就是简单直观,无需拟合参数,在样本本身区分度较高的时候效果会很不错;但缺点是当样本量大的时候,找出K个最邻近点的计算代价会很大,会导致算法很慢,此外KNN的可解释性较差。

KNN的一些其他问题的思考可参看延伸阅读文献3。

三、实战案例

1、KNN在保险业中挖掘潜在用户的应用

这里应用ISLR包里的Caravan数据集,先大致浏览一下:

> library(ISLR)
> str(Caravan)
‘data.frame‘:    5822 obs. of  86 variables:
 $ Purchase: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
> table(Caravan$Purchase)/sum(as.numeric(table(Caravan$Purchase)))
        No        Yes
0.94022673 0.05977327

5822行观测,86个变量,其中只有Purchase是分类型变量,其他全是数值型变量。Purchase两个水平,NoYes分别表示不买或买保险。可见到有约6%的人买了保险。

由于KNN算法要计算距离,这85个数值型变量量纲不同,相同两个点在不同特征变量上的距离差值可能非常大。因此要归一化,这是Machine Learning的常识。这里直接用scale()函数将各连续型变量进行正态标准化,即转化为服从均值为0,标准差为1的正态分布。

> standardized.X=scale(Caravan[,-86])
> mean(standardized.X[,sample(1:85,1)])
[1] -2.047306e-18
> var(standardized.X[,sample(1:85,1)])
[1] 1
> mean(standardized.X[,sample(1:85,1)])
[1] 1.182732e-17
> var(standardized.X[,sample(1:85,1)])
[1] 1
> mean(standardized.X[,sample(1:85,1)])
[1] -3.331466e-17
> var(standardized.X[,sample(1:85,1)])
[1] 1

可见随机抽取一个标准化后的变量,基本都是均值约为0,标准差为1。

> #前1000观测作为测试集,其他当训练集
> test <- 1:1000
> train.X <- standardized.X[-test,]
> test.X <- standardized.X[test,]
> train.Y <- Caravan$Purchase[-test]
> test.Y <- Caravan$Purchase[test]
> knn.pred <- knn(train.X,test.X,train.Y,k=)
> mean(test.Y!=knn.pred)
[1] 0.117
> mean(test.Y!="No")
[1] 0.059

当K=1时,KNN总体的分类结果在测试集上的错误率约为12%。由于大部分的人都不买保险(先验概率只有6%),那么如果模型预测不买保险的准确率应当很高,纠结于预测不买保险实际上却买保险的样本没有意义,同样的也不必考虑整体的准确率(Accuracy)。作为保险销售人员,只需要关心在模型预测下会买保险的人中有多少真正会买保险,这是精准营销的精确度(Precision);因此,在这样的业务背景中,应该着重分析模型的Precesion,而不是Accuracy。

> table(knn.pred,test.Y)
        test.Y
knn.pred  No Yes
     No  874  50
     Yes  67   9
> 9/(67+9)
[1] 0.1184211

可见K=1时,KNN模型的Precision约为12%,是随机猜测概率(6%)的两倍!

下面尝试K取不同的值:

> knn.pred <- knn(train.X,test.X,train.Y,k=3)
> table(knn.pred,test.Y)[2,2]/rowSums(table(knn.pred,test.Y))[2]
Yes
0.2
> knn.pred <- knn(train.X,test.X,train.Y,k=5)
> table(knn.pred,test.Y)[2,2]/rowSums(table(knn.pred,test.Y))[2]
      Yes
0.2666667

可以发现当K=3时,Precision=20%;当K=5时,Precision=26.7%。

作为对比,这个案例再用逻辑回归做一次!

> glm.fit <- glm(Purchase~.,data=Caravan,family = binomial,subset = -test)
Warning message:
glm.fit:拟合機率算出来是数值零或一
> glm.probs <- predict(glm.fit,Caravan[test,],type = "response")
> glm.pred <- ifelse(glm.probs >0.5,"Yes","No")
> table(glm.pred,test.Y)
        test.Y
glm.pred  No Yes
     No  934  59
     Yes   7   0

这个分类效果就差很多,Precision竟然是0!事实上,分类概率阈值为0.5是针对等可能事件,但买不买保险显然不是等可能事件,把阈值降低到0.25再看看:

> glm.pred <- ifelse(glm.probs >0.25,"Yes","No")
> table(glm.pred,test.Y)
        test.Y
glm.pred  No Yes
     No  919  48
     Yes  22  11

这下子Precision就达到1/3了,比随机猜测的精确度高出5倍不止!

以上试验都充分表明,通过机器学习算法进行精准营销的精确度比随机猜测的效果要强好几倍!

2、KNN回归

在R中,KNN分类函数是knn(),KNN回归函数是knnreg()

> #加载数据集BloodBrain,用到向量logBBB和数据框bbbDescr
> library(caret)
> data(BloodBrain)
> class(logBBB)
[1] "numeric"
> dim(bbbDescr)
[1] 208 134
> #取约80%的观测作训练集。
> inTrain <- createDataPartition(logBBB, p = .8)[[1]]
> trainX <- bbbDescr[inTrain,]
> trainY <- logBBB[inTrain]
> testX <- bbbDescr[-inTrain,]
> testY <- logBBB[-inTrain]
> #构建KNN回归模型
> fit <- knnreg(trainX, trainY, k = 3)
> fit
3-nearest neighbor regression model
> #KNN回归模型预测测试集
> pred <- predict(fit, testX)
> #计算回归模型的MSE
> mean((pred-testY)^2)
[1] 0.5821147

这个KNN回归模型的MSE只有0.58,可见回归效果很不错,偏差很小!下面用可视化图形比较一下结果。

> #将训练集、测试集和预测值结果集中比较
> df <-data.frame(class=c(rep("trainY",length(trainY)),rep("testY",length(testY)),rep("predY",length(pred))),Yval=c(trainY,testY,pred))
> ggplot(data=df,mapping = aes(x=Yval,fill=class))+
+   geom_dotplot(alpha=0.8)

这是dotplot,横坐标才是响应变量的值,纵坐标表频率。比较相邻的红色点和绿色点在横轴上的差异,即表明测试集中预测值与实际值的差距。

> #比较测试集的预测值和实际值
> df2 <- data.frame(testY,pred)
> ggplot(data=df2,mapping = aes(x=testY,y=pred))+
+   geom_point(color="steelblue",size=3)+
+   geom_abline(slope = 1,size=1.5,linetype=2)

这张散点图则直接将测试集中的实际值和预测值进行对比,虚线是。点离这条虚线越近,表明预测值和实际值之间的差异就越小。

参考文献

Gareth James et al. An Introduction to Statistical Learning.

Wikipedia. k-nearest neighbors algorithm.

KNN for Smoothing and Prediction.

R中实现knn算法(初学)

延伸阅读

  1. xlm289348, kNN(K-Nearest Neighbor)最邻近规则分类
  2. sanqima, KNN算法中常用的距离计算公式
  3. jmydream, http://blog.csdn.net/jmydream/article/details/8644004

    ?

?

时间: 2024-10-10 23:57:50

KNN算法在保险业精准营销中的应用的相关文章

笔记︱精准营销解决方案以及营销组合评估

本笔记来源于CDA-DSC-L2R的课程.主要探讨精准营销的解决方案.营销组合的评估. -------------------------------------------- 一.精准营销实际问题 充分利用各种技术手段,将营销信息推送到比较准确的受众群体中,从而既节省营销成本,又能起到最大化的营销效果.精准营销的本质是找到自己的目标客户并对其进行营销. 精准营销可以解决如下的问题: 实现 解决方案 扩大市场占有率 找出潜在客户,扩大市场份额 活动响应预警 1.在预算范围内最大化收益 2.对响应

如何运用CRM系统数据进行标签化精准营销?

相信大家都了解过大数据,也学过一些大数据分析方法.但是我们如何利用大数据分析,创造价值呢? 今天智云通CRM系统小编要跟大家分享如何运用CRM系统数据进行标签化精准营销. 这个问题从本质上看是两类问题: 对用户画像,打上标签.这是个聚类问题,将同一类用户通过算法聚合成一类. 那如何打标签呢?用户画像数据维度 针对每一类数据实体,进一步分解可落地的数据维度,形成字段集. 1. 用户数据: 用户自然特征:性别,年龄,地域,教育水平,出生日期,职业,星座 用户兴趣特征:兴趣爱好,使用APP/网站,浏览

永洪BI助力中欧基金精准营销,提升全球竞争力

数据是金融行业的命脉,但基金公司往往受限于高性能储存的高昂成本和数据处理能力的不足,占总储存量80%以上的数据并不能得到有效利用.而在未来的互联网财富管理业务竞争中,能否发挥用户数据价值,提升客户体验,将是金融机构制胜的关键. 致力成为具有全球竞争力的资产管理精品提供商,中欧基金签约永洪科技,借助永洪BI,更敏捷.更快速.更强大的特性,构建数字化运营平台,打造卓越用户体验,提升全球竞争力! 中欧基金管理有限公司成立于2006年,是国内首批员工持股的公募基金管理公司之一,核心员工成为公司重要股东.

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

KNN算法--物以类聚,人以群分

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

k-Means和KNN算法简述

k-means 算法 k-means 算法接受输入量 k :然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的. k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心:而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类:然后再计算每个所获新聚类

KNN算法的感受 1

本来预计的打算是一天一个十大挖掘算法,然而由于同时要兼顾数据结构面试的事情,所以 很难办到,但至少在回家前要把数据挖掘十大算法看完,过个好年,在course上学习老吴的课程还是帮了我很大的忙,虽然浪费了时间,但是也无形中帮助我 很多,所以说还是很值得的,今天就总结KNN算法的一部分,这部分老吴的课程中没有太多涉及到,所以我又重新关注了一下,下面是我的总结,希望能对大家有 所帮组. 介绍环镜:python2.7  IDLE  Pycharm5.0.3 操作系统:windows 第一步:因为没有nu

MLlearning(1)——kNN算法

这篇文章讲kNN(k近邻,k-Nearest Neighbour).这是一种lazy-learning,实现方便,很常用的分类方法.约定n为样本集中的样本数,m为样本的维度,则这个算法的训练复杂度为0,未加优化(线性扫描)的分类时间复杂度为,kd-Tree优化后复杂度可降为. 思路.优点及缺陷 该方法的思路是:如果一个样本在特征空间中的 k 个最相似即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.kNN 算法中,所选择的邻居都是已经正确分类的对象.该方法在分类决策上只