Python SVM多分类实践:鸢尾花数据集与scikit-learn库

0 下载量 16 浏览量 更新于2024-08-03 收藏 1KB MD 举报
"本文将介绍如何使用支持向量机(SVM)进行多类分类,具体是通过Python的scikit-learn库实现。我们将以鸢尾花数据集为例,展示如何划分训练集和测试集,配置SVM模型,以及评估模型的准确性。" 支持向量机(Support Vector Machine,简称SVM)是一种强大的监督学习算法,广泛应用于二分类和多分类任务。SVM的基本思想是找到一个最优超平面,使不同类别之间的间隔最大化,从而达到良好的泛化能力。 在多类分类问题中,一种常见的方法是“一对余”(One-Vs-Rest,OVR)策略,也称为一对一(One-Vs-One,OVO)。OVR方法中,对于k个类别,我们会训练k个二分类器,每个分类器都将一个类别与其他所有类别区分开。预测时,根据每个分类器的结果,选择得票最多的类别作为最终预测。 在给出的代码示例中,首先导入了必要的库,包括scikit-learn的`datasets`和`model_selection`模块,以及SVM分类器。接着,加载了经典的鸢尾花数据集,这是一个多分类问题,包含三个类别。然后,使用`train_test_split`函数将数据集划分为训练集和测试集,比例为70%训练,30%测试,随机种子设为0以确保可复现性。 在训练SVM模型时,选择了线性内核(`kernel='linear'`),这是因为线性内核在数据线性可分时效果良好,且计算效率高。同时,设置了`C=1`作为正则化参数,控制模型的复杂度,防止过拟合。`decision_function_shape='ovr'`参数表示采用OVR策略进行多分类。 模型训练完成后,使用`predict`方法对测试集进行预测,并通过`score`方法评估模型的准确性,这里的准确率是指分类正确的样本占总测试样本的比例。 值得注意的是,SVM还有其他内核可供选择,如多项式、高斯核(RBF)等,每种内核适用于不同类型的数据分布。通过调整内核类型和参数(如RBF的gamma参数),可以优化模型性能。此外,还可以通过交叉验证、网格搜索等方法寻找最佳超参数组合,以提高模型的泛化能力。 SVM是一种强大的机器学习工具,尤其在处理小样本、高维数据时表现出色。理解并掌握SVM的原理和应用,以及如何在实际问题中调整参数,是解决分类问题的关键步骤。

import cv2 import numpy as np import os # 提取图像的HOG特征 def get_hog_features(image): hog = cv2.HOGDescriptor() hog_features = hog.compute(image) return hog_features # 加载训练数据集 train_data = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128"] train_labels = [r"I:\18Breakageratecalculation\SVM run\detection_cut\whole\train128\labels.txt"] num_samples = 681 for i in range(num_samples): img = cv2.imread(str(i).zfill(3)+'.jpg') hog_features = get_hog_features(image) hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) color_hist = cv2.calcHist([hsv_image], [0, 1], None, [180, 256], [0, 180, 0, 256]) color_features = cv2.normalize(color_hist, color_hist).flatten() train_data.append(hog_features) train_labels.append(labels[i]) # 训练SVM模型 svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_LINEAR) svm.train(np.array(train_data), cv2.ml.ROW_SAMPLE, np.array(train_labels)) # 对测试图像进行分类 test_image = cv2.imread('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\maskslic2_roi.png', 0) test_features = get_hog_features(test_image) result = svm.predict(test_features.reshape(1,-1)) # 显示分割结果 result_image = np.zeros(test_image.shape, np.uint8) for i in range(test_image.shape[0]): for j in range(test_image.shape[1]): if result[i,j] == 1: result_image[i,j] = 255 cv2.imshow('I:\18Breakageratecalculation\mask-slic use\maskSLIC-master\result\split\result2\Result.png', result_image) cv2.waitKey(0) cv2.destroyAllWindows()

2023-06-09 上传
2023-06-06 上传