深圳大学-数据科学导论实验-决策树模型

实验目的与要求

  1. 利用python进行数据的处理、统计;
  2. 利用python的sklearn提供的api搭建决策树和k-means模型,并完成模型的训练和预测。

实验环境

  1. Python版本;3.11.5
  2. Skearn版本;1.3.2
  3. IDE; Pycharm

实验内容

Python的sklean自带了很多数据集。安装好sklearn后,运行以下代码,载入红酒数据集。红酒数据集是一个典型的分类用数据集。

  1. 数据探索(包括但不限于)
    a) 分类有多少个?属性有多少个?数据总量?
    b) 各个属性的均值、方差、最大值与最小值的差…?
    c) …(自行补充)
  2. 数据预处理(包括但不限于)
    a) 有无缺失值、异常值?如有,请处理。
    b) 是否需要对数据进行归一化?请选择合适的归一化手段。
    c) 按照7:3的比例划分出训练集和测试集?
  3. 模型搭建
    a) 请搭建决策树模型,并观察其重要参数,进行合适的选参。
    b) 训练决策树模型
  4. 模型预测与评估
    a) 在测试集上进行模型测试,采用分类准确率、F1值等评估指标;
    b) 观察和判断是否有过拟合或欠拟合现象;

实验过程

1.数据探索(包括但不限于)
a)分类有多少个?属性有多少个?数据总量?
b)各个属性的均值、方差、最大值与最小值的差?
在这里插入图片描述
代码运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
文字说明:该代码先导入了红酒数据集,然后分别将红酒数据集的特征数据和目标变量赋值给变量x和y,然后打印出数据总量,属性数和分类数,然后获取数据集中的特征名称,并计算每一属性的平均值,方差,最大值和最小值,最后打印出结果。

2.数据预处理(包括但不限于)
a)有无缺失值、异常值?如有,请处理。
b)是否需要对数据进行归一化?请选择合适的归一化手段。
c)按照7:3的比例划分出训练集和测试集?

a) 代码如下:

from sklearn.datasets import load_wine
import numpy as np
import pandas as pd

data=pd.read_csv('D:\\py\\Python3\\Lib\\site-packages\\sklearn\\datasets\\data\\wine_data.csv')

print(data.info())

运行结果如下:
在这里插入图片描述
在这里插入图片描述
由这个结果,可知数据无缺失值、异常值
b)和c):
代码如下:

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, f1_score
from sklearn import tree
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import pandas as pd
import graphviz

wine = load_wine()
scaler = MinMaxScaler()

X_train, X_test, Y_train, Y_test = train_test_split(wine.data, wine.target, test_size=0.3)
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

文字说明:按照7:3的比例划分出训练集和测试集,并对数据进行了最大最小化归一处理

3.模型搭建
a)请搭建决策树模型,并观察其重要参数,进行合适的选参。
b)训练决策树模型
4.模型预测与评估
a)在测试集上进行模型测试,采用分类准确率、F1值等评估指标;
b)观察和判断是否有过拟合或欠拟合现象;

三四题代码如下:

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, f1_score
from sklearn import tree
from sklearn.model_selection import learning_curve
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
import graphviz
matplotlib.use('TkAgg')

wine = load_wine()
scaler = MinMaxScaler()

X_train, X_test, Y_train, Y_test = train_test_split(wine.data, wine.target, test_size=0.3)
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = DecisionTreeClassifier(criterion='entropy', random_state=30, splitter='random', max_depth=5)
model.fit(X_train_scaled, Y_train)

Y_pred = model.predict(X_test_scaled)

accuracy = accuracy_score(Y_test, Y_pred)
print("准确率:", accuracy)
f1 = f1_score(Y_test, Y_pred, average="macro")
print("F1值:", f1)

train_sizes, train_scores, test_scores = learning_curve(
    model, X_train_scaled, Y_train, train_sizes=np.linspace(0.1, 1.0, 10), cv=5)

# 计算平均准确率和标准差
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)

# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.title("Learning Curve")
plt.xlabel("Training_Examples_Size")
plt.ylabel("Score")

plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                 train_scores_mean + train_scores_std, alpha=0.1, color="r")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                 test_scores_mean + test_scores_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="Training Score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Testing Score")
plt.legend(loc="best")
plt.show()

# 判断是否存在过拟合或欠拟合现象
if train_scores_mean[-1] > test_scores_mean[-1]:
    print("模型存在过拟合现象")
elif train_scores_mean[-1] < test_scores_mean[-1]:
    print("模型存在欠拟合现象")
else:
    print("模型拟合良好")

文字说明:
3. 选定参数之后,并对模型进行训练
model=DecisionTreeClassifier(criterion=‘entropy’, random_state=30, splitter=‘random’, max_depth=5)
model.fit(X_train_scaled, Y_train)
4.
a)计算分类准确率、F1值,并打印结果,结果如下:
在这里插入图片描述
b) 查阅资料,发现可以使用learning_curve函数计算模型的学习曲线,帮助分析模型在不同训练样本数量下的表现,从而判断是否存在过拟合或欠拟合的现象
在这里插入图片描述
学习曲线如图所示,由此可知该模型存在过拟合现象

实验收获

通过本次实验,我掌握了如何利用python进行数据的处理、统计,掌握了如何对数据进行归一化处理,掌握了如何搭建决策树模型,掌握了如何利用分类准确率、F1值等评估指标对模型进行评估,掌握了如何利用学习曲线来判断模型是否存在过拟合或欠拟合现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值