【从零入门人工智能】决策树实战_数据集:iris_data.csv

本文通过实战案例,介绍如何利用Python的sklearn库构建决策树模型,并对模型进行可视化展示。通过调整min_samples_leaf参数,观察决策树结构的变化及其对模型准确性的影响。
部署运行你感兴趣的模型镜像

实验目标

  1. 基于iris_data.csv数据,建立决策树模型,评估模型表现
  2. 可视化决策树结构
  3. 修改min_samples_leaf参数,对比模型结果

数据集:百度云盘链接,提取码:fp8s

使用到的第三方库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.metrics import accuracy_score

导入数据

# 导入数据
data = pd.read_csv("./dataset/iris_data.csv")
data.head()

数据预览

使用 sklearn 自带的数据集

本次实验使用的数据集已经在 sklean 中包含了,可以直接使用,使用方法如下

# 导入数据集,scikit-learn 中已经包含了当前数据集
from sklearn.datasets import load_iris
iris = load_iris()
# pd.DataFrame(iris.data).head()
print(iris)

数据预览

建立决策树模型

我们使用从本地导入数据的方式建立决策树模型,使用 sklearn 自带的数据集导入方式可以自行探索

# 建立决策树模型
dc_tree = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=5)
dc_tree.fit(x, y)

# 查看预测的准确性
accuracy = accuracy_score(y,dc_tree.predict(x))
print(f"模型预测的准确性为 >>> {accuracy}")

模型预测准确性
通过实验我们可以知道,决策树的预测准确性为:97.34%

参数解释:

  • min_samples_leaf:叶子节点所需最少样本数,默认为1。如果达不到这个阈值,则同一父节点的所有叶子节点均被剪枝,
  • criterion:选择使用什么算法作为结点分裂的依据。默认:gini。可选gini(基尼系数)或者entropy(信息增益)。

决策树模型 sklearn.tree.DecisionTreeClassifier 中还有很多默认参数,具体的可以参考官方文档

决策树可视化

# 可视化决策树
fig = plt.figure(figsize=(10,10))
tree.plot_tree(
	dc_tree, 
	feature_names=['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width'], 
	class_names=['setosa', 'versicolor', 'virginica'], 
	filled=True
)

sklearn.tree.plot_tree 具体的参数解释,参考官方文档
决策树可视化1

修改建立决策树模型参数后再次可视化决策树

# 建立决策树模型
dc_tree = tree.DecisionTreeClassifier(criterion='entropy', min_samples_leaf=1)
dc_tree.fit(x, y)
# 可视化决策树
fig = plt.figure(figsize=(15,15))
tree.plot_tree(
		dc_tree, 
		feature_names=['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width'],
		class_names=['setosa', 'versicolor', 'virginica'], 
		filled=True
)

决策树可视化2
我们将决策树模型建立时叶子结点所需的最小样本数量改为1之后,(即:min_samples_leaf=1),决策树的深度相较之前加深了 1 ,结点数量也增加了。

通过实验我们可以知道,修改 min_samples_leaf 参数可以使模型的更加 "匹配" 训练集合,但是 min_samples_leaf 设置的过小,可能会导致过拟合的情况,从而使得模型的预测准确性下降。

总结

  1. 本次实验通过建立决策树,实现对标签数据的有效分类;
  2. 通过修改叶子节点最少样本数对应参数 min_samples_leaf,可调控制树的分支深度;
  3. 决策树是一种比较简单的分类方法,具有容易理解、容易处理分类特征等优点,但是也存在容易出现过拟合的问题。
  4. 核心算法参考链接:sklearn.tree.DecisionTreeClassifier

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

import matplotlib.pyplot as plt import numpy as np import pandas as pd col_names = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species'] iris_data = pd.read_csv("iris_training.csv", header=0, names=col_names) print(iris_data) iris_data = np.array(iris_data) x, y = iris_data[:, :4], iris_data[:, 4] pd_iris = pd.DataFrame(np.hstack((x, y.reshape(120, 1)))), columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width', 'class']) plt.figure(dpi=100) iris_type = pd_iris['class'].unique() iris_name = ['setosa', 'versicolor', 'virginica'] colors = ['#c71e16', '#096182', '#fc821c'] markers = ['o', 's', 'p'] color_type = ['Sepal Length', 'Petal Length', 'Sepal Width'] for t in range(2): plt.subplot(1, 2, t+1) for i in range(len(iris_type)): plt.scatter( pd_iris.loc[pd_iris['class'] == iris_type[i], color_type[t]], pd_iris.loc[pd_iris['class'] == iris_type[i], 'Sepal Width'], s=50, c=colors[i], marker=markers[i], alpha=0.8, facecolors='r', edgecolors='none', linewidths=1, label=iris_name[i] ) plt.xlabel(color_type[t]) plt.ylabel('Sepal Width') plt.legend(loc='upper right') plt.show() import math import numpy as np import pandas as pd import operator # 计算样本点之间的距离 def get_euc_dist(ins1, ins2, dim): dist = 0 for i in range(dim): dist += pow((ins1[i] - ins2[i]), 2) return math.sqrt(dist) # 获取k个邻居 def get_neighbors(test_sample, train_set, train_set_y, k=3): dist_list = [] dim = len(test_sample) for i in range(len(train_set)): dist = get_euc_dist(test_sample, train_set[i], dim) dist_list.append((train_set_y[i], dist)) # 获取测试样例到其他样例的距离 dist_list.sort(key=operator.itemgetter(1)) # 对所有距离进行排序 test_sample_neighbors = [] for i in range(k): test_sample_neighbors.append(dist_list[i][0]) # 获取到距离最近的k个样例 return test_sample_neighbors # 预测样本所属分类 def predict_class_label(neighbors): class_labels = {} # 统计得票数 for i in range(len(neighbors)): neighbor_index = neighbors[i] if neighbor_index in class_labels: class_labels[neighbor_index] += 1 else: class_labels[neighbor_index] = 1 label_sorted = sorted(class_labels.items(), key=operator.itemgetter(1), reverse=True) return label_sorted[0][0] # 计算预测准确率 def getAccuracy(test_labels, pre_labels): correct = 0 for x in range(len(test_labels)): if test_labels[x] == pre_labels[x[x correct += 1 return (correct / float(len(test_labels))) * 100.0 if __name__ == '__main__': column_names = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species'] iris_data = pd.read_csv("iris_training.csv", header=0, names=column_names) print(iris_data.head()) iris_data = np.array(iris_data) iris_train, iris_train_y = iris_data[:, :4], iris_data[:, 4] iris_test = pd.read_csv("iris_test.csv", header=0, names=column_names) iris_test = np.array(iris_test) iris_test, iris_test_y = iris_test[:, :4], iris_test[:, 4] print(iris_test_y) pre_labels = [] k = 3 for x in range(len(iris_test)): neighbors = get_neighbors(iris_test[x], iris_train, iris_train_y, k) result = predict_class_label(neighbors) pre_labels.append(result) print('预测类别: ' + repr(result) + ', 真实的类别: ' + repr(iris_test_y[x])) print('预测类别: ' + repr(pre_labels)) accuracy = getAccuracy(iris_test_y, pre_labels) print('Accuracy: ' + repr(accuracy) + '%')
最新发布
10-14
由于没有提供具体的代码,下面给出一个使用 Python 对鸢尾花数据集进行分析、可视化及 K 近邻算法分类预测的完整示例代码,并对代码逻辑进行解释和优化建议。 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 数据读取 iris = load_iris() iris_df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target']) # 数据可视化 plt.figure(figsize=(10, 6)) plt.scatter(iris_df['sepal length (cm)'], iris_df['sepal width (cm)'], c=iris_df['target']) plt.xlabel('Sepal Length (cm)') plt.ylabel('Sepal Width (cm)') plt.title('Iris Sepal Length vs Sepal Width') plt.show() # 划分训练集和测试集 X = iris_df.drop('target', axis=1) y = iris_df['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # K 近邻算法分类预测 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) # 准确率计算 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy}") ``` ### 代码逻辑解释 1. **数据读取**:使用 `sklearn.datasets.load_iris()` 加载鸢尾花数据集,并将其转换为 Pandas 的 DataFrame 格式,方便后续处理。 2. **数据可视化**:使用 `matplotlib` 库绘制散点图,展示鸢尾花的萼片长度和萼片宽度之间的关系,不同颜色代表不同的类别。 3. **划分训练集和测试集**:使用 `sklearn.model_selection.train_test_split()` 函数将数据集划分为训练集和测试集,测试集占比为 30%。 4. **K 近邻算法分类预测**:使用 `sklearn.neighbors.KNeighborsClassifier()` 创建 K 近邻分类器,并使用训练集进行训练,然后对测试集进行预测。 5. **准确率计算**:使用 `sklearn.metrics.accuracy_score()` 函数计算预测结果的准确率。 ### 优化建议 - **选择最优的 K 值**:可以使用交叉验证的方法选择最优的 K 值,提高模型的性能。 - **特征选择**:可以通过特征选择的方法,选择对分类结果影响较大的特征,减少数据的维度,提高模型的训练速度和性能。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值