试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一颗决策树。

代码

import numpy as np
import matplotlib.pyplot as plt
from pylab import *# 特征字典,后面用到了好多次,干脆当全局变量了
featureDic = {'色泽': ['浅白', '青绿', '乌黑'],'根蒂': ['硬挺', '蜷缩', '稍蜷'],'敲声': ['沉闷', '浊响', '清脆'],'纹理': ['清晰', '模糊', '稍糊'],'脐部': ['凹陷', '平坦', '稍凹'],'触感': ['硬滑', '软粘']}def getDataSet():"""get watermelon data set 3.0 alpha.:return: 编码好的数据集以及特征的字典。"""dataSet = [['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460, 1],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.774, 0.376, 1],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.634, 0.264, 1],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.608, 0.318, 1],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.556, 0.215, 1],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.403, 0.237, 1],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', 0.481, 0.149, 1],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', 0.437, 0.211, 1],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', 0.666, 0.091, 0],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', 0.243, 0.267, 0],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', 0.245, 0.057, 0],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', 0.343, 0.099, 0],['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', 0.639, 0.161, 0],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', 0.657, 0.198, 0],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.360, 0.370, 0],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', 0.593, 0.042, 0],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719, 0.103, 0]]features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖量']# #得到特征值字典,本来用这个生成的特征字典,还是直接当全局变量方便# featureDic = {}# for i in range(len(features)):#     featureList = [example[i] for example in dataSet]#     uniqueFeature = list(set(featureList))#     featureDic[features[i]] = uniqueFeature# 每种特征的属性个数numList = []  # [3, 3, 3, 3, 3, 2]for i in range(len(features) - 2):numList.append(len(featureDic[features[i]]))# 编码,把文字替换成数字。用1、2、3表示同种特征的不同类型newDataSet = []for dataVec in dataSet:  # 第一每一个数据dataNum = dataVec[-3:]  # 保存数据中的数值部分newData = []for i in range(len(dataVec) - 3):  # 值为字符的每一列for j in range(numList[i]):  # 对应列的特征的每一类if dataVec[i] == featureDic[features[i]][j]:newData.append(j+1)newData.extend(dataNum)  # 编码好的部分和原来的数值部分合并newDataSet.append(newData)return np.array(newDataSet), features# # test getDataSet()
# newData, features = getDataSet()
# print(newData)
# print(features)def calEntropy(dataArr, classArr):"""calculate information entropy.:param dataArr::param classArr::return: entropy"""n = dataArr.sizedata0 = dataArr[classArr == 0]data1 = dataArr[classArr == 1]p0 = data0.size / float(n)p1 = data1.size / float(n)# 约定:p=0, p*log_2(p) = 0if p0 == 0:ent = -(p1 * np.log(p1))elif p1 == 0:ent = -(p0 * np.log(p0))else:ent = -(p0 * np.log2(p0) + p1 * np.log2(p1))return ent# # test calEntropy()
# dataSet, _ = getDataSet()
# print(calEntropy(dataSet[:, :-1], dataSet[:, -1]))def splitDataSet(dataSet, ax, value):"""按照给点的属性ax和其中一种取值value来划分数据。当属性类型为标称数据时,返回一个属性值都为value的数据集。当属性类型为数值型数据事,以与value的大小关系为基准返回两个数据集。input:dataSet: 输入数据集,形状为(m,n)表示m个数据,前n-1列个属性,最后一列为类型。ax:属性类型value: 标称型时为1、2、3等。数值型为形如0.123的数。return:1.标称型dataSet返回第ax个属性中值为value组成的集合2.数值型dataSet返回两个集合。其一中数据都小于等于value,另一都大于。"""# 2个连续属性密度、含糖量+类型为后3列,其余为标称型if ax < dataSet.shape[1] - 3:dataS = np.delete(dataSet[dataSet[:, ax] == value], ax, axis=1)return dataSelse:dataL = dataSet[dataSet[:, ax] <= value]dataR = dataSet[dataSet[:, ax] > value]return dataL, dataR# # test splitDataSet()
# dataSet, _ = getDataSet()
# test1 = splitDataSet(dataSet, 3, 1)
# test2L, test2R = splitDataSet(dataSet, 6, 0.5)
# print("test1 = ", test1)
# print("test2L = ", test2L)
# print("test2R = ", test2R)def calInfoGain(dataSet, labelList, ax, value=-1):"""计算给定数据dataSet在属性ax上的香农熵增益。input:dataSet:输入数据集,形状为(m,n)表示m个数据,前n-1列个属性,最后一列为类型。labelList:属性列表,如['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖量']ax: 选择用来计算信息增益的属性。0表示第一个属性,1表示第二个属性等。前六个特征是标称型,后两个特征是数值型。value: 用来划分数据的值。当标称型时默认为-1, 即不使用这个参数。return:gain:信息增益"""baseEnt = calEntropy(dataSet[:, :-1], dataSet[:, -1])  # 计算D的原始信息熵newEnt = 0.0  # 划分完数据后的香农熵if ax < dataSet.shape[1] - 3:  # 计算标称型的香农熵num = len(featureDic[labelList[ax]])   # 每一个特征的类别数for j in range(num):subDataSet = splitDataSet(dataSet, ax, j+1)prob = len(subDataSet) / float(len(dataSet))if prob != 0:newEnt += prob * calEntropy(subDataSet[:, :-1], subDataSet[:, -1])else:# 数据集划分为两份dataL, dataR = splitDataSet(dataSet, ax, value)# 计算两数据集的信息熵entL = calEntropy(dataL[:, :-1], dataL[:, -1])entR = calEntropy(dataR[:, :-1], dataR[:, -1])# 计算划分完总数据集的信息熵newEnt = (dataL.size * entL + dataR.size * entR) / float(dataSet.size)# 计算信息增益gain = baseEnt - newEntreturn gain# # test calInfoGain(dataSet, featureDic, axis, value=-1):
# data, feat = getDataSet()
# print(calInfoGain(data, feat, 2))def chooseBestSplit(dataSet, labelList):"""计算信息增益增大的划分数据集的方式. 当返回的不是数值型特征时, 划分值bestThresh = -1input:dataSetlabelListreturn:bestFeature: 使得到最大增益划分的属性。bestThresh: 使得到最大增益划分的数值。标称型时无意义令其为-1。maxGain:    最大增益划分时的增益值。"""maxGain = 0.0bestFeature = -1bestThresh = -1m, n = dataSet.shape# 对每一个特征for i in range(n - 1):if i < (n - 3):     # 标称型gain = calInfoGain(dataSet, labelList, i)if gain > maxGain:bestFeature = imaxGain = gainelse:   # 数值型featVals = dataSet[:, i]  # 得到第i个特征的所有值sortedFeat = np.sort(featVals)  # 按照从小到大的顺序排列第i个特征的所有值T = []# 计算划分点for j in range(m - 1):t = (sortedFeat[j] + sortedFeat[j + 1]) / 2.0T.append(t)# 对每一个划分值,计算增益熵for t in T:gain = calInfoGain(dataSet, featureDic, i, t)if gain > maxGain:bestFeature = ibestThresh = tmaxGain = gainreturn bestFeature, bestThresh, maxGain# # test chooseBestSplit
# data, feat = getDataSet()
# f, tv, g = chooseBestSplit(data, feat)
# print(f"best feature is {list(featureDic.keys())[f]}\n"
#       f"best thresh value is {tv}\n"
#       f"max information gain is {g}")def majorityCnt(classList):"""投票,0多返回"坏瓜",否则返回"坏瓜"。"""cnt0 = len(classList[classList == 0])cnt1 = len(classList[classList == 1])if cnt0 > cnt1:return '坏瓜'else:return '好瓜'def createTree(dataSet, labels):"""通过信息增益递归创造一颗决策树。input:labelsdataSetreturn:myTree: 返回一个存有树的字典"""classList = dataSet[:, -1]# 如果剩余的类别全相同,则返回if len(classList[classList == classList[0]]) == len(classList):if classList[0] == 0:return '坏瓜'else:return '好瓜'# 如果只剩下类标签,投票返回if len(dataSet[0]) == 1:return majorityCnt(classList)# 得到增益最大划分的属性、值bestFeat, bestVal, entGain = chooseBestSplit(dataSet, labels)bestFeatLabel = labels[bestFeat]if bestVal != -1:  # 如果是数值型txt = bestFeatLabel + "<=" + str(bestVal) + "?"else:   # 如果是标称型txt = bestFeatLabel + "=" + "?"myTree = {txt: {}}  # 创建字典,即树的节点。if bestVal != -1:   # 数值型的话就是左右两个子树。subDataL, subDataR = splitDataSet(dataSet, bestFeat, bestVal)myTree[txt]['是'] = createTree(subDataL, labels)myTree[txt]['否'] = createTree(subDataR, labels)else:i = 0# 生成子树的时候要将已遍历的属性删去。数值型不要删除。del (labels[bestFeat])uniqueVals = featureDic[bestFeatLabel]  # 最好的特征的类别列表for value in uniqueVals:    # 标称型的属性值有几种,就要几个子树。# Python中列表作为参数类型时,是按照引用传递的,要保证同一节点的子节点能有相同的参数。subLabels = labels[:]  # subLabels = 注意要用[:],不然还是引用i += 1subDataSet = splitDataSet(dataSet, bestFeat, i)myTree[txt][value] = createTree(subDataSet, subLabels)return myTree# # test createTree()
# data, feat = getDataSet()
# Tree = createTree(data, feat)
# print(Tree)# ***********************画图***********************
# **********************start***********************
# 详情参见机器学习实战决策树那一章# 定义文本框和箭头格式
decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 没有这句话汉字都是口口
# mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题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, fontsize=20)def 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,fontsize=20)def getNumLeafs(myTree):  # 获取叶节点的数目numLeafs = 0firstStr = list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':numLeafs += getNumLeafs(secondDict[key])else:numLeafs += 1return numLeafsdef getTreeDepth(myTree):  # 获取树的层数maxDepth = 0firstStr = list(myTree.keys())[0]secondDict = myTree[firstStr]for key in secondDict.keys():if type(secondDict[key]).__name__ == 'dict':thisDepth = 1 + getTreeDepth(secondDict[key])else:thisDepth = 1if thisDepth > maxDepth: maxDepth = thisDepthreturn maxDepthdef plotTree(myTree, parentPt, nodeTxt):numLeafs = getNumLeafs(myTree)getTreeDepth(myTree)firstStr = list(myTree.keys())[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, figsize=(600, 30), facecolor='white')fig.clf()axprops = dict(xticks=[], yticks=[])createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)plotTree.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()# ***********************画图***********************
# ***********************end************************def main():dataSet, labelList = getDataSet()myTree = createTree(dataSet, labelList)createPlot(myTree)if __name__ == '__main__':main()

画图

补充

一开始做错了,用的只有密度和含糖率的那个数据,定义了个二叉树节点的类,结果改了半天机器学习实战那个画树的代码,美滋滋完发现不是那回事。。。节点并不是两个,就当写成CART了吧。又改成了用字典保存树的代码,之前写的就也保存一下。

代码

import numpy as np
import matplotlib.pyplot as plt
from pylab import *# define tree node
class TreeNode:def __init__(self, feature, thresh):self.feature = feature  # 特征:密度 or 含糖率self.thresh = thresh  # 基于某个特征分类时的划分值self.label = -1  # 类别:只在叶子节点上不为-1,为0或1代表好瓜的否和是。self.data = []  # 用来保存该节点上的数据self.left = None  # 左右结点self.right = Nonedef numOfGood(self):return self.data[self.data == 1].sum()def numOfBad(self):return self.data[self.data == 0].sum()def getDataSet():"""get watermelon data set 3.0 alpha.:return: (feature array, label array)"""dataSet = np.array([[0.697, 0.460, 1],[0.774, 0.376, 1],[0.634, 0.264, 1],[0.608, 0.318, 1],[0.556, 0.215, 1],[0.403, 0.237, 1],[0.481, 0.149, 1],[0.437, 0.211, 1],[0.666, 0.091, 0],[0.243, 0.267, 0],[0.245, 0.057, 0],[0.343, 0.099, 0],[0.639, 0.161, 0],[0.657, 0.198, 0],[0.360, 0.370, 0],[0.593, 0.042, 0],[0.719, 0.103, 0]])return dataSetdef calEntropy(dataArr, labelArr):"""calculate information entropy.:param dataArr::return: entropy"""n = dataArr.sizedata0 = dataArr[labelArr == 0]data1 = dataArr[labelArr == 1]p0 = data0.size / float(n)p1 = data1.size / float(n)# 约定:p=0, p*log_2(p) = 0if p0 == 0:entropy = -(p1 * np.log(p1))elif p1 == 0:entropy = -(p0 * np.log(p0))else:entropy = -(p0 * np.log(p0) + p1 * np.log(p1))return entropy# # test calEntropy()
# dataSet = getDataSet()
# print(calEntropy(dataSet[:, :-1], dataSet[:, -1],))def calInfoGain(dataSet, feature, thresh):"""calculate information gain:param dataSet: 数据集,最后一列为类别。:param feature: 选择用来计算信息增益的特征。0表示第一个特征,1表示第二个特征:param thresh: 用来划分数据的值:return: 信息增益"""entD = calEntropy(dataSet[:, :-1], dataSet[:, -1])  # 计算D的原始信息熵# 数据集划分为两份dataL = dataSet[dataSet[:, feature] <= thresh]dataR = dataSet[dataSet[:, feature] > thresh]# 计算两数据集的信息熵entL = calEntropy(dataL[:, :-1], dataL[:, -1])entR = calEntropy(dataR[:, :-1], dataR[:, -1])# 计算划分完总数据集的信息熵entDS = (dataL.size * entL + dataR.size * entR) / float(dataSet.size)# 计算信息增益gain = entD - entDSreturn gain# # test calInfoGain(dataSet, feature, thresh)
# data = getDataSet()
# print(calInfoGain(data, 0, 0.6))def chooseBestSplit(dataSet):"""计算信息增益增大的划分数据集的方式:param dataSet::return: 信息增益最大的划分方式的 特征 和 划分值。"""maxGain = 0.0bestFeature = -1bestThresh = -1m, n = dataSet.shape# 对每一个特征for i in range(n - 1):feat = dataSet[:, i]  # 得到第i个特征的所有值sortedFeat = np.sort(feat)  # 按照从小到大的顺序排列第i个特征的所有值T = []# 计算划分点for j in range(m - 1):t = (sortedFeat[j] + sortedFeat[j + 1]) / 2.0T.append(t)# 对每一个划分值,计算增益熵for val in T:gain = calInfoGain(dataSet, i, val)if gain > maxGain:bestFeature = ibestThresh = valmaxGain = gainreturn bestFeature, bestThresh, maxGain# # test chooseBestSplit
# data = getDataSet()
# f, tv, g = chooseBestSplit(data)
# print(f"best feature is {f}\n"
#       f"best thresh value is {tv}\n"
#       f"max information gain is {g}")def createTree(dataSet):"""通过信息增益创造一颗决策树:param dataSet::return: 返回一颗树的根结点"""# 到叶子节点时返回。# 若只剩k个相同类的数据,信息熵 = -(0*log_2(0) + k*log_2(k) = 0# 即信息熵为0时返回叶子结点if calEntropy(dataSet[:, :-1], dataSet[:, -1]) == 0:leaf = TreeNode(-1, -1)  # 构造叶子结点leaf.label = dataSet[0][-1]return leaffeature, thresh, gain = chooseBestSplit(dataSet)dataL = dataSet[dataSet[:, feature] <= thresh]dataR = dataSet[dataSet[:, feature] > thresh]Node = TreeNode(feature, thresh)Node.data = dataSetNode.left = createTree(dataL)Node.right = createTree(dataR)return Node# # test createTree()
# data = getDataSet()
# Tree = createTree(data)# ***********************画图***********************
# **********************start***********************
def getNumLeafs(myTree):"""得到叶子结点的数量:param myTree::return:"""if myTree.feature == -1:return 1if myTree is None:return 0return getNumLeafs(myTree.left) + getNumLeafs(myTree.right)# # test getNumLeafs()
# data = getDataSet()
# Tree = createTree(data)
# print(getNumLeafs(Tree))  # 5个叶子def getTreeDepth(myTree):"""得到树的深度:param myTree::return:"""if myTree is None:return 0# 1表示加上当前节点depth = max(1 + getTreeDepth(myTree.left),1 + getTreeDepth(myTree.right))return depth# # test getTreeDepth()
# data = getDataSet()
# Tree = createTree(data)
# print(getTreeDepth(Tree))  # 深度为5# 没有这句的话画出的图上面汉字会显示成口口
mpl.rcParams['font.sans-serif'] = ['SimHei']decisionNode = dict(boxstyle="sawtooth", fc="0.8")
leafNode = dict(boxstyle="round4", fc="0.8")
arrow_args = dict(arrowstyle="<-")fList = ["密度", "含糖率"]  # 后面画节点时用到
melon = ["坏瓜", "好瓜"]def plotNode(nodeTxt, centerPt, parentPt, nodeType):"""绘制一个结点以及指向这个减点的箭头:param nodeTxt: 结点上的文字:param centerPt: 箭头终止坐标:param parentPt: 箭头起始坐标,即对应树中父结点坐标。即从parentPt指向centerPt:param nodeType: 结点类型。实际上是一个字典,里面保存着绘制结点的参数,decisionNode:表示非叶子结点。leafNode表示叶子结点、:return:"""createPlot.ax1.annotate(nodeTxt, xy=parentPt,xycoords='axes fraction',xytext=centerPt,textcoords='axes fraction',va="center", ha="center",bbox=nodeType,arrowprops=arrow_args,fontsize=15)  # 结点字的大小# def createPlot():
#     fig = plt.figure(1, facecolor='white')
#     fig.clf()
#     createPlot.ax1 = plt.subplot(111, frameon=False)
#     plotNode('决策节点', (0.5, 0.1), (0.1, 0.5), decisionNode)
#     plotNode('叶节点', (0.8, 0.1), (0.3, 0.8), leafNode)
#     plt.show()# createPlot()def plotMidText(cntrPt, parentPt, txtString):"""计算父节点和子节点中间的位置,即箭头中间的位置上画上文本,比如"是"和"否":param cntrPt: 子节点的坐标:param parentPt:父节点的坐标:param txtString: 要画的字符:return:"""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,fontsize=15)def plotTree(myTree, parentPt, nodeTxt):  # if the first key tells you what feat was split on"""递归画树:param myTree: 树节点:param parentPt: 父节点坐标:param nodeTxt: 节点字符:return:"""numLeafs = getNumLeafs(myTree)  # this determines the x width of this treedepth = getTreeDepth(myTree)cntrPt = (plotTree.xOff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalW, plotTree.yOff)if myTree.thresh != -1:plotMidText(cntrPt, parentPt, nodeTxt)plotNode(str(fList[myTree.feature])  # fList = ["密度", "含糖率"]+ "<=" + str(myTree.thresh) + "?",cntrPt, parentPt, decisionNode)plotTree.yOff = plotTree.yOff - 1 / plotTree.totalDelse:plotTree.xOff = plotTree.xOff + 1 / plotTree.totalWplotMidText(cntrPt, parentPt, nodeTxt)plotNode(melon[int(myTree.label)], cntrPt, parentPt, decisionNode)  # melon = ["坏瓜", "好瓜"]plotTree.yOff = plotTree.yOff - 1 / plotTree.totalDif myTree.left is not None:plotTree(myTree.left, cntrPt, "是")if myTree.right is not None:plotTree(myTree.right, cntrPt, "否")plotTree.yOff = plotTree.yOff + 1 / plotTree.totalDdef createPlot(inTree):"""设置画图的基本信息,如树的宽度和深度,初始坐标等。调用plotTree()画图:param inTree::return:"""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()# ***********************画图***********************
# ***********************end************************def main():data = getDataSet()Tree = createTree(data)createPlot(Tree)if __name__ == '__main__':main()

画图

西瓜书习题4.3(基于信息熵的决策树)相关推荐

  1. 西瓜书习题3.4 (交叉验证法)

    西瓜书习题3.4 (交叉验证法): ​ 选择两个UCI数据集,比较10折交叉验证法和留一法所估计出的对率回归的错误率. 1.数据集长啥样? ​ 于是就下载了一组UCI数据集,它长这样: 至于这些数据是 ...

  2. 西瓜书习题 - 3.线性模型

    1.线性回归 1.以下哪个不是线性模型的优势? 简单 复杂 基本 可理解性好 2.示例的属性可以属于下列哪个类别? 无序的离散属性 连续属性 有序的离散属性 以上都对 3.一卖伞商家想利用天气来预测销 ...

  3. 西瓜书习题详解 机器学习能在互联网搜索的哪些环节起什么作用?

    看完了西瓜书的第一章,课后习题有这个问题.我先将这个问题定义为:机器学习在搜索引擎上的应用. 维基百科:搜索引擎(英语:Search Engine)是一种信息检索系统,旨在协助搜索存储在计算机系统中的 ...

  4. [西瓜书习题] 第二章 模型评估与选择

    2.1 数据集包含1000个样本,其中500个正例,500个反例,将其划分为包含70%样本的训练集和30%样本的测试集用于留出法评估,试估算共有多少种划分方式. 留出法将数据集划分为两个互斥的集合,为 ...

  5. 西瓜书习题 - 10.机器学习初步考试

    1.当学习器在训练集上把训练样本自身的一些特征当作了所有潜在样本都具有的一般性质时,泛化性能可能会因此下降,这种现象一般称为 ____.(过拟合/欠拟合) 过拟合 2.对于两个样本点 (0,0),(1 ...

  6. 西瓜书习题 - 8.集成学习

    1.集成学习 1.下列关于集成学习描述错误的是哪个? 集成学习只能使用若干个相同类型的学习器 集成学习使用多个学习器解决问题 集成学习在许多比赛中取得了优异的成绩 集成学习在英文中是一个外来词 2.下 ...

  7. 西瓜书习题 - 6.支持向量机

    1.支持向量机基本型 1.对于线性可分的二分类任务样本集,将训练样本分开的超平面有很多,支持向量机试图寻找满足什么条件的超平面? 在正负类样本"正中间"的 靠近正类样本的 靠近负类 ...

  8. 西瓜书课后题4.7(队列控制决策树深度)

    文章目录 题目 思考 主要代码 节点类 生成树 测试 图像与精度 maxSize >= 2 maxSize = 1 完整代码 题目 图4.2是一个递归算法,若面临巨量数据, 则决策树的层数会很深 ...

  9. 《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

    <机器学习>西瓜书课后习题4.3--python实现基于信息熵划分的决策树算法 <机器学习>西瓜书P93 4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数 ...

最新文章

  1. 压缩版styleGAN
  2. 在matlab中将处理结果输出为shp文件
  3. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
  4. 【Shell教程】三----运算符,条件判断
  5. Lync Server 2013 标准版部署(十)边缘服务器部署[三]
  6. 实践出真知:微服务经验之避坑指南
  7. tc自动服务器,使用linux下的TC进行服务器流量控制
  8. 12个超炫数据可视化工具_Python奇淫技巧,5个炫酷的数据可视化工具
  9. 全新UI四方聚合支付系统源码/新增USDT提现/最新更新安全升级修复XSS漏洞补单漏洞
  10. C++ SHFileOperation实现文件、文件夹拷贝、删除、重命名
  11. c最简单的编程语言,世界上最简单的中文编程语言
  12. python合并视频和音频_Python批量合并处理B站视频
  13. 关于win10访问u盘被拒绝,显示没有权限访问问题的解决方案
  14. 抑郁症自测量表测试软件,抑郁自评:医用抑郁自测量表,快来测一测你的抑郁指数是多少...
  15. 30 年的 Hello world
  16. 母牛python_《Python》 母牛的故事Hello, world用筛法求之N内的素数
  17. 蚂蚁金服面试题及答案-总结
  18. kali虚拟机root密码错误
  19. 2021-6-28 项目实训-研究生管理系统
  20. 适老化专栏(二)| 互联网世界中的老年人

热门文章

  1. APP UI 自动化测试 H5页面元素定位
  2. CC2642研究之控制SPI Nand FLASH和EEPROM
  3. close_wait状态和time_wait状态
  4. 初识cocos creator,做一款H5小游戏
  5. 关于SQL中的DATEDIFF函数
  6. BIMer们请注意:在建模时千万别让问题分析占用太多时间
  7. Rational Rose2017 创建对象图
  8. 安卓 marginBottom失效
  9. Qt炫酷图片预览(非QML)
  10. mac-m1安装jmeter详细步骤