数据集:https://pan.quark.cn/s/4d3526600c0c
在机器学习领域,图像分类是一个常见的任务,尤其是在自然语言处理和生物识别等领域。本文将通过一个简单的例子,展示如何使用Python和一些流行的库来实现蘑菇的分类,区分可食用蘑菇和毒蘑菇。以下是详细的步骤和代码解析。
1. 导入必要的库
首先,我们需要导入一些必要的Python库:
python
import os # 用于文件和目录操作
import cv2 # 用于图像读取和处理
import numpy as np # 用于数值计算
from sklearn.model_selection import train_test_split # 用于数据集分割
from sklearn.tree import DecisionTreeClassifier # 用于创建决策树分类器
from sklearn.metrics import classification_report # 用于生成分类报告
2. 设置数据路径
我们需要为可食用蘑菇和毒蘑菇的图片设置存储路径。这里假设图片存储在本地磁盘上:
python
edible_path = r'Mushroom dataset\Edible'
poisonous_path = r'Mushroom dataset\Poisonous'
3. 初始化数据和标签列表
在开始读取图片之前,我们需要初始化两个列表:X
用于存储图像数据,y
用于存储对应的标签。
python
X = [] # 存储图像数据的列表
y = [] # 存储标签的列表
4. 读取图片并处理
接下来,我们遍历存储路径中的每个文件,读取图片,调整图片大小,并将其展平成一维向量。同时,根据图片的类型(可食用或毒蘑菇),添加相应的标签。
python
for filename in os.listdir(edible_path): # 遍历可食用蘑菇图片目录
img_path = os.path.join(edible_path, filename) # 获取图片的完整路径
image = cv2.imread(img_path) # 读取图片
if image is not None: # 确保图片被成功读取
image = cv2.resize(image, (64, 64)) # 将图片调整为64x64像素
image = image.flatten() # 将图片数据展平成一维数组
X.append(image) # 添加到X列表
y.append('Edible') # 添加标签到y列表
for filename in os.listdir(poisonous_path): # 遍历毒蘑菇图片目录
img_path = os.path.join(poisonous_path, filename) # 获取图片的完整路径
image = cv2.imread(img_path) # 读取图片
if image is not None: # 确保图片被成功读取
image = cv2.resize(image, (64, 64)) # 将图片调整为64x64像素
image = image.flatten() # 将图片数据展平成一维数组
X.append(image) # 添加到X列表
y.append('Poisonous') # 添加标签到y列表
5. 转换为NumPy数组
将X
和y
列表转换为NumPy数组,以便进行机器学习处理。
python
X = np.array(X)
y = np.array(y)
6. 划分数据集
使用train_test_split
函数将数据集划分为训练集和测试集。这里,测试集占总数据的20%。
python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
7. 创建决策树分类器实例
初始化一个决策树分类器,并设置random_state
参数以确保结果的可复现性。
python
clf = DecisionTreeClassifier(random_state=42)
8. 训练模型
使用训练集数据训练决策树模型。
python
clf.fit(X_train, y_train)
9. 预测测试集
使用训练好的模型对测试集进行预测。
python
y_pred = clf.predict(X_test)
10. 打印评价报告
最后,使用classification_report
函数打印出模型在测试集上的性能评价报告。
python
print(classification_report(y_test, y_pred))
11. 总代码
python
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
# 数据路径
edible_path = r'Mushroom dataset\Edible'
poisonous_path = r'Mushroom dataset\Poisonous'
# 初始化数据和标签列表,用于存储图片数据和对应的标签。
X = []
y = []
# 遍历 edible_path 目录中的每个文件,读取图片,调整图片大小到 64x64 像素
# 然后将图片展平成一维向量,并将其添加到 X 列表中,同时将标签 "Edible" 添加到 y 列表中。
# 读取可食用蘑菇图片并添加标签
for filename in os.listdir(edible_path):
img_path = os.path.join(edible_path, filename)
image = cv2.imread(img_path)
if image is not None:
image = cv2.resize(image, (64, 64)) # 调整图片大小以保证一致性
image = image.flatten() # 将图片展平成一维向量
X.append(image)
y.append('Edible')
# 读取毒蘑菇图片并添加标签
for filename in os.listdir(poisonous_path):
img_path = os.path.join(poisonous_path, filename)
image = cv2.imread(img_path)
if image is not None:
image = cv2.resize(image, (64, 64)) # 调整图片大小以保证一致性
image = image.flatten() # 将图片展平成一维向量
X.append(image)
y.append('Poisonous')
# 转换为numpy数组
X = np.array(X)
y = np.array(y)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树分类器实例
clf = DecisionTreeClassifier(random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 打印评价报告
print(classification_report(y_test, y_pred))
总结
通过以上步骤,我们成功地使用决策树分类器对蘑菇图片进行了分类。这种方法可以扩展到其他图像分类任务中,只需调整数据路径和相应的处理逻辑即可。决策树是一种简单但有效的分类方法,适合初学者理解和应用。然而,对于更复杂的任务,可能需要更高级的模型,如深度学习模型。