一、ID3算法介紹
ID3(Iterative Dichotomise 3)算法是一種決策樹算法。它使用信息增益作為特徵選擇的標準,即從所有可能的特徵中選擇出信息增益最大的特徵,作為當前節點的特徵,同時將樣本集合按照該特徵分為不同的子集。
該算法最初由Ross Quinlan提出,是C4.5算法的前身。它適用於二分類和多分類問題,能夠較好地處理數據集中屬性是離散的情況。
二、ID3算法流程
下面通過一個簡單的例子來介紹ID3算法的流程:
import math
def calc_entropy(data_set):
num_entries = len(data_set)
label_counts = {}
for feat_vec in data_set:
current_label = feat_vec[-1]
if current_label not in label_counts:
label_counts[current_label] = 0
label_counts[current_label] += 1
entropy = 0.0
for key in label_counts:
prob = float(label_counts[key]) / num_entries
entropy -= prob * math.log(prob, 2)
return entropy
def split_data_set(data_set, axis, value):
new_data_set = []
for feat_vec in data_set:
if feat_vec[axis] == value:
reduced_feat_vec = feat_vec[:axis]
reduced_feat_vec.extend(feat_vec[axis+1:])
new_data_set.append(reduced_feat_vec)
return new_data_set
def choose_best_feature_to_split(data_set):
num_features = len(data_set[0]) - 1
base_entropy = calc_entropy(data_set)
best_info_gain = 0.0
best_feature = -1
for i in range(num_features):
feat_list = [example[i] for example in data_set]
unique_vals = set(feat_list)
new_entropy = 0.0
for value in unique_vals:
sub_data_set = split_data_set(data_set, i, value)
prob = len(sub_data_set) / float(len(data_set))
new_entropy += prob * calc_entropy(sub_data_set)
info_gain = base_entropy - new_entropy
if info_gain > best_info_gain:
best_info_gain = info_gain
best_feature = i
return best_feature
def majority_cnt(class_list):
class_count = {}
for vote in class_list:
if vote not in class_count:
class_count[vote] = 0
class_count[vote] += 1
sorted_class_count = sorted(class_count.items(), key=lambda x: x[1], reverse=True)
return sorted_class_count[0][0]
def create_tree(data_set, labels):
class_list = [example[-1] for example in data_set]
if class_list.count(class_list[0]) == len(class_list):
return class_list[0]
if len(data_set[0]) == 1:
return majority_cnt(class_list)
best_feat = choose_best_feature_to_split(data_set)
best_feat_label = labels[best_feat]
my_tree = {best_feat_label: {}}
del(labels[best_feat])
feat_values = [example[best_feat] for example in data_set]
unique_vals = set(feat_values)
for value in unique_vals:
sub_labels = labels[:]
my_tree[best_feat_label][value] = create_tree(split_data_set(data_set, best_feat, value), sub_labels)
return my_tree
data_set = [[1,1,'yes'],[1,0,'yes'],[0,1,'no'],[0,1,'no'],[0,0,'no']]
labels = ['no surfacing', 'flippers']
tree = create_tree(data_set, labels)
print(tree)
上述代碼為python實現的ID3算法示例,包括計算熵值、劃分數據集、選擇最佳特徵等過程。其中,create_tree函數為ID3算法的核心部分,根據數據集和特徵標籤的信息,遞歸創建決策樹。
三、ID3算法的優缺點
ID3算法作為決策樹算法中的一種,其具有以下優缺點:
優點:
1、簡單、易於理解和實現。
2、能夠處理具有缺失數據。
3、能夠處理離散型和連續性數據。
4、生成的決策樹可讀性好。
缺點:
1、容易出現過擬合問題。
2、對噪聲敏感。
3、無法處理樣本中的類別不平衡問題。
四、ID3算法優化
為了解決ID3算法出現的過擬合問題和對噪聲敏感的問題,通常採用以下兩種優化方式:
1、剪枝技術
剪枝技術是在生成決策樹之後,自下而上對節點進行修剪,去掉一些不重要或者無用的節點。剪枝的過程一般有兩種方法,分別為預剪枝和後剪枝。
2、隨機森林技術
隨機森林技術在實際應用中非常廣泛,是一種基於決策樹的集成學習方法。隨機森林通過對數據隨機抽樣和對特徵隨機選取,生成多棵決策樹,再通過投票或取平均值的方式得出最終的結果。
五、總結
ID3算法是一種廣泛應用的決策樹算法,其使用信息增益作為特徵選擇的標準,適用於二分類和多分類問題,能夠較好地處理數據集中屬性是離散的情況。但是,ID3算法也存在過擬合、對噪聲敏感等問題。為了提高其準確性和魯棒性,通常採用剪枝技術和隨機森林技術等優化方式。
原創文章,作者:TBWXH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/372598.html
微信掃一掃
支付寶掃一掃