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

http://www.gamedas.com

kNN近邻算法步骤：

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

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

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

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

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

def autoNorm(dataSet):

'''

'''

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算法步骤：

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)

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__':

'''

'''

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

821 篇文章180 人订阅

0 条评论

相关文章

4.3K3

3486

29310

3209

4614

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

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

3196

3895

3446

1905

3426