目录
前言
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
一、我的环境
- 电脑系统:Windows 11
- 语言环境:Python 3.9.7
- 编辑器:Jupyter Lab
二、基本概念
三、分类模型代码实现
1. 导入数据
##导入库和数据
import pandas as pd
import numpy as np
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']
dataset = pd.read_csv(url, names=names)
dataset
2. 数据划分
#数据划分
#.iloc:Pandas中用于基于行和列的索引选择数据的函数
#[ : , [0,1,2,3]]:表示选择dataset中所有行(:表示全部行)和第0到第3列的数据
#.values:将选取的DataFrame转换为NumPy数组格式,通常用于机器学习算法中的特征输入
X = dataset.iloc[ : ,[0,1,2,3]].values
Y = dataset.iloc[ : , 4].values
3. 模型训练
#模型训练
from sklearn import tree #tree模块提供了决策树模型的实现
from sklearn.datasets import load_iris #load_iris函数用于加载内置的鸢尾花(Iris)数据集,通常用于演示和测试机器学习算法
#DecisionTreeClassifier是sklearn.tree模块中用于分类任务的决策树模型
clf = tree.DecisionTreeClassifier() # sk-learn的决策树模型
clf = clf.fit(X, Y) # 用数据训练树模型构建()
#使用export_text函数将训练好的决策树模型clf导出为文本形式。r变量将存储导出的文本,它描述了决策树的规则和结构
r = tree.export_text(clf)
4. 模型预测结果
#模型预测结果
#这行代码从之前定义的特征集X中选取特定的行(索引为0, 1, 50, 51, 100, 101的行)来创建一个新的数组text_x
#这个数组将用于模型的预测
#这里的索引是基于0的,所以实际上选取的是第1行、第2行、第51行、第52行、第101行和第102行的数据
text_x = X[[0,1,50,51,100,101], :]
#这行代码使用训练好的决策树模型clf来预测text_x中每个样本的类别概率
#predict_proba方法返回一个数组,其中包含了每个样本属于每个类别的概率。这些概率的总和对于每个样本都是1。
pred_target_prob = clf.predict_proba(text_x) # 预测类别概率
#这行代码同样使用clf模型来预测text_x中每个样本的类别
#与predict_proba不同,predict方法返回的是每个样本最有可能的类别,即概率最高的类别。
pred_target = clf.predict(text_x) # 预测类别
5. 打印结果
#打印结果
print("\n===模型======")
print(r)
print("\n===测试数据:=====")
print(text_x)
print("\n===预测所属类别概率:=====")
print(pred_target_prob)
print("\n===预测所属类别:======")
print(pred_target)
四、回归模型代码实现
1. 导入数据
#导入数据
import pandas as pd
import numpy as np
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['花萼-length', '花萼-width', '花瓣-length', '花瓣-width', 'class']
dataset = pd.read_csv(url, names=names)
dataset
2. 数据划分
#数据划分
X = dataset.iloc[ : ,[0,1,2]].values
Y = dataset.iloc[ : , 3].values
3. 模型训练
#模型训练
from sklearn import tree
from sklearn.datasets import load_iris
#DecisionTreeRegressor是sklearn.tree模块中用于回归任务的决策树模型
clf = tree.DecisionTreeRegressor() # sk-learn的决策树模型
clf = clf.fit(X, Y) # 用数据训练树模型构建()
r = tree.export_text(clf)
4. 模型预测结果
#模型预测结果
test_x = X[[0,1,50,51,100,101], :]
test_y = Y[[0,1,50,51,100,101]]
#使用训练好的模型clf来预测test_x中每个样本的目标值。predict方法返回的是每个样本最有可能的目标值。
pred_target = clf.predict(test_x) # 预测y
#创建一个空的Pandas DataFrame对象df,用于存储数据
df = pd.DataFrame()
#将原始目标值test_y添加到DataFramedf中,列名为"原y"
df["原y"] = test_y
#将模型预测的目标值pred_target添加到DataFramedf中,列名为"预测y"
df["预测y"] = pred_target
5. 打印结果
#打印结果
print("\n===模型======")
# print(r)
print("\n===预测结果======")
print(df)
五、心得体会
决策树每个内部节点表示一个测试功能,即类似做出决策的过程(动作),每个叶节点都表示一个类标签,即在计算所有特征之后做出的决定(结果)。
用决策树分类:从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点,此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶节点,最后将实例分到叶节点的类中。
决策树分为两大类,分类树和回归树:
分类树用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面;
回归树用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;
两者的区别:
分类树的结果不能进行加减运算,晴天 晴天没有实际意义;
回归树的结果是预测一个数值,可以进行加减运算,例如 20 岁 3 岁=23 岁。
GBDT 中的决策树是回归树,预测结果是一个数值,在点击率预测方面常用 GBDT,例如用户点击某个内容的概率。
决策树的基本概念和核心思想:
问题分解:将复杂的问题分解成多个简单的问题或决策点,每个问题对应一个特征属性。
信息增益:选择最优特征进行分割,通常是通过计算信息增益(或其它标准如基尼不纯度)来实现,以确保每次分割都能最大化类别的分离。
递归构建:从根节点开始,递归地对数据集进行分割,直到满足停止条件,如达到预设的最大深度,或每个子节点中的样本都属于同一类别。
树的深度:决策树的深度影响模型的复杂度,深度过大可能导致过拟合,而过小则可能导致欠拟合。
分支决策:每个内部节点代表一个决策规则,每个分支代表决策规则的一个可能结果。
叶节点:叶节点代表最终的决策结果,可以是分类问题中的一个类别,或回归问题中的一个数值。
特征的重要性:决策树可以揭示特征对预测结果的重要性,因为树的结构显示了哪些特征被用来进行决策。
模型的可解释性:决策树的结构清晰,易于理解和解释,使得非技术用户也能明白模型是如何做出预测的。
适应性:决策树可以适应各种类型的数据,包括数值型和类别型数据,无需复杂的数据预处理。
处理缺失值:决策树算法可以处理数据中的缺失值,通过为缺失值选择一个替代分支来继续决策过程。
多路分割:与二元分割不同,一些决策树算法允许每个节点进行多路分割,即每个节点可以基于多个特征进行分割。
剪枝:为了防止过拟合,决策树可以通过剪枝技术来减少树的大小,剪枝可以是预剪枝(在树生长前设置限制)或后剪枝(在树生长后移除一些分支)。