产品做优化好还是超级网站好,代理网页 国外,wordpress 文章翻页,建设青岛公司网站SVM#xff0c;即支持向量机#xff08;Support Vector Machine#xff09;#xff0c;是一种常见的机器学习算法#xff0c;用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中#xff0c;在该空间中找到一个最优的超平面#xff0c;将不同类别的数据点分开… SVM即支持向量机Support Vector Machine是一种常见的机器学习算法用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中在该空间中找到一个最优的超平面将不同类别的数据点分开。这个最优的超平面可以最大化不同类别数据点之间的间隔从而使得分类的边界更加鲁棒和稳定。在实际应用中SVM的核函数可以使用不同的变换包括线性核、多项式核和径向基函数RBF核等以适应不同的数据类型和特征空间。SVM算法在分类和回归问题上都具有很好的表现并且具有较强的泛化能力和鲁棒性。 SVM本身是一个二值分类器最初是为二分类问题设计的也就是回答Yes或者是No。而实际上我们要解决的问题可能是多分类的情况比如对文本进行分类或者对图像进行识别。针对这种情况我们可以将多个二分类器组合起来形成一个多分类器常见的方法有“一对多法”和“一对一法”两种。
1.一对多法
假设我们要把物体分成A、B、C、D四种分类那么我们可以先把其中的一类作为分类1其他类统一归为分类2。这样我们可以构造4种SVM分别为以下的情况
1样本A作为正集BCD作为负集
2样本B作为正集ACD作为负集
3样本C作为正集ABD作为负集
4样本D作为正集ABC作为负集。
这种方法针对K个分类需要训练K个分类器分类速度较快但训练速度较慢因为每个分类器都需要对全部样本进行训练而且负样本数量远大于正样本数量会造成样本不对称的情况而且当增加新的分类比如第K1类时需要重新对分类器进行构造。
2.一对一法
一对一法的初衷是想在训练的时候更加灵活。我们可以在任意两类样本之间构造一个SVM这样针对K类的样本就会有C(k,2)类分类器。
比如我们想要划分A、B、C三个类可以构造3个分类器
1分类器1A、B
2分类器2A、C
3分类器3B、C。
当对一个未知样本进行分类时每一个分类器都会有一个分类结果即为1票最终得票最多的类别就是整个未知样本的类别。这样做的好处是如果新增一类不需要重新训练所有的SVM只需要训练和新增这一类样本的分类器。而且这种方式在训练单个SVM模型的时候训练速度快。上面介绍了SVM的相关概念在实际应用中如果要使用SVM完成分类问题实际包含5步骤 收集数据收集用于分类的数据集并将每个数据点标记为其相应的类别。 特征选择和数据预处理选择用于分类的特征对数据进行预处理如归一化、缩放或标准化等以便在训练模型之前使数据更具有可比性和可解释性。 分割训练集和测试集将数据集分为训练集和测试集以便训练模型并评估其性能。 训练模型使用训练集训练SVM模型并选择适当的核函数和参数。 模型评估使用测试集评估模型的性能并根据需要调整模型参数和核函数。 应用模型使用训练好的SVM模型对新数据进行分类预测其类别并根据预测结果进行相应的决策或操作。
下面是使用Skitlearn提供的函数采用SVM模型完成分类任务的demo代码。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline# Load the iris dataset
iris datasets.load_iris()# Split the data into training and testing sets
X_train, X_test, y_train, y_test train_test_split(iris.data,iris.target,test_size0.3,random_state42)# Create a pipeline that standardizes the data and applies an RBF kernel SVM
pipeline make_pipeline(StandardScaler(), SVC(kernelrbf))# Train the pipeline on the training data
pipeline.fit(X_train, y_train)# Use the trained pipeline to make predictions on the testing data
y_pred pipeline.predict(X_test)# Calculate the accuracy of the pipeline
accuracy accuracy_score(y_test, y_pred)print(fAccuracy: {accuracy})
在上面的demo代码中make_pipeline(StandardScaler, SVC(kernelrbf))中传入的核函数SVC是Support Vector Classification的缩写SVC的构造函数model svm.SVC(kernel‘rbf’, C1.0, gamma‘auto’)这里有三个重要的参数kernel、C和gamma。kernel代表核函数的选择它有四种选择只不过默认是rbf即高斯核函数。 linear线性核函数 poly多项式核函数 rbf高斯核函数默认 sigmoidsigmoid核函数
这四种函数代表不同的映射方式线性核函数是在数据线性可分的情况下使用的运算速度快效果好。不足在于它不能处理线性不可分的数据。多项式核函数可以将数据从低维空间映射到高维空间但参数比较多计算量大。高斯核函数同样可以将样本映射到高维空间但相比于多项式核函数来说所需的参数比较少通常性能不错所以是默认使用的核函数。sigmoid经常用在神经网络的映射中。因此当选用sigmoid核函数时SVM实现的是多层神经网络。
上面的Demo是比较简单的一个例子下面再来看一个稍微复杂的Demo例子。下面这个例子多了数据处理和特征选择的过程相比较上面的例子最终还是生成一份特性矩阵和lable的数据。
# -*- coding: utf-8 -*-
# 乳腺癌诊断分类
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler# 加载数据集你需要把数据放到目录中
data pd.read_csv(./breast_cancer_data/data.csv)# 数据探索
# 因为数据集中列比较多我们需要把dataframe中的列全部显示出来
pd.set_option(display.max_columns, None)
print(data.columns)
print(data.head(5))
print(data.describe())# 将特征字段分成3组
features_mean list(data.columns[2:12])
features_se list(data.columns[12:22])
features_worst list(data.columns[22:32])# 数据清洗
# ID列没有用删除该列
data.drop(id, axis1, inplaceTrue)
# 将B良性替换为0M恶性替换为1
data[diagnosis] data[diagnosis].map({M: 1, B: 0})# 将肿瘤诊断结果可视化
sns.countplot(data[diagnosis], labelCount)
plt.show()
# 用热力图呈现features_mean字段之间的相关性
corr data[features_mean].corr()
plt.figure(figsize(14, 14))
# annotTrue显示每个方格的数据
sns.heatmap(corr, annotTrue)
plt.show()# 特征选择
features_remain [radius_mean, texture_mean, smoothness_mean, compactness_mean,symmetry_mean, fractal_dimension_mean
]# 抽取30%的数据作为测试集其余作为训练集
train, test train_test_split(data,test_size0.3) # in this our main data is splitted into train and test
# 抽取特征选择的数值作为训练和测试数据
train_X train[features_remain]
train_y train[diagnosis]
test_X test[features_remain]
test_y test[diagnosis]# 采用Z-Score规范化数据保证每个特征维度的数据均值为0方差为1
ss StandardScaler()
train_X ss.fit_transform(train_X)
test_X ss.transform(test_X)# 创建SVM分类器
model svm.SVC()
# 用训练集做训练
model.fit(train_X, train_y)
# 用测试集做预测
prediction model.predict(test_X)
print(准确率: , metrics.accuracy_score(prediction, test_y))
原始数据Data.csv是一份检测乳腺癌特征值的数据其中Diagnosis为M表示阳性为B表示阴性。 后面的字段都是特征值每种特征值包含mean,se,worst三种情况上面的demo代码中选取了mean作为特性字段对数据进行降维处理。