有监督学习中的判定树算法
时间: 2023-10-12 11:21:52 浏览: 39
监督学习中的判定树算法是一种基于树形结构的分类算法,也称为决策树算法。它通过对数据集进行递归划分,从而构建出一棵决策树,每个叶子节点代表一个分类结果。在判定新的样本时,从根节点开始依次根据样本的特征值进行判断,最终到达叶子节点得到分类结果。判定树算法有很多种,包括ID3、C4.5、CART等。其中,ID3算法是基于信息增益进行划分的,C4.5算法是基于信息增益比进行划分的,CART算法则是基于基尼系数进行划分的。
相关问题
用python写一个有监督学习中的判定树算法
好的,以下是一个使用Python实现的ID3决策树算法(基于信息增益)。假设我们有一个二元分类问题,数据集如下所示:
| 属性1 | 属性2 | 类别 |
|-------|-------|------|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
首先,我们需要写一个函数来计算信息熵:
```python
import math
def calc_entropy(data):
n = len(data)
if n == 0:
return 0
count = {}
for d in data:
label = d[-1]
if label not in count:
count[label] = 0
count[label] += 1
entropy = 0
for c in count.values():
p = c / n
entropy -= p * math.log2(p)
return entropy
```
然后,我们需要写一个函数来计算信息增益:
```python
def calc_gain(data, feature_idx):
n = len(data)
if n == 0:
return 0
entropy_before = calc_entropy(data)
count = {}
for d in data:
feature_value = d[feature_idx]
label = d[-1]
if feature_value not in count:
count[feature_value] = {}
if label not in count[feature_value]:
count[feature_value][label] = 0
count[feature_value][label] += 1
entropy_after = 0
for feature_value, label_count in count.items():
p = sum(label_count.values()) / n
entropy = calc_entropy(label_count.values())
entropy_after += p * entropy
return entropy_before - entropy_after
```
接下来,我们可以编写一个递归函数来构建决策树:
```python
def build_tree(data, feature_list):
# 如果数据集为空,则返回空节点
if len(data) == 0:
return None
# 如果数据集的所有样本都属于同一类别,则返回叶子节点
labels = set(d[-1] for d in data)
if len(labels) == 1:
return labels.pop()
# 如果特征列表为空,则返回叶子节点,该节点的类别为数据集中样本数最多的类别
if len(feature_list) == 0:
label_counts = {}
for d in data:
label = d[-1]
if label not in label_counts:
label_counts[label] = 0
label_counts[label] += 1
return max(label_counts, key=label_counts.get)
# 选择信息增益最大的特征
best_feature = max(feature_list, key=lambda x: calc_gain(data, x))
# 构建根节点
root = {'feature': best_feature, 'children': {}}
# 将数据集划分成若干个子集,并递归构建子树
for feature_value in set(d[best_feature] for d in data):
sub_data = [d for d in data if d[best_feature] == feature_value]
sub_tree = build_tree(sub_data, [f for f in feature_list if f != best_feature])
root['children'][feature_value] = sub_tree
return root
```
最后,我们可以使用构建好的决策树来进行预测:
```python
def predict(tree, sample):
# 如果当前节点是叶子节点,则返回该节点的类别
if type(tree) != dict:
return tree
# 否则,根据样本的特征值找到下一个节点,并递归预测
feature_value = sample[tree['feature']]
if feature_value not in tree['children']:
return None
sub_tree = tree['children'][feature_value]
return predict(sub_tree, sample)
```
现在,我们可以使用上述的函数来构建决策树并进行预测:
```python
data = [
[1, 1, 1],
[1, 0, 1],
[0, 1, 0],
[0, 0, 0]
]
feature_list = [0, 1] # 特征列表
tree = build_tree(data, feature_list) # 构建决策树
sample = [1, 0] # 待预测样本
print(predict(tree, sample)) # 输出预测结果
```
输出结果为1,即属于第一类。
用python语言实现一个简单的有监督学习中的判定树算法
好的,可以使用 Python 中的 scikit-learn 库来实现一个简单的有监督学习中的判定树算法。
首先,我们需要导入需要的库:
```python
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
```
然后,我们可以加载一个经典的数据集 iris,这个数据集包含了三种不同的鸢尾花的数据,每个数据包含了四个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。我们可以将这个数据集划分为训练集和测试集:
```python
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
```
接着,我们可以定义一个决策树分类器,并将其训练:
```python
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)
```
最后,我们可以使用测试集来评估分类器的性能:
```python
accuracy = clf.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
```
完整的代码如下:
```python
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# load the iris dataset
iris = load_iris()
# split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
# create a decision tree classifier
clf = DecisionTreeClassifier()
# train the classifier on the training set
clf.fit(X_train, y_train)
# evaluate the classifier on the testing set
accuracy = clf.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
```
注意:这只是一个简单的示例,实际应用中可能需要对特征进行预处理、调整超参数等操作。