Python&kNN近邻:玩家流失预测
流失分析,是游戏数据分析中一个老生常谈的问题了,一般情况下,运营人员及数据分析师都会从下载-点击-注册-创角-加载-新手教程-…-流失,这样一系列的过程的转化率来一步步研究和细分来寻找玩家流失点,进而改进产品本身,或是变化其中的运营方式。这种方式在游戏测试或者前期留存震荡期及淘汰期是有显著效果的,可以细分分析到每个环节所出现的问题和痛点。当游戏进入留存稳定期时,真正目标用户的流失用这种环节转化率,等级流失,等级停滞的方法来研究便显得十分捉急了,毕竟在留存稳定期的时候,游戏已经步入正轨,玩家相对熟悉游戏玩法,玩家也在产品引导下显得成熟。这时玩家流失原因便显得错综复杂,更有意义的做法则是根据玩家游戏行为数据,对玩家进行流失预测,挑选出预测出即将可能流失的玩家,再对其行为细分分析,加以关注就显得意义深刻。
首先,何为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):
kNN算法步骤:
计算未知分类样本点与训练集中各点的欧式距离
对上一步算出的欧式距离进行排序
选择欧式距离最小的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 : 留存
...
error ratio: 0.016625
可见kNN近邻算法的训练结果是十分优异的,错误率只有1.6625%,可以用于实际的玩家流失预测。
查看评论 回复