机器学习算法原理实现——决策树里根据信息增益选择特征
  ppqNYv0Uugli 2023年11月02日 74 0

先说熵的定义:

机器学习算法原理实现——决策树里根据信息增益选择特征_数据集

 

机器学习算法原理实现——决策树里根据信息增益选择特征_信息增益_02

 

再看信息增益

信息增益是一种用于特征选择的指标,用于衡量特征对于数据集分类的贡献程度。它基于信息熵的概念,通过比较特征划分前后的信息熵差异来评估特征的重要性。信息熵是衡量数据集纯度的指标,表示数据集中的不确定性或混乱程度。信息熵越高,数据集的不确定性越大。

机器学习算法原理实现——决策树里根据信息增益选择特征_机器学习_03

 

机器学习算法原理实现——决策树里根据信息增益选择特征_High_04

 

机器学习算法原理实现——决策树里根据信息增益选择特征_信息增益_05

 上述例子计算错误,gpt识数出错,更正后的:

机器学习算法原理实现——决策树里根据信息增益选择特征_机器学习_06

 

 

好了给出计算信息增益选择特征的python代码:

# 导入numpy库
from collections import Counter
import numpy as np
# 导入对数计算模块log
from math import log


# 定义信息熵计算函数
def entropy(ele):
    '''
    输入:
    ele:包含类别取值的列表
    输出:信息熵值
    '''
    # 计算列表中取值的概率分布
    counter = Counter(ele)
    probs = [counter[i]/len(ele) for i in counter.keys()]
    # 计算信息熵
    entropy = -sum([prob*log(prob, 2) for prob in probs])
    return entropy


# 定义基尼指数计算函数
def gini(nums):
    '''
    输入:
    nums:包含类别取值的列表
    输出:基尼指数值
    '''
    # 获取列表类别的概率分布
    probs = [nums.count(i)/len(nums) for i in set(nums)]
    # 计算基尼指数
    gini = sum([p*(1-p) for p in probs])
    return gini


def information_gain(data, labels, feature):
    # 计算数据集的经验熵
    total_entropy = entropy(labels)
    
    # 根据特征划分数据集
    feature_values = np.unique(data[:, feature])
    subsets = [data[data[:, feature] == value] for value in feature_values]
    
    """
    # 计算天气特征的经验条件熵
# 其中subset1~subset3为根据天气特征三个取值划分之后的子集
# entropy_DA = len(subset1)/len(df)*entropy(subset1['play'].tolist()) + \
            #  len(subset2)/len(df)*entropy(subset2['play'].tolist()) + \
            #  len(subset3)/len(df)*entropy(subset3['play'].tolist())
    """
    # 计算特征的经验条件熵
    conditional_entropy = 0
    for subset in subsets:
        subset_labels = subset[:, -1]
        subset_entropy = entropy(subset_labels)
        subset_weight = len(subset_labels) / len(labels)
        conditional_entropy += subset_weight * subset_entropy
    
    # 计算信息增益
    information_gain = total_entropy - conditional_entropy
    return information_gain

# 示例数据
data = np.array([[1, 'Sunny', 'Hot', 'High', 'Weak', 'No'],
                 [2, 'Sunny', 'Hot', 'High', 'Strong', 'No'],
                 [3, 'Overcast', 'Hot', 'High', 'Weak', 'Yes'],
                 [4, 'Rain', 'Mild', 'High', 'Weak', 'Yes'],
                 [5, 'Rain', 'Cool', 'Normal', 'Weak', 'Yes'],
                 [6, 'Rain', 'Cool', 'Normal', 'Strong', 'No'],
                 [7, 'Overcast', 'Cool', 'Normal', 'Strong', 'Yes'],
                 [8, 'Sunny', 'Mild', 'High', 'Weak', 'No'],
                 [9, 'Sunny', 'Cool', 'Normal', 'Weak', 'Yes'],
                 [10, 'Rain', 'Mild', 'Normal', 'Weak', 'Yes'],
                 [11, 'Sunny', 'Mild', 'Normal', 'Strong', 'Yes'],
                 [12, 'Overcast', 'Mild', 'High', 'Strong', 'Yes'],
                 [13, 'Overcast', 'Hot', 'Normal', 'Weak', 'Yes'],
                 [14, 'Rain', 'Mild', 'High', 'Strong', 'No']])
labels = data[:, -1]

# 计算天气特征的信息增益
feature_index = 1
info_gain = information_gain(data, labels, feature_index)
print("天气特征对于数据集分类的信息增益为:", info_gain)

  

gpt给的代码:

def entropy(data):
    _, counts = np.unique(data, return_counts=True)
    probabilities = counts / counts.sum()
    ent = -np.sum(probabilities * np.log2(probabilities))
    return ent

original_entropy = entropy(students[:, -1])
def conditional_entropy(data, column_idx):
    unique_values, counts = np.unique(data[:, column_idx], return_counts=True)
    weighted_entropy = 0

    for value, count in zip(unique_values, counts):
        subset = data[data[:, column_idx] == value]
        weighted_entropy += count / data.shape[0] * entropy(subset[:, -1])

    return weighted_entropy

def info_gain(data, column_idx):
    return original_entropy - conditional_entropy(data, column_idx)

gain_for_glasses = info_gain(students, 0)
print("信息增益(眼镜特征):", gain_for_glasses)

  

输出:

天气特征对于数据集分类的信息增益为: 0.2467498197744391

眼镜对于数据集分类的信息增益为: 0.6099865470109874

信息增益(眼镜特征): 0.6099865470109874

 

 

来做一个公司的算法题目:

Python编程实现统计机器学习决策树算法之增益计算

决策树是一种经典的分类与回归方法。决策树学习主要包括三个步骤:特征选择、决策树生成和决策树剪枝。在ID3决策树生成算法中,通过计算包含最高信息增益的属性作为划分标准。

现在需要通过ID3决策树算法,判断客户是否优质,假设数据集有5个特征,分别为:是否有房,是否有贷款,是否有稳定工作,是否结婚,是否高收入人群,请根据上述信息计算出增益最大的特征,返回其特征索引及对应的信息增益。

解答要求
时间限制: C/C++ 1000ms, 其他语言:2000ms

内存限制: C/C++ 256MB, 其他语言:512MB

输入
第一行,输入一个正整数n,表示样本条数,n < 10000。
接下来输入n行整数数组,一个数组表示样本的5个特征及标签,数组最后一个整数表示样本标签,特征及标签值均用0/1表示。

输出
根据给定训练集,计算得到信息增益最大的特征索引及对应的信息增益。
特征索引从0开始,信息增益四舍五入保留2位小数。

样例1
复制输入:
6
1 1 0 1 1 0
1 0 0 1 1 1
0 1 0 0 1 1
0 1 0 1 0 0
0 1 0 0 0 0
0 0 0 1 0 0
复制输出:
4 0.46
解释:
5个特征信息增益依次为[0.04, 0.04, 0.0, 0.04, 0.46],故第5个特征划分时信息增益最大,返回特征索引4。

样例2
复制输入:
4
1 1 0 1 0 1
0 1 0 1 1 0
0 1 0 0 0 0
0 0 0 1 0 0
复制输出:
0 0.81
解释:
5个特征信息增益依次为[0.81, 0.12, 0.0, 0.12, 0.12],故第1个特征划分时信息增益最大,返回特征索引0。

 

代码如下:

 

import numpy as np

def entropy(labels):
    val_set, counts = np.unique(labels, return_counts=True)
    prob = counts / np.sum(counts)
    return -np.sum(prob * np.log2(prob))

def conditional_entropy(data, col_idx):
    val_set = np.unique(data[:, col_idx])
    ent = 0
    for val in val_set:
        subset = data[data[:, col_idx] == val]
        subset_labels = subset[:, -1]
        subset_entropy = entropy(subset_labels)
        subset_weight = len(subset_labels) / len(data.shape)
        ent += subset_weight * subset_entropy
    return ent

# 主程序
n = int(input().strip())
data = [list(map(int, input().strip().split())) for _ in range(n)]
data = np.array(data)
feature_cnt = data.shape[1] - 1
max_gain = float('-inf')
feature_choice = -1

ent1 = entropy(data[:, -1])
for i in range(feature_cnt):
    ent2 = conditional_entropy(data, i)
    gain_ent = round(ent1 - ent2, 2)
    if gain_ent > max_gain:
        max_gain = gain_ent
        feature_choice = i

print(max_gain, feature_choice)

  



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
ppqNYv0Uugli