1.决策树模型:
是一个利用像树一样的图形或决策模型的决策支持工具。结构如下:
- 叶子节点:决策结果(预测类别);
- 非叶子节点:分割点(某个特征上的测试)。
1.1 基本原理:
从根节点开始,计算所有特征值的信息增益,选择计算结果最大的特征作为根节点;
根据算出的特征建立子节点,执行第一步,直到所有特征的信息增益很小或没有特征可以选择为止。
1.2 信息增益:
一个特征能过为分类系统带来多少信息,带来的信息越多,该特征越重要。
1.3 在sklearn中使用决策树:
DecisionTreeClassfier()
,包含如下重要参数:max_depth
——树的最大深度,最常用于减少模型复杂度,防止过拟合的参数;min_samples_leaf
——每个叶子拥有的最少的样本个数;max_leaf_nodes
——树中叶子的最大个数;
实际应用中,通常只需要调整max_depth
就已足够防止决策树模型的过拟合。
2.代码:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
data_file = './data/Iris.csv'
CATEGRORY_LABEL_DICT = {
'Iris-setosa': 0, # 山鸢尾
'Iris-versicolor': 1, # 变色鸢尾
'Iris-virginica': 2 # 维吉尼亚鸢尾
}
# 使用的特征列
FEAT_COLS = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
def main():
"""
主函数
"""
iris_data = pd.read_csv(data_file, index_col='Id')
# 添加label一列作为预测标签
iris_data['Label'] = iris_data['Species'].apply(lambda category_name: CATEGRORY_LABEL_DICT[category_name])
# 4列花的属性作为样本特征
X = iris_data[FEAT_COLS].values
# label列为样本标签
y = iris_data['Label'].values
# 将原始数据集拆分成训练集和测试集,测试集占总样本数的1/3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)
# 构建模型
max_depth_list = [2, 3, 4]
for max_depth in max_depth_list:
dt_model = DecisionTreeClassifier(max_depth=max_depth)
dt_model.fit(X_train, y_train)
train_acc = dt_model.score(X_train, y_train)
test_acc = dt_model.score(X_test, y_test)
print('max_depth={}时:'.format(max_depth) )
print('训练集上的准确率为:{:.2f}%'.format(train_acc * 100))
print('测试集上的准确率为:{:.2f}%'.format(test_acc * 100))
if __name__ == '__main__':
main()
3.输出结果:
max_depth=2时:
训练集上的准确率为:97.00%
测试集上的准确率为:92.00%
max_depth=3时:
训练集上的准确率为:98.00%
测试集上的准确率为:92.00%
max_depth=4时:
训练集上的准确率为:100.00%
测试集上的准确率为:90.00%