目录
一、机器学习建模的步骤
实际业务中的机器学习建模,通常考虑以下一个环节:
- 问题的抽象与理解
- 数据的准备和预处理
- 各种机器学习算法的检讨
- 不同算法结果的分析与对比
- 模型的选择与调优
二、图像的分类问题
图像的分类问题,最终目标是根据图像在颜色,像素强度等方面的特征,和已经标注好的图像分类名称进行机器学习的建模,在可以接受的准确率范围内,运用构建的模型对没有标注分类名称的图像进行分类的预测。
关于图像分类问题的数据,通常是非结构化的数据集,而是要通过一定的方法,对图像的信息进行一定规则的提取,也就是特征提取,在此基础上进行建模。我们在这里选择一个公开的图像资源进行图像分类的建模,数据可以根据以下的链接进行下载。完整的图像有8个场景,我们这里只选用其中的三个场景的一部分图像作为示例。
图像数据可通过以下链接下载
http://people.csail.mit.edu/torralba/code/spatialenvelope/
图像的分类本质上也是机器学习典型的分类问题,考虑K近邻,朴素贝叶斯,逻辑回归,SVC,决策树,随机森林,前馈神经网络(多层感知机)这些常用的算法,将数据划分为训练集和测试集,根据各算法在测试集上的结果表现,进行对比,最终选出性能相对优良的算法进行建模和调优。
三、基于图像分类的建模
1. 环境准备
本案例中,除了调用算法的类库sklearn,还会用到专门用于处理图像的类库pillow, imutils
以及数据计算的标准类库numpy
可以根据需要进行安装
$ pip install numpy
$ pip install scikit-learn
$ pip install pillow
$ pip install opencv-contrib-python
$ pip install imutils
2. 数据集
对图像的特征提取,我们这里考虑统计图像颜色RGB三个通道的均值和标准差两个指标信息,共计六个特征,作为建模的特征变量,同时,根据图像的名称,截取图像场景描述的部分,作为模型的标签(响应变量)。
3. 选用的算法
从常规的机器学习分类算法中选取以下算法,进行建模和结果对比
K近邻
朴素贝叶斯
逻辑回归
SVC
决策树
随机森林
前馈神经网络(多层感知机)
4. 数据建模
## 导入工具库
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os
import warnings
warnings.simplefilter("ignore")
## 抽取图像特征
def extract_color_stats(image):
'''
将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回
:param image:
:return:
'''
(R, G, B) = image.split()
features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]
return features
## 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
help="path to directory containing the '3scenes' dataset")
ap.add_argument("-m", "--model", type=str, default="knn",
help="type of python machine learning model to use")
args = vars(ap.parse_args())
## 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
"knn": KNeighborsClassifier(n_neighbors=1),
"naive_bayes": GaussianNB(),
"logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
"svc": SVC(kernel="rbf", gamma="auto"),
"decision_tree": DecisionTreeClassifier(),
"random_forest": RandomForestClassifier(n_estimators=100),
"mlp": MLPClassifier()
}
## 加载数据并提取特征
print("抽取图像特征中...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []
## 循环遍历所有的图片数据
for imagePath in imagePaths:
# 加载图片,然后计算图片的颜色通道统计信息
image = Image.open(imagePath)
features = extract_color_stats(image)
data.append(features)
# 保存图片的标签信息
label = imagePath.split(os.path.sep)[-1].split('_')[0]
labels.append(label)
## 对标签进行编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)
## 进行训练集和测试集的划分,80%数据作为训练集,其余20%作为测试集
trainX, testX, trainY, testY = train_test_split(data, labels, random_state=3, test_size=0.2)
## print('trainX numbers={}, testX numbers={}'.format(len(trainX), len(testX)))
modelList = ["knn", "naive_bayes", "logit", "svc", "decision_tree", "random_forest", "mlp"]
for modelName in modelList:
args["model"] = modelName
## 训练模型
print("[应用 '{}' 模型建模".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)
## 预测并输出分类结果报告
print("模型评估")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=le.classes_))
5. 结果对比
结果中的precision, recall, f1-score, support分别对应 准确率,召回率,F1得分,测试集的样本数量。
详细的定义,可以参考以下文章中的分类模型评价部分。
https://blog.csdn.net/JasonH2021/article/details/131138612
[应用 'knn' 模型建模
模型评估
precision recall f1-score support
coast 0.76 0.76 0.76 68
forest 0.81 0.83 0.82 66
highway 0.74 0.71 0.73 56
accuracy 0.77 190
macro avg 0.77 0.77 0.77 190
weighted avg 0.77 0.77 0.77 190
[应用 'naive_bayes' 模型建模
模型评估
precision recall f1-score support
coast 0.79 0.44 0.57 68
forest 0.64 0.82 0.72 66
highway 0.66 0.79 0.72 56
accuracy 0.67 190
macro avg 0.69 0.68 0.67 190
weighted avg 0.70 0.67 0.66 190
[应用 'logit' 模型建模
模型评估
precision recall f1-score support
coast 0.70 0.84 0.76 68
forest 0.84 0.89 0.87 66
highway 0.84 0.57 0.68 56
accuracy 0.78 190
macro avg 0.79 0.77 0.77 190
weighted avg 0.79 0.78 0.77 190
[应用 'svc' 模型建模
模型评估
precision recall f1-score support
coast 0.36 1.00 0.53 68
forest 1.00 0.02 0.03 66
highway 0.00 0.00 0.00 56
accuracy 0.36 190
macro avg 0.45 0.34 0.19 190
weighted avg 0.48 0.36 0.20 190
[应用 'decision_tree' 模型建模
模型评估
precision recall f1-score support
coast 0.74 0.74 0.74 68
forest 0.74 0.76 0.75 66
highway 0.70 0.68 0.69 56
accuracy 0.73 190
macro avg 0.72 0.72 0.72 190
weighted avg 0.73 0.73 0.73 190
[应用 'random_forest' 模型建模
模型评估
precision recall f1-score support
coast 0.78 0.76 0.77 68
forest 0.76 0.88 0.82 66
highway 0.87 0.73 0.80 56
accuracy 0.79 190
macro avg 0.80 0.79 0.79 190
weighted avg 0.80 0.79 0.79 190
[应用 'mlp' 模型建模
模型评估
precision recall f1-score support
coast 0.78 0.72 0.75 68
forest 0.89 0.82 0.85 66
highway 0.67 0.79 0.72 56
accuracy 0.77 190
macro avg 0.78 0.77 0.77 190
weighted avg 0.78 0.77 0.78 190
6. 模型选择与调优
从不同算法在测试集上的表现来看,就综合/平均准确率(weighted avg - percision)而言,
K近邻 77%
贝叶斯 70%
逻辑回归 79%
SVC 48%
决策树 73%
随机森林 80%
前馈神经网络 78%
其中,随机森林,逻辑回归, 前馈神经网络的表现相对较好,准确率在78%以上,但还不足以满足现实业务的需求水平,
从结果上也反映了传统的机器学习算法在图像处理上的局限性。(对超参数和数据集进行优化,可以一定程度上提高准确率)
实际上针对图像问题的处理,深度学习会有更大的优越性,后续会通过深度学习的卷积神经网络解决同样的图像分类任务。
四、小结
本文简单介绍了图像分类问题的建模步骤,图像的特征提取,sklearn的调用方法,以及模型的评价等。