Python&kNN近邻:玩家流失预测

作者:Fish

http://www.gamedas.com

流失分析,是游戏数据分析中一个老生常谈的问题了,一般情况下,运营人员及数据分析师都会从下载-点击-注册-创角-加载-新手教程-…-流失,这样一系列的过程的转化率来一步步研究和细分来寻找玩家流失点,进而改进产品本身,或是变化其中的运营方式。这种方式在游戏测试或者前期留存震荡期及淘汰期是有显著效果的,可以细分分析到每个环节所出现的问题和痛点。当游戏进入留存稳定期时,真正目标用户的流失用这种环节转化率,等级流失,等级停滞的方法来研究便显得十分捉急了,毕竟在留存稳定期的时候,游戏已经步入正轨,玩家相对熟悉游戏玩法,玩家也在产品引导下显得成熟。这时玩家流失原因便显得错综复杂,更有意义的做法则是根据玩家游戏行为数据,对玩家进行流失预测,挑选出预测出即将可能流失的玩家,再对其行为细分分析,加以关注就显得意义深刻。

首先,何为kNN近邻?所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。这里通过kNN找到未知状态玩家(流失或留存)相近k个邻居的相应状态(流失或留存),并根据这k个邻居的状态分布来判断未知状态玩家的状态(流失或留存)。

kNN近邻算法步骤:

1.挑选影响玩家流失的主要影响因素,根据Fish的工作经验及业务理解,Fish选择了每次游戏时长,平均游戏次数,充值金额,等级流失概率作为影响玩家流失的主要因素。

2.对影响因素做非量纲化处理,消除不同因素间单位不同对预测结果的影响。

3.计算未知状态玩家与已知状态玩家的欧几里得距离,并作升序。

4.设定K值,这里设定K值为3,即找出与未知状态玩家距离最短的3个已知状态玩家。

5.根据这3个已知状态玩家的状态(流失或留存)判断获得未知状态玩家的状态。

具体python代码如下:

def autoNorm(dataSet):

'''

数据标准化,消除量纲影响,公式:f(x)=x-min(x)/max(x)-min(x)

函数返回标准化矩阵normDataSet,极值ranges,最小值minVals

'''

minVals = dataSet.min(0)

maxVals = dataSet.max(0)

ranges = maxVals - minVal

normDataSet = np.zeros(shape(dataSet))

m = dataSet.shape[0]

normDataSet = dataSet - np.tile(minVals,(m,1))

normDataSet = normDataSet/np.tile(ranges,(m,1))

return normDataSet,ranges,minVals

def kNN(newInput,dataSet,lables,k):

'''

变量声明:newInput:输入未知分类样本点;dataset:kNN近邻训练集;labels:dataset中各样本对应的类别;k:k值

kNN算法步骤:

  1. 计算未知分类样本点与训练集中各点的欧式距离
  2. 对上一步算出的欧式距离进行排序
  3. 选择欧式距离最小的k个点,根据这k个点所属类别的分布,判断未知分类样本点属于哪个类别

'''

numSample = dataSet.shape[0]

diff = np.tile(newInput,(numSample,1))-dataSet

squredDiff = diff**2

squredDis = np.sum(squredDiff,axis = 1)

distance = squredDis**0.5

sortedDistIndices = np.argsort(distance)

classCount = {}

for i in xrange(k):

voteLabel = lables[sortedDistIndices[i]]

classCount[voteLabel] = classCount.get(voteLabel,0)+1

maxCount = 0

for key,value in classCount.items():

if value>maxCount:

maxCount = value

maxIndex = key

return maxIndex

def fileMatrix(filename):

'''

filename:路径下文件名,如test.txt

fileMatrix主要是将数据文件分割成数据属性矩阵returnMat及数据类别矩阵classLabelVector

'''

fr = open(filename)

arrayLines = fr.readlines()

numberOfLines = len(arrayLines)

returnMat = np.zeros([numberOfLines,2])

classLabelVector = []

index = 0

for line in arrayLines:

line = line.strip()

listFormLine = line.split('\t')

print listFormLine

print listFormLine[0]

returnMat[index,:] = listFormLine[0:2]

classLabelVector.append(int(listFormLine[-1]))

index += 1

return returnMat,classLabelVector

if __name__ == '__main__':

'''

测试部分,比较kNN分类器预测结果和实际结果,计算错误率

'''

datingDateMat,datingDateLables = fileMatrix('test.txt')

normMat,ranges,minVals = autoNorm(datingDateMat)

numTestVecs = int(m*normMat.shape[0])

errorCount = 0.0

for i in range(numTestVecs):

classifierResult = kNN(normMat[i,:],normMat[numTestVecs:m,:],datingDateLables[numTestVecs:m,:],3)

print "kNN result : %d , real result : %d " % (classifierResult,datingDateLables[i])

if (classifierResult != datingDateLables[i]):

errorCount += 1.0

print "error ratio: %f " % (errorCount/float(numTestVecs))

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 留存

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

kNN result : 流失 , real result : 流失

...

...

error ratio: 0.016625

可见kNN近邻算法的训练结果是十分优异的,错误率只有1.6625%,可以用于实际的玩家流失预测。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

AI 技术讲座精选:TensorFlow 图像识别功能在树莓派上的应用

【AI100 导读】上周 TensorFlow 1.0 的发布使之成为最有前景的深度学习框架,也在中国 AI 社区中掀起了学习 TensorFlow 的热潮,不...

3498
来自专栏思影科技

精神分裂患者核心认知损伤与白质的关系

来自美国巴尔的摩马里兰精神病学研究中心的Peter Kochunov等人在 JAMA Psychiatry期刊发文,确定在精神分裂患者中改变的白质连接是与两大核...

3357
来自专栏媒矿工厂

视频体验评估标准(uVES1.0)模型及算法解读

视频业务快速发展,已经从强调用户规模走向注重提升服务品质的阶段。消费者对观看体验的要求不断提高,提升视频用户体验质量已经成为视频服务的主要竞争因素。

1490
来自专栏机器之心

华为麒麟的AI性能是高通的3.5倍?这是所有手机运行神经网络的能力

高通、华为、联发科有什么共通点?这三家厂商都做加速手机、平板等移动设备中计算机视觉、NLP 以及其他机器学习任务的硬件架构。然而,这存在一个问题,即开发者难以判...

1120
来自专栏程序你好

谷歌通过定制的深度学习模型升级了其语音转文字的服务

1095
来自专栏达观数据

技术干货 | “想你所想”之个性化推荐:实践与优化

在当今 DT 时代,每天都在产生着海量的数据,移动互联网的兴起更是让我们体验到获取信息是如此的简单和方便。 同时,更多的选择也带来更多的困扰,面对层出不穷的信...

3675
来自专栏新智元

Nature 神经科学 | 科学家首次发现使用动态贝叶斯推理的脑区

想象一下,房间里灯关着,黑漆漆的,你刚睡醒,想出门去。你张着双臂摸索着朝门走去,这时你会凭记忆来预测自己离门的距离,并以此决定自己脚下的步子。假如你不小心碰到了...

3254
来自专栏媒矿工厂

【视频编码】 Content Aware ABR技术(四)

在本系列前面的帖子中,我们梳理了Netflix、YouTube和Beamr在ABR方面的一些进展,本文将简要介绍一下编码优化领域的另一位成员—EuclidIQ的...

3429
来自专栏AI科技评论

业界 | 谷歌 Smart Compose:神经网络可以帮你写 Gmail 邮件了

AI 科技评论按:在 Google I/O 2018 上,除了 Google 助手给餐馆打电话的场景赢得现场观众的喝彩外,在用户写邮件时可预测下一句的 Smar...

853
来自专栏媒矿工厂

视频编码优化之道

5月20号,在LiveVideoStack音视频技术社区举办的WebRTCon 2018大会上,上海交通大学图像所宋利教授在WebRTC与Codec专题作为出品...

1591

扫码关注云+社区