数据挖掘与分析:完成决策树指标计算,读取数据集,分别计算每一列的信息增益、信息增益比以及gini不纯度

本文介绍了如何使用Python和scikit-learn库计算信息增益、信息增益比和Gini不纯度,用于决策树算法中的特征选择,包括数据读取、编码问题处理以及相关统计量的计算方法。
摘要由CSDN通过智能技术生成

      为了完成如题所述要求,我们需要编写一些代码来加载数据,然后实现计算信息增益、信息增益比和Gini不纯度的函数。而计算这些指标通常涉及决策树算法的内部逻辑,scikit-learn库提供了决策树实现,但并未直接提供计算这些指标的函数。因此,我们需要自己编写这些计算逻辑。

信息增益: 

Gini(A,F^{(j)}=f)=H(A)-H(A,F^{(j)}=f)=H(A)-(\frac{|A_{1}|}{|A|})H(A_{1})+\frac{|A_{2}|}{|A|}H(A_{2})) 

Gini系数:

具体代码如下:

 #确保已经安装必要的库

pip install pandas scikit-learn

#读取数据集
       将数据文件上传至Jupyter服务器的正确目录,使用pandas库的read_csv函数或其他适当的函数读取数据集,其中“tree_data.csv”为数据名。

import pandas as pd
data = pd.read_csv('tree_data.csv',encoding ='GB2312')
print(data)

 

      如出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte报错时,意味着文件编码出错,可以使用python库检测正确的文件编码:

import chardet  
with open('tree_data.csv', 'rb') as f:  
    result = chardet.detect(f.read())  
encoding = result['encoding']  
print(f'Detected encoding: {encoding}')  

 

#导入pandas库,将其重命名为pd

#从sklearn.tree模块中导入DecisionTreeClassifier类

#从sklearn.metrics模块中导入classification_report函数

#从math模块中导入log2函数 

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from math import log2
import numpy as np
X = data.drop('玩耍(目标值)', axis=1)  # 特征列  
y = data['玩耍(目标值)']  # 目标列

#初始化信息增益和信息增益比的字典

info_gain = {}
info_gain_ratio = {}

#计算数据集的信息熵和条件熵 

#计算数据集的信息熵
def entropy(y):
    hist = y.value_counts()
    ps = hist / len(y)
    return -sum([p * log2(p) for p in ps if p > 0])

# 计算条件熵  
def conditional_entropy(X, y, feature):
    values = X[feature].unique()
    weighted_entropy = sum((X[feature] == val).mean() * entropy(y[X[feature] == val]) for val in values)
    return weighted_entropy

#计算信息增益  

def information_gain(X, y, feature):
    orig_entropy = entropy(y)
    cond_entropy = conditional_entropy(X, y, feature)
    return orig_entropy - cond_entropy

#计算分裂信息  

def split_information(X, feature):
    values = X[feature].unique()
    probs = [(X[feature] == val).mean() for val in values]
    return -sum(p * log2(p) for p in probs if p > 0)

#计算信息增益比  

def information_gain_ratio(X, y, feature):
    gain = information_gain(X, y, feature)
    split_info = split_information(X, feature)
    return gain / split_info

#计算Gini不纯度  

def gini_impurity(y):
    hist = y.value_counts()
    total = len(y)
    ps = hist / total
    return 1 - sum(p**2 for p in ps)

#计算每个特征的信息增益、信息增益比和基尼不纯度  

features = X.columns
info_gains = {feature: information_gain(X, y, feature) for feature in features}
info_gain_ratios = {feature: information_gain_ratio(X, y, feature) for feature in features}
gini_impurities = {feature: gini_impurity(y[X[feature] == val]) for feature in features for val in X[feature].unique()}

#打印结果  

print("信息增益:", info_gains)
print("信息增益比:", info_gain_ratios)
print("基尼不纯度:", gini_impurities)

       上述代码片段中计算Gini不纯度是针对整个数据集而并非单个特征的每个值,如果要为每个特征的每个唯一值计算Gini不纯度,需要修改上面的gini_impurities字典推导式。通常Gini不纯度是在构建决策树时在节点分裂时针对当前节点样本进行计算。另外,由于数据集的不确定性,代码需要随时根据具体情况进行调整。例如数据集包含非数值型特征时,需要在进行计算之前对特征进行编码。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值