机器学习——决策树

西瓜书决策树
了解决策树算法后,巩固和理解算法,编程实现信息熵。一开始打算直接用pandas读取的数据进行计算。但是计算信息增益的时候发现数据选取太麻烦,所以还是需要参考将DataFrame转为向量形式。

#决策树

#计算根结点信息熵
dataset=pd.read_excel("watermelon.xlsx")
label=dataset["好瓜"].value_counts()
Ent=0
for target in label.index:
    Ent+=-(label[target]/label.sum())*log(label[target]/label.sum(),2)
Ent
#0.9975025463691153
#与西瓜书上计算一致

#计算色泽信息增益但数据选取太麻烦
label_1=dataset["色泽"].value_counts()
label_1
dataset[(dataset["色泽"]=="青绿") & (dataset["好瓜"]=="是")]["色泽"].count()
dataset[(dataset["色泽"]=="青绿") & (dataset["好瓜"]=="是")]["色泽"].count()/ dataset[(dataset["色泽"]=="青绿")]["色泽"].count()
dataset=dataset.iloc[:,[1,2,3,4,5,6,9]]
dataset

在这里插入图片描述

dataset["色泽"]=dataset["色泽"].map({"青绿":0,"乌黑":1,"浅白":2})
dataset["根蒂"]=dataset["根蒂"].map({"蜷缩":0,"稍蜷":1,"硬挺":2})
dataset["敲声"]=dataset["敲声"].map({"浊响":0,"沉闷":1,"清脆":2})
dataset["纹理"]=dataset["纹理"].map({"清晰":0,"稍糊":1,"模糊":2})
dataset["脐部"]=dataset["脐部"].map({"凹陷":0,"稍凹":1,"平坦":2})
dataset["触感"]=dataset["触感"].map({"硬滑":0,"软粘":1})
dataset["好瓜"]=dataset["好瓜"].map({"是":1,"否":0})
np.array(dataset)

"""
array([[0, 0, 0, 0, 0, 0, 1],
       [1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 0, 0, 0, 1],
       [2, 0, 0, 0, 0, 0, 1],
       [0, 1, 0, 0, 1, 1, 1],
       [1, 1, 0, 1, 1, 1, 1],
       [1, 1, 0, 0, 1, 0, 1],
       [1, 1, 1, 1, 1, 0, 0],
       [0, 2, 2, 0, 2, 1, 0],
       [2, 2, 2, 2, 2, 0, 0],
       [2, 0, 0, 2, 2, 1, 0],
       [0, 1, 0, 1, 0, 0, 0],
       [2, 1, 1, 1, 0, 0, 0],
       [1, 1, 0, 0, 1, 1, 0],
       [2, 0, 0, 2, 2, 0, 0],
       [0, 0, 1, 1, 1, 0, 0]], dtype=int64)
"""
#或者直接转化为array
dataset=np.array(dataset)
dataset

"""
array([['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
       ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
       ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
       ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '是'],
       ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '是'],
       ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '是'],
       ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '是'],
       ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '是'],
       ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '否'],
       ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '否'],
       ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '否'],
       ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '否'],
       ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '否'],
       ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '否'],
       ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '否'],
       ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '否'],
       ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '否']], dtype=object)


"""



#计算数据集的信息熵
def Entropy(dataset):
	#计算好瓜坏瓜比例
    row_num=len(dataset)
    label_count={}
    for label in dataset[:,-1]:
        label_count[label]=label_count.get(label,0)+1
    #计算信息熵
    Entropy=0
    for key in label_count:
        p=label_count[key]/row_num
        Entropy -=p * log(p, 2) 
    return Entropy

#获取各个属性的小数据集
def get_data(dataset,feature_num,feature_value):
    bool_ls=[]
    for feature in dataset:
        bool_ls.append(feature[feature_num]==feature_value)
    data=dataset[bool_ls]
    return data
    
feature_dic={0:"色泽",1:"根蒂",2:"敲声",3:"纹理",4:"脐部",5:"触感"}


for feature_num in range(dataset.shape[1]-1):
	#获取属性的集合
    feature_set=set(dataSet[:,feature_num])
    data_entropy=0
    #计算信息增益
    for feature_value in feature_set:
        data=get_data(dataset,feature_num,feature_value)
        data_entropy+=(len(data)/len(dataSet))*(Entropy(data))
    data_entropy=Entropy(dataset)-data_entropy
    print("{}的信息增益为{:.3f}".format(feature_dic[feature_num],data_entropy))

在这里插入图片描述

和西瓜书上的计算值一样。后续可以完善实现决策树算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
决策树算法是一种广泛应用于分类和回归的机器学习算法,它基于树形结构对样本进行分类或预测。决策树算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策树中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策树算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策树生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策树。 3. 剪枝:通过剪枝操作来提高决策树的泛化性能。 决策树算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策树算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策树算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策树算法对这些数据进行训练,并生成一个决策树模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策树模型预测该人的收入水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值