前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python&kNN近邻:玩家流失预测

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

作者头像
机器学习AI算法工程
发布2018-03-13 11:34:28
1.9K0
发布2018-03-13 11:34:28
举报
文章被收录于专栏:机器学习AI算法工程

作者: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%,可以用于实际的玩家流失预测。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档