【数学建模学习笔记】机器学习分类:决策树分类
零基础小白看懂决策树分类
一、什么是决策树?
简单说,决策树就像我们平时做选择的 "流程图"。比如判断一个水果是不是苹果:
- 第一步看颜色:红色 / 绿色?
- 第二步看形状:圆形?
- 第三步看有没有果柄?
- 最后得出结论
决策树就是用这种 "一步一步提问" 的方式给数据分类,树的每个节点是一个问题(比如 "酒精含量大于 13 吗?"),分支是答案,最后叶子节点就是分类结果(比如 "琴酒")。
二、核心概念:信息增益和 Gini 指数
这两个是决策树用来 "选最好的问题" 的工具,目的是让每次划分后,数据分类更清晰。
Gini 指数:衡量 "混乱程度"。值越小,说明这组数据越纯(比如全是琴酒)。
举例:如果 10 个样本里 8 个是琴酒、2 个是雪莉,混乱程度就比 "5 个琴酒 5 个雪莉" 低。信息增益:看用某个特征划分后,混乱程度减少了多少。减少越多,这个特征越适合当前划分。
三、用红酒数据做实验的步骤(带代码版)
我们拿红酒数据(含酒精、苹果酸等特征,以及 "琴酒 / 雪莉 / 贝尔摩德" 三类标签)来做例子,步骤如下:
准备数据
先导入需要的工具库,再加载红酒数据:# 导入工具库 import pandas as pd # 处理表格数据 from sklearn.model_selection import train_test_split # 划分训练集和测试集 from sklearn.preprocessing import StandardScaler # 数据标准化 from sklearn.tree import DecisionTreeClassifier # 决策树模型 from sklearn.metrics import accuracy_score # 计算准确率 import matplotlib.pyplot as plt # 画图 from sklearn.tree import plot_tree # 可视化决策树# 加载红酒数据(在线表格) df = pd.read_excel('https://labfile.oss.aliyuncs.com/courses/40611/%E7%BA%A2%E9%85%92%E6%95%B0%E6%8D%AE.xlsx') df.head() # 显示前5行数据
运行后会看到表格里有 "酒精"" 苹果酸 " 等特征,最后一列是红酒种类(琴酒 / 雪莉 / 贝尔摩德)。
接着把中文改成英文(电脑更易处理):
# 中文列名转英文(比如"酒精"→"Alcohol") column_mapping = {'酒精': 'Alcohol','苹果酸': 'Malic_Acid','种类': 'Class' # 其他列名同理转换 } df.rename(columns=column_mapping, inplace=True)# 红酒种类转英文(比如"琴酒"→"Gin") label_mapping = {'雪莉': 'Sherry', '琴酒': 'Gin', '贝尔摩德': 'Vermouth'} df['Class'] = df['Class'].replace(label_mapping)
拆分特征和标签
把 "特征"(比如酒精含量、苹果酸)和 "标签"(红酒种类)分开,就像把 "题目" 和 "答案" 分开:X = df.drop('Class', axis=1) # 特征:所有列除了"Class" y = df['Class'] # 标签:只有"Class"列(红酒种类)
数据标准化
不同特征的数值范围可能差很大(比如 "镁" 是几十,"脯氨酸" 是几百),标准化就是把它们调成差不多的范围,让模型更公平:scaler = StandardScaler() # 创建标准化工具 X_scaled = scaler.fit_transform(X) # 对特征进行标准化
分训练集和测试集
用 80% 的数据让模型学习,20% 的数据检验学习效果:# test_size=0.2表示20%做测试集,random_state=42是固定随机数(保证结果可重复) X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42 )
训练决策树模型
用 Gini 指数作为划分标准,让模型学习如何分类:# 创建决策树模型,用Gini指数(criterion='gini') clf = DecisionTreeClassifier(criterion='gini', random_state=42) clf.fit(X_train, y_train) # 用训练集训练模型
测试模型效果
用测试集预测红酒种类,看看准确率多少:y_pred = clf.predict(X_test) # 用模型预测测试集的红酒种类 accuracy = accuracy_score(y_test, y_pred) # 计算准确率 print('准确率:', accuracy) # 输出结果:0.9166(约92%)
92% 的准确率意味着,100 个测试样本里,模型能猜对 92 个,效果不错!
可视化决策树
画出决策树,直观看到模型是怎么一步步判断的:plt.figure(figsize=(12, 10)) # 设置图片大小 # 画决策树:feature_names是特征名,class_names是分类结果 plot_tree(clf, feature_names=X.columns, class_names=['Sherry', 'Gin','Vermouth'], filled=True) plt.show() # 显示图片
运行后会看到一棵 "树",每个节点都有一个问题(比如 "Proline <= 755.5?"),顺着分支走,最后能得到红酒种类。
四、决策树的优点
- 简单易懂:就像流程图,能直接看到分类规则。
- 用途广:除了分类(比如分红酒),还能做回归(比如预测房价)、选重要特征。
- 不需要太多数学基础,电脑会自动处理复杂计算。