使用python训练随机森林模型辨别可疑流量

通过数据分析辨别可疑和虚假流量的方法我们在之前的文章中曾经介绍过。本篇文章我们对这个方法进行自动化,介绍如何通过随机森林分类预测模型对流量进行分类,从中发现可疑流量的影子。需要特殊说明的是本篇文章中的数据并非真实数据,我们只使用三个简单用户行为特征指标对方法和过程进行说明。真实世界中情况会更加复杂。

website-traffic1

随机森林是一个包含多颗决策树的分类预测算法。通过随机抽样的方式从数据表中生成多张抽样的数据表,对每个抽样的数据表生成一棵决策树。将多颗决策树组成一个随机森林。当有一条新的数据产生时,让森林里的每一颗决策树分别进行判断,以投票最多的结果作为最终的判断结果。下面我们来介绍如何在python中使用机器学习库sklearn建立随机森林模型并进行分类和预测。

random-forest

准备工作

首先导入需要使用的库文件,依次为数值计算库numpy,科学计算库pandas,交叉验证库cross_validation和随机森林分类算法库RandomForestClassifier。

#导入数值计算库
import numpy as np
#导入科学计算库
import pandas as pd
#导入交叉验证库
from sklearn import cross_validation
#导入随机森林算法库
from sklearn.ensemble import RandomForestClassifier

读取并查看数据表

读取流量数据表,其中包括流量的新访比例,跳出率和浏览深度三个关键指标。其中一部分已经被证明为可疑流量并进行了标注,另一部分则为正常流量。我们将使用这些数据对随机森林分类模型进行训练和测试。

#读取流量数据并创建名为traffic的数据表
traffic=pd.DataFrame(pd.read_excel('traffic_type.xlsx'))
#查看数据表内容
traffic.head()

%e6%b5%8f%e8%a7%88%e9%87%8f%e6%95%b0%e6%8d%ae%e8%a1%a8

#查看数据表列标题
traffic.columns
Index(['New_Sessions', 'Bounce_Rate', 'Pages_Session', 'Type'], dtype='object')

设置模型特征X及目标Y

将流量数据表中的新访占比,跳出率和浏览深度数据设置为特征值X。流量的类别是我们要进行分类预测的结果,因此将流量类别设置为目标值Y。

#设置特征值X
X = np.array(traffic[['New_Sessions','Bounce_Rate','Pages_Session']])
#设置目标值Y
Y = np.array(traffic['Type'])
#查看数据集的维度
X.shape,Y.shape
((100, 3), (100,))

将数据分割为训练集和测试集

采用随机的方式将数据表分割为训练集和测试集,其中60%的训练集数据用来训练模型,40%的测试集数据用来检验模型准确率。

X_train,X_test,y_train,y_test = cross_validation.train_test_split(X, Y, test_size=0.4, random_state=0)

60%的数据为训练数据集,用来对随机森林分类器进行训练。

#查看训练集的维度
X_train.shape, y_train.shape
((60, 3), (60,))

40%的数据为测试数据集,用来对随机森林模型的分类效果进行测试。

#查看测试集的维度
X_test.shape, y_test.shape
((40, 3), (40,))

建立随机森林模型并进行训练

设置好数据集后,开始建立随机森林模型,并使用测试数据集对模型进行训练,并使用测试数据集对模型的训练结果进行评估。

#建立模型
clf = RandomForestClassifier()

#对模型进行训练
clf = clf.fit(X_train, y_train)

#对模型进行测试
clf.score(X_test, y_test)
0.875

模型准确率为87.5%

检验并进行分类预测

我们可以使用随机森林模型对数据进行分类和预测,首先查看下模型的分类标签,这将帮助我们更好的理解后面的分类预测结果。使用clf.classes_获得两个分类标签的名称,第一个类别为doubt,第二个类别为normal。

clf.classes_
array(['doubt', 'normal'], dtype=object)

首先使用测试集数据对模型的分类结果做个检验,测试集数据是历史数据,因此我们已经知道了流量所属的类别结果。提取测试集数据的第一个流量类别,结果为normal。

y_test[0]
'normal'

将测试集数据代入到模型中进行拟合,获得的分类结果为normal,与正确的结果一致。

clf.predict(X_test[0])
array(['normal'], dtype=object)

进一步查看随机森林模型对流量数据分类的概率,第一个流量20%的概率为doubt类,80%的概率为normal类,因此将这条流量数据归为normal类别。

clf.predict_proba(X_test[0])
array([[ 0.2, 0.8]])

换一组数据进行预测,新访比例80%,跳出率60%,浏览深度1.3。通过模型预测这条流量数据为doubt类别的可疑流量。

clf.predict([[0.8,0.6,1.3]])
array(['doubt'], dtype=object)

这条流量数据被预测为doubt的概率为80%,预测为normal的概率为20%。因此被归为doubt分类。

clf.predict_proba([[0.8,0.6,1.3]])
array([[ 0.8, 0.2]])

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—

Comments

  1. Kee says:

    王大大,你好!自今年10月开始关注您的分析笔记,个人感觉非常受用,非常感谢大大的分享。但在做例子时候,数据成为自身学习的桎梏,希望大大能模拟相关的数据,帮助我们这些小白更好地理解例子。再次感谢大大的分享,祝网站越做越好·

Trackbacks

  1. (20170310)虚假流量初步分析(规律总结)

      参考虚假流量判断文章: 使用本福德定律甄别数据造假:http://mp.weixin.qq.co

Speak Your Mind

*