目录

一.创建数据集

二.构造决策树(诊断是否复发乳腺癌)

1.信息增益生成决策树 (ID3算法)

信息熵

信息增益(ID3算法)

2.信息增益率决策树(C4.5)

3.基尼指数(CART算法 — 分类树)

三.总结


一.创建数据集

乳腺癌数据集breast-cancer.txt含有10个属性(包括决策属性)共286条样本。接下来我将一半样本作训练集,一半样本作测试集。

来源(UCI Machine Learning Repository: Breast Cancer Data Set)

属性信息

1. Class: no-recurrence-events, recurrence-events
2. age: 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-89, 90-99.
3. menopause: lt40, ge40, premeno.
4. tumor-size: 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59.
5. inv-nodes: 0-2, 3-5, 6-8, 9-11, 12-14, 15-17, 18-20, 21-23, 24-26, 27-29, 30-32, 33-35, 36-39.
6. node-caps: yes, no.
7. deg-malig: 1, 2, 3.
8. breast: left, right.
9. breast-quad: left-up, left-low, right-up, right-low, central.
10. irradiat: yes, no.

部分样本展示

no-recurrence-events,40-49,premeno,20-24,6-8,no,2,right,left_low,yes
no-recurrence-events,50-59,ge40,25-29,0-2,no,1,left,right_low,no
no-recurrence-events,60-69,ge40,15-19,0-2,no,2,left,left_up,yes
no-recurrence-events,40-49,premeno,10-14,0-2,no,2,right,left_up,no
no-recurrence-events,50-59,ge40,20-24,0-2,yes,2,right,left_up,no
no-recurrence-events,40-49,premeno,15-19,12-14,no,3,right,right_low,yes
no-recurrence-events,40-49,premeno,25-29,0-2,no,2,left,left_up,yes
no-recurrence-events,50-59,ge40,30-34,6-8,yes,2,left,left_low,no
no-recurrence-events,30-39,premeno,10-14,0-2,no,2,left,right_low,no
no-recurrence-events,50-59,premeno,50-54,0-2,yes,2,right,left_up,yes
no-recurrence-events,50-59,ge40,35-39,0-2,no,2,left,left_up,no
no-recurrence-events,50-59,premeno,10-14,3-5,no,1,right,left_up,no
no-recurrence-events,40-49,premeno,10-14,0-2,no,2,left,left_low,yes
no-recurrence-events,50-59,ge40,15-19,0-2,yes,2,left,central,yes
no-recurrence-events,50-59,premeno,25-29,0-2,no,1,left,left_low,no
no-recurrence-events,60-69,ge40,25-29,0-2,no,3,right,left_low,no
recurrence-events,50-59,premeno,15-19,0-2,no,2,left,left_low,no
recurrence-events,40-49,premeno,40-44,0-2,no,1,left,left_low,no
recurrence-events,50-59,ge40,35-39,0-2,no,2,left,left_low,no
recurrence-events,50-59,premeno,25-29,0-2,no,2,left,right_up,no
recurrence-events,30-39,premeno,0-4,0-2,no,2,right,central,no
recurrence-events,50-59,ge40,30-34,0-2,no,3,left,?,no
recurrence-events,50-59,premeno,25-29,0-2,no,2,left,right_up,no
recurrence-events,50-59,premeno,30-34,0-2,no,3,left,right_up,no
recurrence-events,40-49,premeno,35-39,0-2,no,1,right,left_up,no
recurrence-events,40-49,premeno,20-24,0-2,no,2,left,left_low,no
recurrence-events,50-59,ge40,20-24,0-2,no,2,right,central,no
recurrence-events,40-49,premeno,30-34,0-2,no,3,right,right_up,no
recurrence-events,50-59,premeno,25-29,0-2,no,1,right,left_up,no
recurrence-events,60-69,ge40,40-44,0-2,no,2,right,left_low,no

二.构造决策树(诊断是否复发乳腺癌)

什么是决策树?

  决策树是表示基于特征对实例进行分类的树形结构。从给定的训练数据集中,依据特征选择的准则,递归的选择最优划分特征,并根据此特征将训练数据进行分割,使得各子数据集有一个最好的分类的过程。

    决策树算法3要素:
    (1)特征选择
    (2)决策树生成
    (3)决策树剪枝

    关于决策树生成:
    决策树的生成过程就是使用满足划分准则的特征不断的将数据集划分为纯度更高,不确定性更小的子集的过程。

如何建造决策树?

1.信息增益生成决策树 (ID3算法)

信息熵

信息增益(ID3算法)

    定义: 以某特征划分数据集前后的熵的差值。
    在熵的理解那部分提到了,熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏
    分前样本集合D的熵是一定的 ,entroy(前),使用某个特征A 划分数据集D,计算划分后的数据子集的熵 entroy(后)。

     信息增益 = entroy(前) - entroy(后)

        做法:计算使用所有特征划分数据集D ,得到多个特征划分数据集D 的信息增益,从这些信息增益中选择最大的,因而当前结点的划分特征便是使信息增益最大的划分所使用的特征。

    代码实现

        计算数据属性的信息增益然后划分数据属性的优先级:

from math import log
import operator
import matplotlib.pyplot as pltdef calcShannonEnt(dataSet):  # 计算香农熵numEntries = len(dataSet)labelCounts = {}for featVec in dataSet:currentLabel = featVec[-1]if currentLabel not in labelCounts.keys():labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1shannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key]) / numEntriesshannonEnt -= prob * log(prob, 2)return shannonEntdef splitdataSet(dataSet, axis, value):  # 分类数据retdataSet = []for featVec in dataSet:if featVec[axis] == value:reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis + 1:])retdataSet.append(reducedFeatVec)return retdataSetdef chooseBestFeatureToSplit(dataSet):  # 选择信息增益最大的特征numFeatures = len(dataSet[0]) - 1baseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0bestFeature = -1for i in range(numFeatures):featList = [example[i] for example in dataSet]uniqueVals = set(featList)newEntropy = 0.0for value in uniqueVals:subdataSet = splitdataSet(dataSet, i, value)prob = len(subdataSet) / float(len(dataSet))newEntropy += prob * calcShannonEnt(subdataSet)infoGain = baseEntropy - newEntropyif infoGain > bestInfoGain:bestInfoGain = infoGainbestFeature = ireturn bestFeaturedef majorityCnt(classList):  # 多数决决定分类classCount = {}for vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]

      根据计算出的数据属性的优先级  ,生成决策树并实现树的可视化。

def createTree(dataSet, labels):  # 生成字典形式的树classList = [example[-1] for example in dataSet]if classList.count(classList[0]) == len(classList):return classList[0]if len(dataSet[0]) == 1:return majorityCnt(classList)bestFeat = chooseBestFeatureToSplit(dataSet)bestFeatLabel = labels[bestFeat]myTree = {bestFeatLabel: {}}del (labels[bestFeat])featValues = [example[bestFeat] for example in dataSet]uniqueVals = set(featValues)for value in uniqueVals:subLabels = labels[:]myTree[bestFeatLabel][value] = createTree(splitdataSet(dataSet, bestFeat, value), subLabels)return myTreedecisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")def getNumLeafs(myTree):numLeafs = 0# firstStr = myTree.keys()[0]  2.7的语法,3.6不适用firstSides = list(myTree.keys())firstStr = firstSides[0]  # 找到输入的第一个元素secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':  # test to see if the nodes are dictonaires, if not they are leaf nodesnumLeafs += getNumLeafs(secondDict[key])else:numLeafs += 1return numLeafsdef getTreeDepth(myTree):maxDepth = 1firstSides = list(myTree.keys())firstStr = firstSides[0]  # 找到输入的第一个元素# firstStr = myTree.keys()[0] #注意这里和机器学习实战中代码不同,这里使用的是Python3,而在Python2中可以写成这种形式secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]) == dict:thisDepth = 1 + getTreeDepth(secondDict[key])else:thisDepth = 1if thisDepth > maxDepth: maxDepth = thisDepthreturn maxDepthdef plotNode(nodeTxt, centerPt, parentPt, nodeType):createPlot.ax1.annotate(nodeTxt, xy=parentPt, xycoords='axes fraction',xytext=centerPt, textcoords='axes fraction',va="center", ha="center", bbox=nodeType, arrowprops=arrow_args)def plotMidText(cntrPt, parentPt, txtString):xMid = (parentPt[0] - cntrPt[0]) / 2.0 + cntrPt[0]yMid = (parentPt[1] - cntrPt[1]) / 2.0 + cntrPt[1]createPlot.ax1.text(xMid, yMid, txtString, va="center", ha="center", rotation=30)def plotTree(myTree, parentPt, nodeTxt):numLeafs = getNumLeafs(myTree)depth = getTreeDepth(myTree)firstSides = list(myTree.keys())firstStr = firstSides[0]  # 找到输入的第一个元素cntrPt = (plotTree.xOff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalW, plotTree.yOff)plotMidText(cntrPt, parentPt, nodeTxt)plotNode(firstStr, cntrPt, parentPt, decisionNode)secondDict = myTree[firstStr]plotTree.yOff = plotTree.yOff - 1.0 / plotTree.totalDfor key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':plotTree(secondDict[key], cntrPt, str(key))else:plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalWplotNode(secondDict[key], (plotTree.xOff, plotTree.yOff), cntrPt, leafNode)plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalDdef createPlot(inTree):fig = plt.figure(1, facecolor='white')fig.clf()axprops = dict(xticks=[], yticks=[])createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)  # no ticks# createPlot.ax1 = plt.subplot(111, frameon=False) #ticks for demo puropsesplotTree.totalW = float(getNumLeafs(inTree))plotTree.totalD = float(getTreeDepth(inTree))plotTree.xOff = -0.5 / plotTree.totalWplotTree.yOff = 1.0plotTree(inTree, (0.5, 1.0), '')plt.show()def classify(inputTree, featLabels, testVec):  # 决策树执行分类firstStr = list(inputTree.keys())[0]secondDict = inputTree[firstStr]# print(secondDict)featIndex = featLabels.index(firstStr)try:for key in secondDict.keys():if testVec[featIndex] == key:  # 查找测试样本中是否有标签与决策树中的相同if type(secondDict[key]).__name__ == "dict":classLabels = classify(secondDict[key], featLabels, testVec)else:classLabels = secondDict[key]return classLabelsexcept:return secondDict[key]

取偶数样本数据构造训练集


def file_train(filename):  # 取数据集偶数作为训练集fr = open(filename)lines = fr.readlines()# print(lines)res = []i = 0for line in lines:line = line.strip()temp = line.split(",")if i % 2 == 0:  # 取总数据集里的偶数res.append(temp)i += 1labels = ["Class", "age", "menopause", "tumor-size", "inv-nodes", "node-caps", "deg-malig", "breast", "breast-quad", "irradiat"]return res, labels

取奇数样本数据构造测试集

def file_test(filename):  # 取数据集的奇数作为测试集fr = open(filename)lines = fr.readlines()# print(lines)res = []i = 0for line in lines:line = line.strip()temp = line.split(",")if i % 2 == 1:  # 取总数据集里的奇数res.append(temp)i += 1labels = ["Class", "age", "menopause", "tumor-size", "inv-nodes", "node-caps", "deg-malig", "breast", "breast-quad", "irradiat"]return res, labelsdef getAnswer(filename):  # 获得真实的答案fr = open(filename)lines = fr.readlines()i = 0storage = []for it in lines:it = it.strip()temp = it.split(",")if i % 2 == 1:storage.append(temp[-1])i += 1return storage

开始训练模型,查看模型的正确率

def test():# 训练模型dataSet, labels = file_train("breast-cancer.txt")labelsBackup = labels[:]tree = createTree(dataSet, labels)createPlot(tree)dataSet_test, labels_test = file_test("breast-cancer.txt")labels_testBackup = labels_testj = 0resTest = []for item in dataSet_test:testAns = classify(tree, labels_testBackup, item)print("第%d次测试" % j, testAns)resTest.append(testAns)j += 1aList = getAnswer("breast-cancer.txt")count = 0for x in range(len(aList)):if resTest[x] == aList[x]:count += 1print("训练出的模型的正确率:", count / len(aList))if __name__ == '__main__':test()

代码运行结果

可视化决策树图

  

2.信息增益率决策树(C4.5)

信息增益比 = 惩罚参数 * 信息增益

    注意:其中的H A ( D ) ,对于样本集合D,将当前特征A作为随机变量(取值是特征A 的各个特征值),求得的经验熵。
    (之前是把集合类别作为随机变量,现在把某个特征作为随机变量,按照此特征的特征取值对集合D进行划分,计算熵H A ( D )

    信息增益比本质: 是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。

    惩罚参数:数据集D以特征A作为随机变量的熵的倒数,即:将特征A取值相同的样本划分到同一个子集中(之前所说数据集的熵是依据类别进行划分的)

        代码实现(C4.5ID3代码差异不大,修改chooseBestFeatureToSplit(dataSet)即可

#按照给定特征划分数据集
def splitDataSet(dataSet, axis, value):#给定数据集、划分数据集的特征 、特征所对应的值retDataSet = []                #创建一个备份数据集,避免原始数据被修改for featVec in dataSet:        #遍历数据集if featVec[axis] == value: #该特征维度下和value值相等的样本划分到一起,并将该特征去除掉维度去掉#将axis维度两边的数据进行拼接,就将该特征维度给去除掉reducedFeatVec = featVec[:axis]   #取得[0,axis)的一个列表reducedFeatVec.extend(featVec[axis+1:])  #取得[axis+1,结束]的一个列表retDataSet.append(reducedFeatVec)return retDataSet#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1      #特征数量,numfeature为特征的维度,因为最后一列为标签,所以需要减去1baseEntropy = calcShannonEnt(dataSet)  #用来记录最小信息熵,初始值为原始数据集对应的信息熵bestinfoGainratio = 0.0   #信息增益率初始化为0,bestFeature = -1     #最优的划分特征初始化为-1for i in range(numFeatures):           #遍历所有的特征featList = [example[i] for example in dataSet]  #创建list用来存每个样本在第i维度的特征值uniqueVals = set(featList)       #获取该特征下的所有不同的值,即根据该特征可以划分为几类,可以去除重复值newEntropy = 0.0                 #初始化熵为0IV = 0.0for value in uniqueVals:         #遍历该特征维度下对应的所有特征值subDataSet = splitDataSet(dataSet, i, value)  #依据这个值,将样本划分为几个子集,有几个value,就有几个子集prob = len(subDataSet)/float(len(dataSet))   #计算p值newEntropy += prob * calcShannonEnt(subDataSet)     #计算每个子集对应的信息熵,并全部相加,得到划分后数据的信息熵IV -= prob * log(prob,2)infoGain = baseEntropy - newEntropy     #将原数据的信息熵-划分后数据的信息熵,得到信息增益if IV == 0.0:                           #除以0处理infoGainratio = 0.0else:infoGainratio = float(infoGain) / float(IV)if (infoGainratio > bestinfoGainratio):      #如果这个信息增益率比当前记录的最佳信息增益率还大,就将该增益和划分依据的特征记录下来bestinfoGainratio = infoGainratio        #更新信息增益率,找到最大的信息增益率bestFeature = i                #记录信息增益率最大的索引值return bestFeature                      #returns an integer

代码运行结果

可视化决策树图

3.基尼指数(CART算法 — 分类树)

定义:基尼指数(基尼不纯度),表示在样本集合中一个随机选中的样本被分错的概率。
    注意: 基尼指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。
    即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率

    书中公式:

    说明:
    1. p k 表示选中的样本属于k kk类别的概率,则这个样本被分错的概率是( 1 − p k ) (1 - p_k)(1−pk​)
    2. 样本集合中有K KK个类别,一个随机选中的样本可以属于这k kk个类别中的任意一个,因而对类别就加和
    3. 当为二分类是,G i n i ( p ) = 2 p ( 1 − p )

    样本集合D的 Gini指数 :假设集合中有K个类别,则:

    基于特征A划分样本集合D之后的基尼指数:
    需要说明的是CART是个二叉树,也就是当使用某个特征划分样本集合只有两个集合:1. 等于给定的特征值的样本集合D1;2 不等于给定的特征值的样本集合D2​。
    实际上是对拥有多个取值的特征的二值处理。

     代码实现(不用计算香农熵,改用基尼指数来划分属性,同时修改                 chooseBestFeatureToSplit(dataSet)即可)

def calcProbabilityEnt(dataSet):numEntries = len(dataSet)  # 数据条数feaCounts = 0fea1 = dataSet[0][len(dataSet[0]) - 1]for feaVec in dataSet:if feaVec[-1] == fea1:feaCounts += 1probabilityEnt = float(feaCounts) / numEntriesreturn probabilityEnt# 选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1  # 特征数量,numfeature为特征的维度,因为最后一列为标签,所以需要减去1if numFeatures == 1:  # 当只有一个特征时return 0bestGini = 1  # 最佳基尼指数bestFeature = -1  # 最优的划分特征初始化为-1for i in range(numFeatures):  # 遍历所有的特征featList = [example[i] for example in dataSet]  # 创建list用来存每个样本在第i维度的特征值feaGini = 0  # 定义特征的值的基尼系数uniqueVals = set(featList)  # 获取该特征下的所有不同的值,即根据该特征可以划分为几类,可以去除重复值for value in uniqueVals:  # 遍历该特征维度下对应的所有特征值subDataSet = splitDataSet(dataSet, i, value)  # 依据这个值,将样本划分为几个子集,有几个value,就有几个子集prob = len(subDataSet) / float(len(dataSet))  # 计算p值probabilityEnt = calcProbabilityEnt(subDataSet)feaGini += prob * (2 * probabilityEnt * (1 - probabilityEnt))if (feaGini < bestGini):bestGini = feaGinibestFeature = i  # 记录基尼指数最小的索引值return bestFeature  # returns an integer

基尼指数越大,集合的不确定性越高,这点和信息熵类似。故此,每次为决策树构建下一节点时总是取基尼指数小的属性。

代码运行结果

可视化决策树图

三.总结

   信息增益的理解
    对于待划分的数据集D,其 entroy(前)是一定的,但是划分之后的熵 entroy(后)是不定的,entroy(后)越小说明使用此特征划分得到的子集的不确定性越小(也就是纯度越高),因此 entroy(前) - entroy(后)差异越大,说明使用当前特征划分数据集D 的话,其纯度上升的更快。而我们在构建最优的决策树的时候总希望能更快速到达纯度更高的集合,这一点可以参考优化算法中的梯度下降算法,每一步沿着负梯度方法最小化损失函数的原因就是负梯度方向是函数值减小最快的方向。同理:在决策树构建的过程中我们总是希望集合往最快到达纯度更高的子集合方向发展,因此我们总是选择使得信息增益最大的特征来划分当前数据集D。

    缺点:信息增益偏向取值较多的特征
    原因:当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益更大,因此信息增益比较偏向取值较多的特征。

     信息增益率:

      缺点:信息增益比偏向取值较少的特征
    原因: 当特征取值较少时H A ( D ) 的值较小,因此其倒数较大,因而信息增益比较大。因而偏向取值较少的特征。
    使用信息增益率:基于以上缺点,并不是直接选择信息增益率最大的特征,而是现在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。

其中信息增益和信息增益率通常用于离散型的特征划分,ID3和C4.5通常情况下都是多叉树,也就是根据离散特征的取值会将数据分到多个子树中;而CART树为二叉树,使用基尼指数作为划分准则,对于离散型特征和连续行特征都能很好的处理。

【机器学习】采用信息增益、信息增益率、基尼指数来建造决策树。相关推荐

  1. AI基础:信息熵、信息增益、信息增益率、基尼指数

    给实习生聊到决策树.GBDT,有几个概念这里再用易懂的方式解释下 文章目录 信息熵 条件熵 信息增益 信息增益率 基尼指数 信息熵是决策树的基础 信息增益-ID3算法构建决策树 信息增益率-C4.5算 ...

  2. 决策树(信息熵、增益率、基尼指数)

    目录 前言 一.决策树是什么? 二.实验过程 1.选择数据集中各个决策属性的优先级 1.1信息熵 1.2增益率 1.3基尼指数 2.决策树的构造 2.1创建决策树: 2.2准备数据: 2.3.读取和保 ...

  3. 决策树信息增益|信息增益比率|基尼指数实例

    今天以周志华老师的西瓜为例,复盘一下三种决策树算法. 文章目录 信息增益(ID3算法) 信息增益比率(C4.5算法) 基尼指数(CART算法) 数据: 信息增益(ID3算法) 信息熵表示信息的混乱程度 ...

  4. 机器学习:信息熵,基尼系数,条件熵,条件基尼系数,信息增益,信息增益比,基尼增益,决策树代码实现(一)

    文章目录 初始化,涉及到使用的变量: 信息熵 定义公式,经验公式 代码: 基尼系数 定义公式,经验公式 代码: 条件熵,条件基尼系数 条件熵定义公式,经验公式 条件基尼系数定义公式,经验公式 代码: ...

  5. 机器学习——基尼指数

    定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率. 注意: Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯. 即 基尼指数 ...

  6. 机器学习与scikit-learn-13]:算法 - 分类的本质与样本分布的离散程度的指标:纯度、信息熵、 基尼指数.

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址: 目录 第1章 分类问题的本质 1.1 多特征样本的本质 1.2 分类的本质 第2章  纯度(pu ...

  7. 基尼指数——基尼系数是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。基尼系数介于0-1之间,基尼系数越大,表示不平等程度越高。...

    基尼系数是指国际上通用的.用以衡量一个国家或地区居民收入差距的常用指标.基尼系数介于0-1之间,基尼系数越大,表示不平等程度越高. 收入基尼系数 其具体含义是指,在全部居民收入中,用于进行不平均分配的 ...

  8. 决策树之基尼指数理解

    基尼指数和信息熵都是用来描述系统混乱度的量  数学形式不一样,干的事是一样的 不纯度(impurity)--GINI系数:(不纯度就是混乱度) 公式 例子(与信息熵干的是一件事) 决策树模型理解 二. ...

  9. 熵(Entropy)、信息熵增益、信息熵增率和基尼(Gini)指数

    文章中的这些概念为衡量特征(属性)选择的方法,特征选择在于选取对训练数据具有分类能力的特征,提高决策树学习的效率,特征选择是决定用哪个特征来划分特征空间. 文章目录 信息熵(information e ...

最新文章

  1. autoware框架与功能简介(一)
  2. 那些年你用过哪些消息中间件?为什么又弃了?现在用的是什么?
  3. NLP之TM:基于gensim库调用20newsgr学习doc-topic分布并保存为train-svm-lda.txt、test-svm-lda.txt
  4. 【PAT乙级】1031 查验身份证 (15 分)
  5. POJ - 2248 Addition Chains(dfs+迭代加深)
  6. oracle sql 分区查询语句_oracle11g 表分区后的查询语句如何知道是否进行了全表扫描...
  7. 使用Ext Designer 设计简单计算器
  8. 理解偏倚:可靠结果的先决条件
  9. java正则替换数字_Java 正则表达式,替换图片名称,替换数字,和谐用语,复制文件...
  10. springcloud(第三篇)springcloud eureka 服务注册与发现 *****
  11. php编码怎么变西欧了403,你知道一个简单的PHP脚本在ip检查后抛出403吗?
  12. java实例是什么_java 什么是实例
  13. WebView复制粘贴文本
  14. 关闭apache自动目录列表功能的三种方法
  15. python如何做一个财务报表_用python帮财务小姐姐自动生成财务报表
  16. 江飞 福州大学数学与计算机科学学院,强极值原理、第二边值问题解的唯一性.ppt...
  17. 怎么利用电脑摄像头和上传图片读取扫描二维码内容
  18. 语义化版本号 Sematic Versioning
  19. python编程入门第一课_[转载]Python第一课教学设计及反思
  20. 2018年年初的面试经验谈

热门文章

  1. 软件测试220道试题及答案
  2. jquery 自动表单赋值
  3. 【机器学习】LayerNorm BatchNorm的作用以及区别
  4. 训练误差与泛化误差的说明
  5. FANUC机器人_三点法设置工具坐标系的具体方法步骤(图文)
  6. VisionBank机器视觉软件-工业机器视觉检测
  7. 计算机电缆的表示方式,各种电缆型号的表示方法
  8. linux tc实现ip流量限制
  9. jspdf-html2canvas 自动分页 网页导出pdf 自动根据dom子节点的高度进行分页,避免dom的内容在分页的时候被截断
  10. 不显示藏宝阁试穿服务器,梦幻西游:真的感谢藏宝阁的试穿系统,圆了我拥有无级别的梦...