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 条评论
登录 后参与评论

相关文章

来自专栏新智元

【谷歌重磅发布2017学术影响因子】AI、视觉、机器人TOP20 榜单

【新智元导读】 近日,谷歌发布了2017最新版本的谷歌学术指标,对收录的会议和期刊论文根据被引用情况进行排名。在人工智能领域,arXiv排在第一超越了著名的NI...

3045
来自专栏大数据文摘

数学之美:两点之间最快的路径

1579
来自专栏量子位

高盛的AI说,今年世界杯冠军是巴西

世界杯开战在即,在金融业颇有权势的投行高盛,还没等比赛开始就再一次预测了最终结果。

883
来自专栏CreateAMind

End-to-end Driving via Conditional Imitation Learning

Felipe Codevilla, Matthias Müller, Alexey Dosovitskiy, Antonio López, Vladlen Ko...

733
来自专栏AI2ML人工智能to机器学习

给能量以自由吧!

在“随机眼里的临界”里面我们介绍了先驱 玻尔兹曼Boltzmann 受到Maxwell的影响, 同时被影响的还有另外一位大神叫 吉布斯 Gibbs, 这是今天的...

713
来自专栏数据结构与算法

BZOJ2005: [Noi2010]能量采集(容斥原理 莫比乌斯反演)

栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量。在这些植物采集能量后,

551
来自专栏量子位

德国AI“算个球”:西班牙是冠军,只要别让德国进八强(严谨推理)

可能是由于人类(包括球王)预测不靠谱,前几届世界杯预测战况和冠军的任务,常常交给动物完成。

792
来自专栏QQ大数据团队的专栏

一种海量社交短文本的热点话题发现方法

直接从海量文本中生成语法正确、意思明确的话题,是一件不容易的事情。本文主要介绍在话题生成上运用的一个较为简单高效的方法。

3983
来自专栏大数据挖掘DT机器学习

R语言-中国各城市PM2.5数据间的相关分析

中国各城市PM2.5数据间的相关分析 相关分析(correlation analysis)是研究现象之间是否存在某种依存关系,并对具体有依存关系的现象探讨其相关...

3784
来自专栏专知

【论文推荐】最新7篇聊天机器人(Chatbot)相关论文—触动你的心、DeepProbe、饮食推荐、知识学习、交互、挑战、管理

【导读】专知内容组整理了最近七篇聊天机器人(Chatbot)相关文章,为大家进行介绍,欢迎查看! 1. Touch Your Heart: A Tone-awa...

4355

扫描关注云+社区