数据集介绍
- Iris 也称鸢尾花卉数据集由 R.A. Fisher 于 1936 年收集整理的。其中包含 3
种植物种类,分别是山鸢尾(setosa)变色鸢尾(versicolor)和维吉尼亚鸢
尾(virginica),每类 50 个样本,共 150 个样本。 - iris 数据集中每个样本包含了 4 个特征或属性:花萼长度(sepal length),
花萼宽度(sepal width),花瓣长度(petal length),花瓣宽度(petal width)。 - 鸢尾花分类问题:给定某个鸢尾花的花萼长度,花萼宽度,花瓣长度和花瓣
宽度,预测鸢尾花是山鸢尾,变色鸢尾和维吉尼亚鸢尾中的哪一种。
实验目的
- 理解决策树相关原理和概念;
- 能够使用决策树模型解决相关问题;
- 熟练使用 Scikit-learn 中决策树相关模块。
实验内容
使用决策树模型解决鸢尾花分类问题。
实验要求
- 对问题进行描述并给出决策树模型解决问题的原理;
- 将问题相关数据集划分成训练集和测试集;
- 给出决策树模型解决鸢尾花分类问题的代码;
- 通过调整模型参数实现类似剪枝的操作;
实验原理
实验代码
按总的数据划分测试集
引入鸢尾花特征数据
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data #变量 X 保存特征向量集合
Y=iris.target #变量 Y 保存标记集合
X
Out[5]:
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
. . . . . . . . . . .
[6.7, 3. , 5.2, 2.3],
[6.3, 2.5, 5. , 1.9],
[6.5, 3. , 5.2, 2. ],
[6.2, 3.4, 5.4, 2.3],
[5.9, 3. , 5.1, 1.8]])
y
Out[6]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
引入决策树模型
from sklearn.tree import DecisionTreeClassifier
DTCmodel= DecisionTreeClassifier(criterion='entropy')
引入数据划分模块
from sklearn.model_selection import train_test_split
# 划分数据集 将33%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# 43%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.43, random_state=42)
# 53%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.53, random_state=42)
模型训练
# 33%作为测试集
DTCmodel.fit(X_train, y_train)
Out[14]: DecisionTreeClassifier(criterion='entropy')
DTCmodel.score(X_test, y_test)
Out[15]: 0.98
# 43% 作为测试集
DTCmodel.fit(X_train, y_train)
Out[17]: DecisionTreeClassifier(criterion='entropy')
DTCmodel.score(X_test, y_test)
Out[18]: 0.9846153846153847
#53%作为测试集
DTCmodel.fit(X_train, y_train)
Out[20]: DecisionTreeClassifier(criterion='entropy')
DTCmodel.score(X_test, y_test)
Out[21]: 0.925
剪枝操作
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
iris=load_iris()
X=iris.data
y=iris.target
DTCmodel= DecisionTreeClassifier(criterion='entropy')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
DTCmodel.fit(X_train, y_train)
DTCmodel.score(X_test, y_test)
# 剪枝操作
# 保留决策树深度
d = DTCmodel.get_depth()
# 重新定义模型
model= DecisionTreeClassifier(criterion='entropy',max_depth=d-1)
model.fit(X_train, y_train)
model.score(X_test, y_test)
将每类鸢尾花的50个数据进行划分
划分测试集三个种类
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data
Y=iris.target
x=X.tolist()
y=Y.tolist()
# 第一种
x1=x[0:50]
y1=y[0:50]
# 第二种
x2=x[50:100]
y2=y[50:100]
# 第三种
x3=x[100:150]
y3=y[100:150]
导入模型,导入划分,进行训练预测
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris=load_iris()
X=iris.data
Y=iris.target
x=X.tolist()
y=Y.tolist()
# 第一种
x1=x[0:50]
y1=y[0:50]
# 第二种
x2=x[50:100]
y2=y[50:100]
# 第三种
x3=x[100:150]
y3=y[100:150]
# 数据划分
X1_train,X1_test,Y1_train,Y1_test = train_test_split(x1, y1, test_size=0.33, random_state=42)
X2_train,X2_test,Y2_train,Y2_test = train_test_split(x2, y2, test_size=0.33, random_state=42)
X3_train,X3_test,Y3_train,Y3_test = train_test_split(x3, y3, test_size=0.33, random_state=42)
# 合并训练集和测试集
Xtrain = X1_train+X2_train+X3_train
Xtest = X1_test+X2_test+X3_test
Ytrain = Y1_train+Y2_train+Y3_train
Ytest = Y1_test+Y2_test+Y3_test
DTCmodel = DecisionTreeClassifier(criterion='entropy')
DTCmodel.fit(Xtrain,Ytrain)
DTCmodel.score(Xtest,Ytest)
Out[10]: 0.9607843137254902
# 进行减枝 1 使准确率尽量100%
d=DTCmodel.get_depth()
model= DecisionTreeClassifier(criterion='entropy',max_depth=d-1)
model.fit(Xtrain,Ytrain)
model.score(Xtest,Ytest)
Out[13]: 0.9411764705882353
# 进行减枝 2
model= DecisionTreeClassifier(criterion='entropy',max_depth=d-1,min_samples_leaf=d+1)
model.fit(Xtrain,Ytrain)
model.score(Xtest,Ytest)
Out[15]: 0.9803921568627451
# 进行减枝 3
model= DecisionTreeClassifier(criterion='entropy',max_depth=d-2)
model.fit(Xtrain,Ytrain)
model.score(Xtest,Ytest)
Out[34]: 0.9607843137254902