机器学习--支持向量机(通俗版本+demo)

场景

假设我们要在一个在线零售平台上自动区分商品评论是正面的还是负面的。评论中的语言多种多样,且往往含有大量的非结构化文本数据,直接使用简单的规则来分类是非常困难。这时候我们采取支持向量机算法来分类是一个比较好的选择。

支持向量机

支持向量机(SVM)是一种强大的监督学习算法,用于分类和回归分析。其核心思想是找到一个最优的超平面,以此来区分不同类别的数据点。SVM特别适合中小型复杂数据集的分类问题。

在这里插入图片描述
给左右的点使用一条直线划分,明显可以得出,第四个的效果明显比另外两条线好很多。

核心概念

支持向量机(SVM)的心脏部位——最优超平面和核技巧。

最优超平面

想象咱们是一群寻宝者,在宝藏岛上寻找金银财宝。岛上有两个洞穴,一个藏金币,一个藏银币。咱们的目标是用最少的线索找到一条线,能够把金币洞穴和银币洞穴分开。这条线,就是SVM中的最优超平面,它的特点是能最大程度上把两类宝藏分开,让咱们的分类任务清晰又精准。

核技巧 神秘的地图

在海上航行,核函数就像是咱们的神秘地图,能揭示隐藏在平静海面下的秘密通道。通过使用不同的核函数,咱们可以发现数据之间复杂的关系,就像找到了通往宝藏的秘密通道。

线性核:这就像是直接向宝藏岛行驶,适用于宝藏就藏在不远的海岛上的情况。
多项式核:通过提升到高维空间,它可以帮助咱们在看似复杂的海域中找到通向宝藏的路径,适用于宝藏被隐藏得比较深的情况。
径向基(RBF)核,也就是高斯核:这是最强大的一张地图,它能揭示出最隐秘的通道,哪怕宝藏被隐藏在最复杂的地形之下。

惩罚因子 C:调节风帆

想象一下,咱们的船在大海上航行,惩罚因子 C 就像是调节风帆的绳索。如果咱们拉紧绳索(即提高 C 值),风帆会紧绷,船就会更精确地追随风向,尽可能不偏离航线,哪怕是小小的风浪(数据噪声)也想避开。但这样做的风险是,一旦遇到大风浪(过拟合),船可能就控制不住了。如果咱们放松绳索(即降低C 值),风帆会松弛,船虽然不会那么精确追随每一阵风,但在大风浪面前能更灵活地调整,保持航行(避免过拟合),哪怕航线上有点小偏差(允许一些错误分类)。

松弛变量 ξ:接纳乘客的弹性

想象咱们的船只在收容乘客。松弛变量 ξ 就好比是咱们对乘客(数据点)的容纳度。有些乘客可能不完全符合咱们的乘客标准(比如,穿着不整齐的),但为了整体的航行目标(比如,分类的正确性),咱们可以选择稍微放宽标准,容纳他们上船。通过调整松弛变量,咱们可以决定容纳这些不符合标准乘客的程度。但记住,每个不符合标准的乘客都需要支付额外的金币(惩罚),以确保他们尽量不影响航行的整体目标。

指标:航行的星辰

在咱们的航海中,性能指标就像是指引方向的星辰。它们告诉咱们航行的准确性、效率、以及咱们是否正朝着正确的方向前进。常见的指标包括准确率(咱们正确预测的比例)、召回率(在所有正样本中,咱们正确找到的比例),以及F1分数(准确率和召回率的调和平均,用来平衡两者的性能)。

最终目标

通过使用这些工具和参照这些指标,咱们就能在数据的大海中找到通往知识宝藏的路径。记住,选择正确的工具和正确解读指标,是达到目的地的关键!

手写图片识别工具

步骤概览

数据准备:加载图片数据,对数据进行预处理和标准化。
特征提取:将图片转换为适合机器学习模型处理的格式。
训练测试分割:将数据集分为训练集和测试集。
模型训练:使用SVM训练模型。
模型评估:评估模型在测试集上的表现。
参数调优:通过调整SVM参数来优化模型性能。

加载预处理

在这里插入图片描述

def load_images(image_dir, image_size, n_samples):images = np.zeros((n_samples, image_size[0] * image_size[1]))labels = np.zeros(n_samples)for i, file in enumerate(os.listdir(image_dir)[:n_samples]):# 读取图片,转换为灰度img = imread(os.path.join(image_dir, file), as_gray=True)# 调整图片大小img_resized = resize(img, image_size, anti_aliasing=True).flatten()images[i] = img_resizedlabels[i] = get_label_from_filename(file)  # 定义一个函数来从文件名获取标签print(labels[i])return images, labelsdef get_label_from_filename(filename):# 这里应该根据实际情况来实现如何从文件名获取标签return int(filename.split('_')[0])

加载

image_dir = 'mnist_images'  # 图片文件夹路径
image_size = (28, 28)  # 图片大小
n_samples = 100  # 
X, y = load_images(image_dir, image_size, n_samples)

预处理:零均值归一化处理

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

划分测评集

# 首先,分割出训练集和一个临时测试集,这里将20%的数据作为这个临时集合
X_train, X_temp, y_train, y_temp = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# 然后,将这个临时测试集进一步分割为真正的测试集和验证集,这里我们把它们各自占原始数据集的比例设置为10%
X_test, X_val, y_test, y_val = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

我们首先保留了20%的数据作为非训练数据(X_temp, y_temp),这部分数据不会用于模型训练。然后我们把这20%的数据一分为二,一半作为测试集(X_test, y_test),一半作为验证集(X_val, y_val)。这样,训练集、测试集和验证集各自占原始数据集的80%、10%和10%。

模型训练

model = SVC(kernel='rbf', gamma=0.001, C=50)
model.fit(X_train, y_train)

kernel参数指定了SVM内核函数的类型,它用于将输入数据映射到高维空间,‘rbf’,高斯核。用于非线性可分的情况

gamma参数只对’rbf’、'poly’和’sigmoid’核函数有影响。它定义了单个训练样本达到多大程度的远距离影响。具体来说,gamma的值越大,每个样本的影响范围就越小,这会导致决策边界更加复杂,可能导致过拟合。相反,较小的gamma值意味着样本具有更大的影响范围,导致决策边界更加平滑。

C惩罚因子,较小的C值鼓励模型选择更简单的决策边界(边界更平滑),即使这会导致一些训练样本被分类错误。较大的C值会尝试正确分类所有训练样本,即使这意味着决策边界更加复杂,这可能会导致模型过拟合。

模型评估

算召回率(Recall)、精确度(Precision)等指标时,average参数的选择对最终结果有重大影响。
1. average='micro'
作用:先计算模型在所有类别上的总真正例、假正例和假反例,然后用这些总数来计算总体的指标。
应用场景:当你希望指标能反映出被分类为每个类别的样本的比例时,特别适用于样本不平衡的情况。micro方法将所有类别的贡献视为相等,主要关注的是每个样本是否被正确分类。
2. average='macro'
作用:为每个类别单独计算指标,然后计算这些指标的未加权平均值。这意味着所有类别都被视为同等重要,不考虑它们在数据集中的比例。
应用场景:当你认为每个类别都同等重要时,无论它们的样本量大小。这适用于你希望模型在所有类别上表现均衡,即使某些类别的样本数量较少。
3. average='weighted'
作用:为每个类别单独计算指标,然后计算这些指标的加权平均值,权重与每个类别的真实样本数量成比例。这意味着较多样本的类别在总体指标中占有更大的比重。
应用场景:适用于你更关心多数样本的类别,特别是在样本不平衡时。它有助于反映模型在最多数类上的性能表现。
4. average='samples'(仅适用于多标签问题)
作用:计算每个实例的指标,然后取平均。这种方法仅适用于多标签分类问题。
应用场景:当你的任务是多标签分类,即一个样本可以同时属于多个类别时。
# 预测和评估
# 打印验证集上的性能指标
print("性能评估(验证集):")
print(classification_report(y_val, y_val_pred))# 假设基于验证集的评估结果你决定了最终的模型参数
# 现在使用测试集来评估最终模型的性能
y_test_pred = model.predict(X_test)# 打印测试集上的性能指标
print("性能评估(测试集):")
print(classification_report(y_test, y_test_pred))

准确率(Accuracy):准确率是最直观的性能指标,它衡量的是分类正确的样本占总样本数的比例。在处理不平衡数据集时,它可能不是一个好的选择,因为即使模型仅预测数量较多的类别,准确率也可能很高。
召回率(Recall):召回率是在所有实际正类中,被正确预测为正类的比例。它是对模型找回所有正样本能力的衡量。召回率越高,意味着较少的实际正类被漏判为负类。公式为:正确预测为正类的样本数/正类的样本数
精确度(Precision):精确度是在所有预测为正类的样本中,实际为正类的比例。它衡量的是模型预测正类的准确性。在需要确保预测正类的质量较高的应用中,精确度是一个关键的指标。

参数调优

实现自动化调参
对于超参数调整,scikit-learn提供了GridSearchCV和RandomizedSearchCV等工具

全面搜索:GridSearchCV通过遍历给定的参数网格中的所有参数组合来寻找最佳的超参数。这意味着如果你提供了大量的参数和/或参数值,它将尝试这些参数的每一种可能组合。
计算成本:由于需要遍历所有可能的参数组合,所以当参数空间很大时,GridSearchCV可能会非常耗时。
结果:它保证能找到参数空间中的最佳组合(假设在给定的参数网格中)。
使用场景:当参数空间相对较小,且计算资源充足时,使用GridSearchCV比较合适。
RandomizedSearchCV
随机搜索:RandomizedSearchCV通过从指定的参数分布中随机采样参数组合进行搜索。你可以设定一个预算(比如迭代次数),它将在这个预算下随机选择参数组合进行尝试。
计算成本:相比于GridSearchCV,RandomizedSearchCV通常更快,因为它不需要尝试所有可能的参数组合,而是随机选取。
结果:虽然RandomizedSearchCV不能保证找到参数空间中的最佳组合,但在实践中,它往往能够在合理的时间内找到非常好的结果,特别是在某些参数对模型性能的影响远大于其他参数的情况下。
使用场景:当参数空间很大或者计算资源有限时,RandomizedSearchCV是一个更好的选择。

如果你确切知道哪些参数范围是重要的,并且参数空间相对较小,GridSearchCV可以全面地搜索这些参数,以找到最优解。
如果参数空间很大,你想在有限的时间内找到一个“足够好”的解,或者当某些参数对模型性能的影响显著大于其他参数时,RandomizedSearchCV是一个更高效的选择。

# 设置参数网格
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001], 'kernel': ['rbf', 'linear']}# 创建网格搜索对象
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_val, y_val)# 查看最佳参数
# 设置参数网格
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001], 'kernel': ['rbf', 'linear']}
# 创建网格搜索对象,这里我们使用训练集和验证集进行网格搜索
# 注意:可以通过交叉验证在训练集上自动分割出验证集,这样不需要手动分割验证集
grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2, cv=5)
grid.fit(X_train, y_train)
# 查看最佳参数
print("最佳参数:", grid.best_params_)
# 使用找到的最佳参数创建新的SVM模型
best_model = grid.best_estimator_# 首先在验证集上进行评估,验证集用于模型选择和调参,已经通过交叉验证间接使用
y_val_pred = best_model.predict(X_val)
print("性能评估(验证集):")
print(classification_report(y_val, y_val_pred))# 现在使用测试集来评估最终模型的性能
y_test_pred = best_model.predict(X_test)
print("性能评估(测试集):")
print(classification_report(y_test, y_test_pred))

查看结果

训练下来结果如下:

Fitting 5 folds for each of 32 candidates, totalling 160 fits
[CV] END .........................C=0.1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=0.1, gamma=1, kernel=rbf; total time=   0.0s
D:\herche_study\herche_py_study\djongo_demo\Lib\site-packages\sklearn\model_selection\_split.py:737: UserWarning: The least populated class in y has only 4 members, which is less than n_splits=5.warnings.warn(
[CV] END .........................C=0.1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=0.1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=0.1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ......................C=0.1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=0.1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=0.1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=0.1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=0.1, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=0.1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=0.1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=0.1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=0.1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=0.1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ....................C=0.1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=0.1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=0.1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=0.1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=0.1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=0.1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=0.1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=0.1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=0.1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=0.1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ...................C=0.1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=0.1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=0.1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=0.1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=0.1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=0.1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=0.1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=0.1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=0.1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=0.1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ..................C=0.1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=0.1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=0.1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=0.1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=0.1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ...........................C=1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ...........................C=1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ...........................C=1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ...........................C=1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ...........................C=1, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ........................C=1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ........................C=1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ........................C=1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ........................C=1, gamma=1, kernel=linear; total time=   0.0s
[CV] END ........................C=1, gamma=1, kernel=linear; total time=   0.0s
[CV] END .........................C=1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .........................C=1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .........................C=1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .........................C=1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .........................C=1, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ......................C=1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=1, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ........................C=1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ........................C=1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ........................C=1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ........................C=1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ........................C=1, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END .....................C=1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=1, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .......................C=1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .......................C=1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .......................C=1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .......................C=1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .......................C=1, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ....................C=1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ....................C=1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ....................C=1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ....................C=1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ....................C=1, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..........................C=10, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ..........................C=10, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ..........................C=10, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ..........................C=10, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ..........................C=10, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .......................C=10, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=10, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=10, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=10, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=10, gamma=1, kernel=linear; total time=   0.0s
[CV] END ........................C=10, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ........................C=10, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ........................C=10, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ........................C=10, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ........................C=10, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .....................C=10, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END .....................C=10, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END .....................C=10, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END .....................C=10, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END .....................C=10, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END .......................C=10, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END .......................C=10, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END .......................C=10, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END .......................C=10, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END .......................C=10, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ....................C=10, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ....................C=10, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ....................C=10, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ....................C=10, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ....................C=10, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ......................C=10, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ......................C=10, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ......................C=10, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ......................C=10, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ......................C=10, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ...................C=10, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ...................C=10, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ...................C=10, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ...................C=10, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ...................C=10, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END .........................C=100, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=100, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=100, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=100, gamma=1, kernel=rbf; total time=   0.0s
[CV] END .........................C=100, gamma=1, kernel=rbf; total time=   0.0s
[CV] END ......................C=100, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=100, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=100, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=100, gamma=1, kernel=linear; total time=   0.0s
[CV] END ......................C=100, gamma=1, kernel=linear; total time=   0.0s
[CV] END .......................C=100, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=100, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=100, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=100, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END .......................C=100, gamma=0.1, kernel=rbf; total time=   0.0s
[CV] END ....................C=100, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=100, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=100, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=100, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ....................C=100, gamma=0.1, kernel=linear; total time=   0.0s
[CV] END ......................C=100, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=100, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=100, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=100, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ......................C=100, gamma=0.01, kernel=rbf; total time=   0.0s
[CV] END ...................C=100, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=100, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=100, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=100, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END ...................C=100, gamma=0.01, kernel=linear; total time=   0.0s
[CV] END .....................C=100, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=100, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=100, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=100, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END .....................C=100, gamma=0.001, kernel=rbf; total time=   0.0s
[CV] END ..................C=100, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=100, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=100, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=100, gamma=0.001, kernel=linear; total time=   0.0s
[CV] END ..................C=100, gamma=0.001, kernel=linear; total time=   0.0s
最佳参数: {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}
性能评估(验证集):precision    recall  f1-score   support0.0       0.75      1.00      0.86         32.0       0.00      0.00      0.00         13.0       1.00      1.00      1.00         14.0       1.00      1.00      1.00         27.0       1.00      1.00      1.00         28.0       1.00      1.00      1.00         1accuracy                           0.90        10macro avg       0.79      0.83      0.81        10
weighted avg       0.82      0.90      0.86        10性能评估(测试集):
D:\herche_study\herche_py_study\djongo_demo\Lib\site-packages\sklearn\metrics\_classification.py:1471: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior._warn_prf(average, modifier, msg_start, len(result))
D:\herche_study\herche_py_study\djongo_demo\Lib\site-packages\sklearn\metrics\_classification.py:1471: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior._warn_prf(average, modifier, msg_start, len(result))
D:\herche_study\herche_py_study\djongo_demo\Lib\site-packages\sklearn\metrics\_classification.py:1471: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior._warn_prf(average, modifier, msg_start, len(result))precision    recall  f1-score   support0.0       1.00      1.00      1.00         11.0       1.00      1.00      1.00         22.0       1.00      1.00      1.00         13.0       1.00      1.00      1.00         14.0       1.00      1.00      1.00         16.0       1.00      1.00      1.00         17.0       1.00      1.00      1.00         29.0       1.00      1.00      1.00         1accuracy                           1.00        10macro avg       1.00      1.00      1.00        10
weighted avg       1.00      1.00      1.00        10

验证模型

保存模型

model_filename = 'best_model.joblib'
dump(best_model, model_filename)

验证模型,我们下载了100个测试数据在这里插入图片描述

用于验证这个模型的性能:

X,y = load_images('test_images',(28, 28),100)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
loaded_model = load('best_model.joblib')
# 使用加载的模型进行预测
y_pred = loaded_model.predict(X_scaled)
# 计算准确率
print("性能评估(验证集):")
print(classification_report(y, y_pred))

结果是:

性能评估(验证集):precision    recall  f1-score   support0.0       0.80      1.00      0.89         81.0       0.85      0.92      0.88        122.0       0.88      0.50      0.64        143.0       0.83      1.00      0.91        104.0       0.82      0.90      0.86        105.0       0.80      0.50      0.62         86.0       0.78      0.88      0.82         87.0       1.00      0.91      0.95        118.0       1.00      0.71      0.83         79.0       0.71      1.00      0.83        12accuracy                           0.83       100macro avg       0.85      0.83      0.82       100
weighted avg       0.84      0.83      0.82       100

这个性能评估报告提供了模型在验证集上对于一个十类分类问题的详细性能分析。这里的验证集共有100个样本。

各类的表现
类别0至类别9:报告显示了每个类别的精确度(Precision)、召回率(Recall)和F1分数(F1 Score)。精确度衡量的是模型预测为该类别的样本中,实际属于该类别的比例;召回率衡量的是实际属于该类别的样本中,被模型正确预测的比例;F1分数是精确度和召回率的调和平均,用于评价模型的综合性能。类别2和类别5:这两个类别的召回率相对较低(分别为0.50),意味着模型错过了一半实际属于这些类别的样本。类别2的精确度相对较高(0.88),而类别5的精确度(0.80)说明在预测为这个类别的样本中,有20%实际不属于此类。类别8和类别9:尽管这两个类别的精确度非常高(分别为1.00和0.71),但它们的召回率不是很平衡,特别是类别8的召回率只有0.71,意味着有约29%的实际属于类别8的样本被模型错过了。总结
这个模型在多数类别上表现良好,特别是一些类别达到了很高的精确度和召回率。但是,对于某些类别(如类别2和类别5),模型在召回率上的表现不足,这可能指出模型对这些类别的识别存在困难。这可能是由于样本不足、特征不明显或类间差异不大等原因造成的。

结束

(当使用SVC()类创建SVM模型并调用.fit(X_train, y_train)方法进行训练时,SVM算法会自动寻找最大化边界间隔的超平面。这个过程包括确定哪些训练样本作为支持向量,以及如何通过这些支持向量来定义最优的决策边界。这一部分是SVM算法的内部机制,不需要开发者手动实现。间隔是决策边界与最近的训练样本之间的距离,这些最近的样本就是支持向量。SVM模型通过最大化这个间隔来提高模型的泛化能力。在SVC()类中,参数C起到控制误差的权重,间接影响间隔大小的作用。较小的C值允许较大的间隔,提高模型的泛化能力,而较大的C值会尽量减少误分类,但可能导致间隔变小,增加过拟合的风险。)

优点
效果好:在许多实际应用中,特别是在维度较高的数据集上,SVM常常表现出优秀的性能。
泛化能力强:通过最大化间隔,SVM能够提高模型的泛化能力,降低过拟合的风险。
灵活性:通过选择合适的核函数,SVM可以很好地处理线性和非线性数据。

缺点
计算开销:对于大规模数据集,SVM的训练时间可能会比较长。
参数选择:SVM的性能高度依赖于核函数参数(如RBF核的γ)和正则化参数C的选择。不恰当的参数设置可能导致模型过拟合或欠拟合。
结果解释性:与一些简单模型(如决策树)相比,SVM模型的结果解释性较差。

应用
分类任务:SVM最常用于分类问题,尤其是二分类问题。
回归任务:通过引入ε-不敏感损失函数,SVM也可以用于回归任务(称为SVR)。
异常检测:SVM的一个变种可以用于异常检测任务。

支持向量机是一种强大的学习算法,适用于各种机器学习任务。通过合理选择核函数和调整参数,SVM可以在多种数据集上实现高精度的模型性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPA-财务对账邮件应用自动化(客户对账机器人)

《财务对账邮件应用自动化》,将会使用邮箱的SMTP服务,小北把资源包绑定在这篇博客了 Uibot (RPA设计软件)———机器人的小项目友友们可以参考小北的课前材料五博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~) …

MATLAB 自定义生成直线点云(详细介绍) (47)

MATLAB 自定义生成直线点云 (详细介绍)(47) 一、算法介绍二、具体步骤二、算法实现1.代码2.效果一、算法介绍 通过这里的直线生成方法,可以生成模拟直线的点云数据,并通过调整起点、终点、数量和噪声水平等参数来探索不同类型的直线数据。这种方法可以用于测试、验证和开…

【涨薪技术】0到1学会性能测试 —— LR录制回放事务检查点

上一次推文我们分享了性能测试分类和应用领域,今天带大家学习性能测试工作原理、事务、检查点!后续文章都会系统分享干货,带大家从0到1学会性能测试,另外还有教程等同步资料,文末免费获取~ 01、LR工作原理 ​通常我们…

gitee拉取与推送

🌱博客主页:青竹雾色间 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 一,从本地推送项目到gitee1.首先我们在gitee上创建一个仓库2.clone远程仓库到本地3.git的三板斧3.1. add - 将代码添加到本地仓库3.2. commit …

HarmonyOS实战开发-实现Ability内页面间的跳转和数据传递。

介绍 本篇Codelab基于Stage模型下的Ability开发,实现Ability内页面间的跳转和数据传递。 最终效果图如下: 相关概念 页面路由:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、…

UWB辅助RTK如何应对极端环境

1.UWB定位 - UWB(Ultra-Wideband)是一种无线通信技术,其特点是具有较宽的频带,可以提供0.1-0.5m高精度的距离测量。 - UWB定位需要四台基站(每台基站视距间隔50-100米)呈矩形安装部署,以实现…

JHY-31复合电压继电器 额定电压Un=110VDC 板后接线 JOSEF约瑟

用途: JHY-31复合电压继电器使用于电力系统的继电保护线路中,作为各种类型故障的判别元件和电压闭锁元件。 继电器型号名称: 例:辅助直流工作电压为110V的复合电压继电器的订货代号为: JHY-31/110V。 工作原理: 继电器内部具有负…

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…

基于GA遗传优化的离散交通网络双层规划模型设计matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于GA遗传优化的离散交通网络双层规划模型设计.优化输出路段1和路段2的收费情况收敛过程。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序…

Web前端—(原生JS)歌词滚动效果

歌词滚动效果实现 歌词滚动效果HTML部分CSS部分JS部分解析歌词字符串,得到歌词的对象数组计算在当前情况下,播放器播放到第几秒的情况创建歌词元素设置ul元素的偏移量最后对时间变化的事件进行监听完整JS代码 歌词滚动效果 实现效果如图所示&#xff1a…

可重复不限数量结构数列的演化

有一个6*6的平面,这个平面的行和列可以自由的变换,在这个平面上有一个4点结构数列 按照8,13,5,8的顺序排列。让这个数列按照4-5-4的方式演化 这个数列很快收敛,收敛顺序为13,8,8,5 8…

前端小白如何理解mvc mvp mvvm

架构、框架、设计模式是都是啥? 架构:抽象出来不同组织或者对象亦或是简单组件,根据需求和各个单元的功能,进行组合排列。 从而完成系统的运行或者是实现目标。 框架:使用什么样的规则,什么样的开发语言&…

接口自动化测试问题汇总

本篇文章分享几个接口自动化用例编写过程遇到的问题总结,希望能对初次探索接口自动化测试的小伙伴们解决问题上提供一小部分思路。 sql语句内容出现错误 空格:由于有些字段判断是变量,需要将sql拼接起来,但是在拼接字符串时没有…

npm mongoose包下载冲突解决之道

我在新电脑下载完项目代码后,运行 npm install --registryhttps://registry.npm.taobao.org 1运行就报错: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: lowcode-form-backend1.0.0 npm …

Python | 单变量时间序列分析与预测

时间序列数据是机器学习中最具挑战性的任务之一,也是与数据相关的现实问题之一,因为数据实体不仅取决于物理因素,而且主要取决于它们发生的时间顺序。我们可以基于一个单变量特征和两个双变量或多变量特征来预测时间序列中的目标值&#xff0…

合集:JS异步的六个解决方案详解。

Hello,各位老铁,最近发表了js异步的解决方案,是分开发的,这次我把他汇总起来,方便大家收藏、查看,欢迎点赞评论私信交流。 01.详解:JS异步解决方案之回调函数,及其弊端 02.详解&…

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码

全套医院手术麻醉系统源码 人工智能麻醉系统源码 医疗管理系统源码 手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流…

【LV16 day2 平台总线驱动开发---名称匹配】

一、总线、设备、驱动 硬编码式的驱动开发带来的问题: 垃圾代码太多结构不清晰一些统一设备功能难以支持开发效率低下 1.1 初期解决思路:设备和驱动分离 ​ struct device来表示一个具体设备,主要提供具体设备相关的资源(如寄…

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现二

【简单介绍】 基于目标检测算法YOLOv8和灵活的PyQt5界面开发框架,我们精心打造了一款集直观性、易用性和功能性于一体的目标检测GUI界面。通过深度整合YOLOv8在目标识别上的卓越能力与PyQt5的精致界面设计,我们成功研发出一款既高效又稳定的软件GUI。 …

java全排列(力扣Leetcode46)

全排列 力扣原题链接 问题描述 给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2…