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

相关文章

来自专栏张红林的专栏

机器学习入门书籍简介

在AIclub看到一篇机器学习入门的文章,回想自己磕磕碰碰走过的弯路,颇有感触,因此对自己从懵懂到稍稍入门过程中看过的教程做一个简单的介绍,希望帮到后来人。

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

【趣味】数据挖掘(1)——"被打"与"北大"的关联

小时候喜欢读趣味数理化,所以久有一个小心愿,写一组趣味数据挖掘的科普博文。要把数据挖掘的一些概念讲得通俗有趣,需要好的例子,正搜寻中,一个有趣的、适合解...

3486
来自专栏数据科学与人工智能

【数据科学家】数据科学家修炼之路

经常有人问我“要成为数据挖掘工程师或者数据科学家应该读什么书?”类似的问题。下面是一份建议书单,同时也是成为数据科学家的指南,当然,这不包括取得合适大学学位的要...

29310
来自专栏机器之心

业界 | 谷歌发布神经音频合成器NSynth:专注于启迪音乐创作

选自Magenta 作者:Jesse Engel等 机器之心编译 参与:晏奇、黄小天 Magenta 的目标之一是运用机器学习发现人类表达的新途径,因此,今天我...

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

网易云音乐歌单的推荐算法解析

网易云音乐的歌单推荐算法是怎样的呢?最近有很多人关心这个问题。调查了一些网易云音乐的重度患者,小咖带你来看一些路过大神的精辟分析。 分析一: “商品推荐”系统...

4614
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 3 - 人类学习的启示

? 机器学习 上一篇TensorFlow的内核基础介绍了TF Core中的基本构造块,在介绍其强大的API之前,我们需要先明了TF所要解决的核心问题:机器学习...

3196
来自专栏AI研习社

有没有必要把机器学习算法自己实现一遍?

哈哈哈哈,我觉得很多人都有这个疑问吧。机器学习好高大上,多么牛逼的东西,光是看公式就已经眼花缭乱了,总觉得自己该全部去实现一遍,有的时候太懒,有的时候觉得能力不...

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

【趣味】数据挖掘(3)—Apriori算法-论文引用与数据血统论

本文先通俗地介绍快速挖掘关联规则的Apriori算法,然后介绍发表这一算法的论文(它被引用了11480+次),最后关注此文的实际影响 与 传统影响因子的...

3446
来自专栏挖掘大数据

10种受欢迎的数据挖掘的实用分析方法

数据挖掘又称数据库中的知识发现,是目前人工智能和数据库领域研究的热点问题,本文将介绍数据挖掘中十种实用分析方法。

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

最近比较火的10篇大数据文章,看看你错过了哪篇?

翻译 | AI科技大本营(rgznai100) 参与 | Shawn Sicara团队精挑细选,了10篇在今年7月发表的大数据相关文章(Sicara是一家从事A...

3426

扫码关注云+社区