使用Python实现实验名称:决策树算法 主要内容:设计算法实现熵、经验条件熵、信息增益等方法。实现ID3算法。熟悉sklearn库中的决策树算法; 建立对模型评价、画出决策树、混淆矩阵、ROC曲线、对属性的重要性排序。 实验数据乳腺癌数据集
时间: 2023-06-19 08:09:08 浏览: 135
好的,以下是一个简单的代码示例,可以实现熵、经验条件熵、信息增益等方法,以及使用ID3算法构建决策树。
首先,我们需要导入需要的库和数据集。这里我们使用sklearn库中的乳腺癌数据集。
```python
from sklearn.datasets import load_breast_cancer
import pandas as pd
import numpy as np
cancer = load_breast_cancer()
data = pd.DataFrame(np.c_[cancer['data'], cancer['target']], columns= np.append(cancer['feature_names'], ['target']))
```
接下来,我们可以定义一些辅助函数来计算熵、经验条件熵和信息增益。
```python
# 计算数据集的熵
def entropy(target_col):
elements, counts = np.unique(target_col, return_counts=True)
entropy = np.sum([
(-counts[i]/np.sum(counts)) * np.log2(counts[i]/np.sum(counts))
for i in range(len(elements))
])
return entropy
# 计算数据集在某个属性上的经验条件熵
def conditional_entropy(data, feature, target):
elements, counts = np.unique(data[feature], return_counts=True)
conditional_entropy = np.sum([
(counts[i]/np.sum(counts)) * entropy(data.where(data[feature]==elements[i]).dropna()[target])
for i in range(len(elements))
])
return conditional_entropy
# 计算信息增益
def information_gain(data, feature, target):
return entropy(data[target]) - conditional_entropy(data, feature, target)
```
接下来,我们可以实现ID3算法来构建决策树。首先,我们可以定义一个节点类和一个树类。
```python
class Node:
def __init__(self, feature=None, threshold=None, left=None, right=None, value=None):
self.feature = feature
self.threshold = threshold
self.left = left
self.right = right
self.value = value
class DecisionTree:
def __init__(self, max_depth=None):
self.max_depth = max_depth
```
然后,我们可以编写一个递归函数来构建树。这个函数的输入是数据集和当前深度,输出是一个节点。
```python
def build_tree(self, data, depth=0):
num_samples, num_features = data.shape
num_labels = len(np.unique(data.iloc[:, -1]))
# 如果数据集中只有一个类别,或者深度达到了最大深度,直接返回该类别
if num_labels == 1 or depth == self.max_depth:
return Node(value=data.iloc[:, -1].mode()[0])
# 选择最优的属性进行分裂
information_gains = [
information_gain(data, feature, 'target')
for feature in data.iloc[:, :-1]
]
best_feature_idx = np.argmax(information_gains)
best_feature = data.columns[best_feature_idx]
# 如果最优属性的信息增益为0,直接返回该类别
if information_gains[best_feature_idx] == 0:
return Node(value=data.iloc[:, -1].mode()[0])
# 构建左子树和右子树
elements, counts = np.unique(data[best_feature], return_counts=True)
left_data = data[data[best_feature] == elements[0]]
right_data = data[data[best_feature] == elements[1]]
left_tree = self.build_tree(left_data, depth+1)
right_tree = self.build_tree(right_data, depth+1)
# 返回一个节点
return Node(
feature=best_feature,
threshold=None,
left=left_tree,
right=right_tree,
value=None
)
```
最后,我们可以定义一个训练函数来训练模型并返回树。
```python
def fit(self, data):
self.tree = self.build_tree(data)
return self.tree
```
接下来,我们可以使用sklearn库中的DecisionTreeClassifier来构建决策树,并使用混淆矩阵和ROC曲线来评估模型。
```python
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, roc_curve, auc
# 划分训练集和测试集
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# 使用sklearn库中的决策树算法
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X_train, y_train)
# 使用混淆矩阵和ROC曲线来评估模型
y_pred = clf.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
fpr, tpr, thresholds = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
print('混淆矩阵:')
print(cm)
print('ROC曲线下面积:', roc_auc)
```
最后,我们可以使用sklearn库中的feature_importances_属性来获得每个属性的重要性排序。
```python
# 获取每个属性的重要性排序
feature_importances = pd.DataFrame(
clf.feature_importances_,
index=X_train.columns,
columns=['importance']
).sort_values('importance', ascending=False)
print('属性的重要性排序:')
print(feature_importances)
```
完整代码如下:
阅读全文