前文参考:

​Python爬虫(一)——开封市58同城租房信息​

​Python爬虫(二)——对开封市58同城出租房数据进行分析​

​Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析​


数据的构建

Python爬虫(四)——开封市58同城数据模型训练与检测_信息增益

在这张表中我们可以发现这里有5个数据,这里有两个特征(房租是否少于2000,房屋面积是否大于50)来划分这5个出租房是否租借。 

现在我们要做的就是是要根据第一个特征,第二个特征还是第三个特征来划分数据,进行分类。

1 def createDataSet():
2 dataSet = [[1, 1, 'yes'],
3 [1, 1, 'yes'],
4 [1, 0, 'no'],
5 [0, 1, 'no'],
6 [0, 0, 'no']
7 ]
8
9 labels = ['no surfacing','flippers']
10
11 return

Python爬虫(四)——开封市58同城数据模型训练与检测_爬虫_02


计算给定数据的信息熵

根据信息论的方法找到最合适的特征来划分数据集。在这里,我们首先要计算所有类别的所有可能值的香农熵,根据香农熵来我们按照取最大信息增益的方法划分数据集。

以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。信息熵是用来衡量一个随机变量出现的期望值。如果信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。

Python爬虫(四)——开封市58同城数据模型训练与检测_python_03

其中,S为所有事件集合,p为发生概率,c为特征总数。注意:熵是以2进制位的个数来度量编码长度的,因此熵的最大值是log2C。

信息增益(information gain)是指信息划分前后的熵的变化,也就是说由于使用这个属性分割样例而导致的期望熵降低。也就是说,信息增益就是原有信息熵与属性划分后信息熵(需要对划分后的信息熵取期望值)的差值,具体计算法如下:

Python爬虫(四)——开封市58同城数据模型训练与检测_数据集_04

1 def calcShannonEnt(dataSet):
2 countDataSet = len(dataSet)
3 labelCounts={}
4 for featVec in dataSet:
5 currentLabel=featVec[-1]
6 if currentLabel not in labelCounts.keys():
7 labelCounts[currentLabel] = 0
8 labelCounts[currentLabel] += 1
9 getshang = 0.0
10
11 for key in labelCounts:
12 prob = float(labelCounts[key])/countDataSet
13 getshang -= prob * log(prob,2)
14
15
16 return

Python爬虫(四)——开封市58同城数据模型训练与检测_信息增益_05


 

划分数据集

在度量数据集的无序程度的时候,分类算法除了需要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确的划分了数据集。 
我们将对每个特征数据集划分的结果计算一次信息熵,然后判断按照那个特征划分数据集是最好的划分方式。 
也就是说,我们依次选取我们数据集当中的所有特征作为我们划定的特征,然后计算选取该特征时的信息增益,当信息增益最大时我们就选取对应信息增益最大的特征作为我们分类的最佳特征。

Python爬虫(四)——开封市58同城数据模型训练与检测_信息增益

1     dataSet = [
2 [1, 1, 'yes'],
3 [1, 0, 'no'],
4 [1, 1, 'yes'],
5 [0, 1, 'no'],
6 [0, 0, 'no']
7

在这个数据集当中有三个特征,就是每个样本的第一列和第二列,最后一列是它们所属的分类。

我们划分数据集是为了计算根据那个特征我们可以得到最大的信息增益,那么根据这个特征来划分数据就是最好的分类方法。

因此我们需要遍历每一个特征,然后计算按照这种划分方式得出的信息增益。信息增益是指数据集在划分数据前后信息的变化量。 

Python爬虫(四)——开封市58同城数据模型训练与检测_决策树_07

 


 

计算信息增益

依次遍历每一个特征,在这里我们的特征只有两个,就是房租是否少于2000,房屋面积是否大于50。然后计算出根据每一个特征划分产生的数据集的熵,和初始的数据集的熵比较,我们找出和初始数据集差距最大的。那么这个特征就是我们划分时最合适的分类特征。

 

1 def chooseBestFeatureToSplit(dataSet):
2 numFeatures = len(dataSet[0])-1
3 baseEntropy = calcShannonEnt(dataSet)
4 bestInfoGain =0.0
5 bestFeature = -1
6
7 for i in range(numFeatures):
8 featList = [sample[i] for sample in dataSet]
9 uniqueVals = set(featList)
10 newEntropy = 0.0
11 for value in uniqueVals:
12 subDataSet = splitDataSet(dataSet,i,value)
13 prob = len(subDataSet)/float(len(dataSet))
14 newEntropy += prob * calcShannonEnt(subDataSet)
15
16 infoGain = baseEntropy - newEntropy
17
18 if(infoGain > bestInfoGain):
19 bestInfoGain = infoGain
20 bestFeature = i
21
22 return

Python爬虫(四)——开封市58同城数据模型训练与检测_信息增益_08


数据检测

sklearn实现交叉验证十折交叉验证流程

将数据集随机地切分为S个互不相交的大小相同的子集

然后挑选其中S-1个子集作为训练集,训练模型,用剩下的一个子集作测试集,获得测试误差或者评测指标

将上面过程对所有可能的S种选择重复进行,即每次都是用不同的测试集

最后对S次实验所得的数据(测试误差或者评测指标)取均值。

1     train = np.array(myDat)
2 loop = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
3 kf = KFold(n_splits=10)
4
5 for train_index, test_index in kf.split(train):
6 print("train:",train_index, "test:", test_index)
7 X_train, X_test = train[train_index], train[test_index]
8 y_train, y_test = loop[train_index], loop[test_index]
9 print(calcShannonEnt(train[train_index]))

 

Python爬虫(四)——开封市58同城数据模型训练与检测_python_09

 

作者: AntzUhl