机器学习实验2:决策树模型实现 基于sklearn

数据集介绍

  1. Iris 也称鸢尾花卉数据集由 R.A. Fisher 于 1936 年收集整理的。其中包含 3
    种植物种类,分别是山鸢尾(setosa)变色鸢尾(versicolor)和维吉尼亚鸢
    尾(virginica),每类 50 个样本,共 150 个样本。
  2. iris 数据集中每个样本包含了 4 个特征或属性:花萼长度(sepal length),
    花萼宽度(sepal width),花瓣长度(petal length),花瓣宽度(petal width)。
  3. 鸢尾花分类问题:给定某个鸢尾花的花萼长度,花萼宽度,花瓣长度和花瓣
    宽度,预测鸢尾花是山鸢尾,变色鸢尾和维吉尼亚鸢尾中的哪一种。

实验目的

  1. 理解决策树相关原理和概念;
  2. 能够使用决策树模型解决相关问题;
  3. 熟练使用 Scikit-learn 中决策树相关模块。

实验内容

使用决策树模型解决鸢尾花分类问题。

实验要求

  1. 对问题进行描述并给出决策树模型解决问题的原理;
  2. 将问题相关数据集划分成训练集和测试集;
  3. 给出决策树模型解决鸢尾花分类问题的代码;
  4. 通过调整模型参数实现类似剪枝的操作;

实验原理

实验代码

按总的数据划分测试集
引入鸢尾花特征数据

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值