阐述网站建设利益,江苏省建设招标网站首页,com网站免费注册,建盏金盏能不能喝茶文章目录
机器学习专栏
介绍
特征缩放
示例代码
硬间隔与软间隔分类
主要代码
代码解释
非线性SVM分类
结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 介绍 作用#xff1a;判别种类 原理#xff1a;找出一个决策边界#xff0c;判断数据所处区域来识别种类 简单…文章目录
机器学习专栏
介绍
特征缩放
示例代码
硬间隔与软间隔分类
主要代码
代码解释
非线性SVM分类
结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 介绍 作用判别种类 原理找出一个决策边界判断数据所处区域来识别种类 简单介绍一下SVM分类的思想我们看下面这张图两种分类都很不错但是我们可以注意到第二种的决策边界与实例更远它们之间的距离比较宽而SVM分类就是一种寻找距每种实例最远的决策边界的算法 特征缩放
SVM算法对特征缩放很敏感不处理算法效果会受很大影响
特征缩放是什么意思呢例如有身高数据和体重数据若身高是m为单位体重是g为单位那么体重就比身高的数值大很多有些机器学习算法就可能更关注某一个值这时我们用特征缩放就可以把数据统一到相同的尺度上
示例代码
from sklearn.preprocessing import StandardScaler
import numpy as np# 创建一个示例数据集
data np.array([[1.0, 2.0, 3.0],[4.0, 5.0, 6.0],[7.0, 8.0, 9.0]])# 创建StandardScaler对象
scaler StandardScaler()# 对数据进行标准化
scaled_data scaler.fit_transform(data)print(原始数据\n, data)
print(\n标准化后的数据\n, scaled_data)# 结果是
# [[-1.22474487 -1.22474487 -1.22474487]
# [ 0. 0. 0. ]
# [ 1.22474487 1.22474487 1.22474487]]StandardScaler是一种数据标准化的方法它对数据进行线性变换使得数据的均值变为0标准差变为1。
解释上面的数据
在每列上进行标准化即对每个特征进行独立的标准化。每个数值是通过减去该列的均值然后除以该列的标准差得到的。
第一列(1−4)/9−1.22474487(1−4)/9−1.22474487(4−4)/90(4−4)/90(7−4)/91.22474487(7−4)/91.22474487。第二列(2−5)/9−1.22474487(2−5)/9−1.22474487(5−5)/90(5−5)/90(8−5)/91.22474487(8−5)/91.22474487。第三列(3−6)/9−1.22474487(3−6)/9−1.22474487(6−6)/90(6−6)/90(9−6)/91.22474487(9−6)/91.22474487。
这样标准化后的数据集就符合标准正态分布每个特征的均值为0标准差为1。 硬间隔与软间隔分类
硬间隔分类就是完全将不同的个体区分在不同的区域不能有一点误差 软间隔分类就是允许一些偏差图中绿和红色的点都有一些出现在了对方的分区里 硬间隔分类往往会出现一些问题例如有时候模型不可能完全分成两类同时硬间隔分类往往可能导致过拟合而软间隔分类的泛化能力就比硬间隔分类好很多 主要代码
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVCmodel Pipeline([(scaler, StandardScaler()),(linear_svc, LinearSVC(C1, losshinge))
])model.fit(x, y) 代码解释
在这里Pipeline的构造函数接受一个由元组组成的列表。每个元组的第一个元素是该步骤的名称字符串第二个元素是该步骤的实例。在这个例子中第一个步骤是数据标准化使用StandardScaler命名为scaler第二个步骤是线性支持向量机使用LinearSVC命名为linear_svc。这两个步骤会按照列表中的顺序依次执行。
参数C是正则程度hinge是SVM分类算法的损失函数用来训练模型 非线性SVM分类
上述方法都是在数据集可线性分离时用到的当数据集呈非线性怎么办我们在回归任务中讲过一个思想用PolynomialFeatures来产生多项式再对每个项进行线性拟合最后结合在一起得出决策边界
具体代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score# 生成非线性数据集
X, y datasets.make_circles(n_samples100, factor0.5, noise0.1, random_state42)# 划分训练集和测试集
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)# 使用多项式特征和线性SVM
degree 3 # 多项式的次数
svm_classifier make_pipeline(StandardScaler(), PolynomialFeatures(degree), SVC(kernellinear, C1))
svm_classifier.fit(X_train, y_train)# 预测并计算准确率
y_pred svm_classifier.predict(X_test)
accuracy accuracy_score(y_test, y_pred)
print(Accuracy:, accuracy)# 绘制决策边界
def plot_decision_boundary(X, y, model, ax):h .02x_min, x_max X[:, 0].min() - 1, X[:, 0].max() 1y_min, y_max X[:, 1].min() - 1, X[:, 1].max() 1xx, yy np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z model.predict(np.c_[xx.ravel(), yy.ravel()])Z Z.reshape(xx.shape)ax.contourf(xx, yy, Z, alpha0.8)ax.scatter(X[:, 0], X[:, 1], cy, edgecolorsk, markero, s80, linewidth0.5)ax.set_xlim(xx.min(), xx.max())ax.set_ylim(yy.min(), yy.max())# 绘制结果
fig, ax plt.subplots(figsize(8, 6))
plot_decision_boundary(X_train, y_train, svm_classifier, ax)
ax.set_title(Polynomial SVM Decision Boundary)
plt.show()运行结果 结语
SVM分类是一种经典的分类算法也叫大间隔分类算法。它可以用来线性分类也可以非线性分类可以与PolynomialFeatures结合当然还有其他方法我们之后再说