辽宁千山科技做网站怎么样,设计网名的软件,淄博网站建设小程序,女生适合学计算机的哪个专业SVM#xff08;Support Vector Machine#xff0c;支持向量机#xff09;是一种非常常用并且有效的监督学习算法#xff0c;在许多领域都有广泛应用。它可以用于二分类问题和多分类问题#xff0c;并且在处理高维数据和特征选择方面非常强大。SVM算法的核心思想是通过找到… SVMSupport Vector Machine支持向量机是一种非常常用并且有效的监督学习算法在许多领域都有广泛应用。它可以用于二分类问题和多分类问题并且在处理高维数据和特征选择方面非常强大。SVM算法的核心思想是通过找到一个超平面来最大化最小边界的方式进行分类即找到一个能够将两类数据分开并且最大化边界的超平面。对于线性可分的情况SVM通过找到离超平面最近的数据点即支持向量计算出决策边界的法向量从而得到分类结果。对于线性不可分的情况可以通过引入松弛变量和核技巧来实现非线性的分类。 以线性可分的情况为例假设训练数据集为 ( x i , y i ) , i 1 , 2 , . . . , n (x_i, y_i), i1,2,...,n (xi,yi),i1,2,...,n其中 x i ∈ R d , y i ∈ { − 1 , 1 } x_i \in R^d, y_i \in \{-1,1\} xi∈Rd,yi∈{−1,1}。我们的目标是找到最优的超平面 W T x b 0 W^Tx b 0 WTxb0使得对于正例 y i 1 y_i1 yi1有 W T x i b ≥ 1 W^Tx_i b \geq 1 WTxib≥1对于反例 y i − 1 y_i-1 yi−1有 W T x i b ≤ − 1 W^Tx_i b \leq -1 WTxib≤−1。我们可以通过最小化目标函数来求解 W W W和 b b b min W , b 1 2 ∣ ∣ W ∣ ∣ 2 \min_{W,b} \frac{1}{2} ||W||^2 W,bmin21∣∣W∣∣2 约束条件为 y i ( W T x i b ) ≥ 1 , ∀ i y_i(W^Tx_i b) \geq 1, \forall i yi(WTxib)≥1,∀i通过求解上述问题我们可以得到最优的超平面从而进行分类预测。 计算过程 导入所需的库和数据集数据预处理标准化拆分训练集和测试集构建SVM模型并进行训练对测试集进行预测评估模型性能可视化预测结果 from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import r2_score
import numpy as np
import pandas as pd
data_url http://lib.stat.cmu.edu/datasets/boston
raw_df pd.read_csv(data_url, sep\s, skiprows22, headerNone)
data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target raw_df.values[1::2, 2]
s StandardScaler()
ds s.fit_transform(data)
x_tr,x_te,y_tr,y_te train_test_split(ds,target,test_size0.2,random_state2023)
svr_net SVR(kernellinear)
svr_net.fit(x_tr,y_tr)
y_p svr_net.predict(x_te)
r2 r2_score(y_te,y_p)
print(r2)
# 可视化预测结果
from matplotlib import pyplot as plt
plt.scatter(range(len(y_te)), y_te, colorb, labelActual)
plt.plot(range(len(y_p)), y_p, colorr, labelPredicted)
plt.xlabel(Sample)
plt.ylabel(Price)
plt.title(SVM Regression)
plt.legend()
plt.show()sklearn.svm.SVC(C1.0, kernelrbf, degree3, gammaauto, coef00.0, shrinkingTrue, probabilityFalse, tol0.001, cache_size200, class_weightNone, verboseFalse, max_iter-1, decision_function_shapeovr, random_stateNone)C表示错误项的惩罚系数C越大即对分错样本的惩罚程度越大因此在训练样本中准确率越高但是泛化能力降低相反减小C的话容许训练样本中有一些误分类错误样本泛化能力强。对于训练样本带有噪声的情况一般采用后者把训练样本集中错误分类的样本作为噪声。 kernel该参数用于选择模型所使用的核函数算法中常用的核函数有-- linear线性核函数**-- poly**多项式核函数–rbf径像核函数/高斯核–sigmodsigmod核函数–precomputed核矩阵该矩阵表示自己事先计算好的输入后算法内部将使用你提供的矩阵进行计算 degree该参数只对’kernelpoly’(多项式核函数)有用是指多项式核函数的阶数n如果给的核函数参数是其他核函数则会自动忽略该参数。 cache_size该参数表示指定训练所需要的内存以MB为单位默认为200MB。 verbose该参数表示是否启用详细输出。此设置利用libsvm中的每个进程运行时设置如果启用可能无法在多线程上下文中正常工作。一般情况都设为False不用管它。 max_iter该参数表示最大迭代次数如果设置为-1则表示不受限制。 class_weight该参数表示给每个类别分别设置不同的惩罚参数C如果没有给则会给所有类别都给C1即前面参数指出的参数C。如果给定参数‘balance’则使用y的值自动调整与输入数据中的类频率成反比的权重。 svc.n_support_各类各有多少个支持向量svc.support_各类的支持向量在训练样本中的索引svc.support_vectors_各类所有的支持向量。 sklearn.svm.SVRkernel rbfdegree 3gamma auto_deprecatedcoef0 0.0
tol 0.001C 1.0epsilon 0.1shrinking Truecache_size 200verbose Falsemax_iter -1 kernel:可以是 ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 或者自己指定。 默认使用‘rbf’ 。 coef0:kernel函数的常数项。 只有在 kernel为‘poly’或‘sigmoid’时有效默认为0。 tol误差项达到指定值时则停止训练默认为1e-3即0.001。 shrinking如果能预知哪些变量对应着支持向量则只要在这些样本上训练就够了其他样本可不予考虑这不影响训练结果但降低了问题的规模并有助于迅速求解。进一步如果能预知哪些变量在边界上(即aC)则这些变量可保持不动只对其他变量进行优化从而使问题的规模更小训练时间大大降低。这就是Shrinking技术。 Shrinking技术基于这样一个事实支持向量只占训练样本的少部分并且大多数支持向量的拉格朗日乘子等于C 通过非线性支持向量机Nonlinear Support Vector Machine简称非线性SVM来建立一个房价预测模型。非线性SVM是支持向量机的一种拓展通过处理非线性可分数据提高模型的拟合能力。与线性SVM不同的是非线性SVM引入了核函数kernel function将原始数据映射到一个高维特征空间从而使得原本非线性可分的问题变为线性可分的问题。常用的核函数有线性核、多项式核和径向基函数Radial Basis Function简称RBF核。对于非线性SVM的目标函数我们需要优化其参数并通过解决一个凸优化问题来求解。同时我们也需要对求解后的模型进行预测来实现回归或分类任务。 核函数的基本思想是通过构造一个映射函数将样本从原始特征空间转换到一个更高维的特征空间在高维特征空间中使用线性SVM进行分类或回归。常见的核函数有多项式核和RBF核。其中多项式核将数据映射到多项式特征空间而RBF核通过计算样本点和支持向量之间的相似度来构造高维特征空间。 给定训练样本集 { ( x i , y i ) } i 1 N \{(\mathbf{x}_i, y_i)\}_{i1}^N {(xi,yi)}i1N其中 x i ∈ R d y i ∈ { − 1 , 1 } \mathbf{x}_i \in \mathbb{R}^dy_i \in \{-1, 1\} xi∈Rdyi∈{−1,1}代表样本点和样本标签。线性支持向量机的目标是找到一个最优的超平面将不同类别的样本点分开。我们可以通过最小化以下目标函数来求解线性SVM的模型参数 min w , b 1 2 ∥ w ∥ 2 C ∑ i 1 N max ( 0 , 1 − y i ( w T x i b ) ) \min_{\mathbf{w}, b} \frac{1}{2}\|\mathbf{w}\|^2 C\sum_{i1}^N \max(0, 1-y_i(\mathbf{w}^T\mathbf{x}_i b)) w,bmin21∥w∥2Ci1∑Nmax(0,1−yi(wTxib)) 其中 w \mathbf{w} w和 b b b分别代表超平面的法向量和截距 C C C是一个正则化超参数。 非线性SVM的核心思想是将原始样本数据映射到一个高维特征空间通过高维特征空间中的线性SVM来实现对非线性数据的拟合。给定核函数 K ( x i , x j ) K(\mathbf{x}_i, \mathbf{x}_j) K(xi,xj)它可以计算 x i \mathbf{x}_i xi和 x j \mathbf{x}_j xj之间的相似度。我们可以通过核函数将输入样本映射到高维特征空间中。在高维特征空间中非线性SVM的原始目标函数为 min w , b 1 2 ∥ w ∥ 2 C ∑ i 1 N max ( 0 , 1 − y i ( w T ϕ ( x i ) b ) ) \min_{\mathbf{w}, b} \frac{1}{2}\|\mathbf{w}\|^2 C\sum_{i1}^N \max(0, 1-y_i(\mathbf{w}^T\phi(\mathbf{x}_i) b)) w,bmin21∥w∥2Ci1∑Nmax(0,1−yi(wTϕ(xi)b)) 其中 ϕ ( x ) \phi(\mathbf{x}) ϕ(x)表示核函数将 x \mathbf{x} x映射到高维特征空间的结果。 计算流程 导入数据集并进行数据预处理将数据集划分为训练集和测试集使用非线性SVM建立回归模型模型训练和参数优化模型预测和性能评估 原理SVR在线性函数两侧制造了一个“间隔带”间距为ϵ (也叫容忍偏差是一个由人工设定的经验值)对所有落入到间隔带内的样本不计算损失也就是只有支持向量才会对其函数模型产生影响最后通过最小化总损失和最大化间隔来得出优化后的模型。数据在间隔带内则不计算损失当且仅当f(x)与y之间的差距的绝对值大于ϵ 才计算损失通过最大化间隔带的宽度与最小化总损失来优化模型 import numpy as np
import pandas as pd
data_url http://lib.stat.cmu.edu/datasets/boston
raw_df pd.read_csv(data_url, sep\s, skiprows22, headerNone)
data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target raw_df.values[1::2, 2]
from sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest train_test_split(data,target,test_size0.2,random_state2023)
from sklearn.svm import SVR
svr SVR(kernelrbf)
svr.fit(xtrain,ytrain)
y_pre svr.predict(xtest)
from sklearn.metrics import r2_score
r2 r2_score(ytest,y_pre)
print(r2)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipe Pipeline([(scaler, StandardScaler()), (regressor, SVR(kernelrbf, C1e3, gamma0.1))])
pipe.fit(xtrain,ytrain)
ypr pipe.predict(xtest)
r21 r2_score(ytest,ypr)
print(r21)
import yaml
# print(type(pipe.get_params()))
# print(pipe.get_params())
# print(yaml.dump(pipe.get_params()))
param_grid {regressor__C: [0.1, 1, 10, 100, 1000],regressor__kernel: [poly, rbf, sigmoid],regressor__gamma: [1e-7, 1e-4, 1e-3, 1e-2]}
from sklearn.model_selection import GridSearchCV
gs GridSearchCV(pipe, param_grid, n_jobs-1, verbose1)
gs.fit(xtrain, ytrain)
yp gs.predict(xtest)
r22 r2_score(ytest,yp)
print(r22)
print(gs.best_estimator_)
print(gs.best_score_)
# 绘制预测结果和真实值曲线
from matplotlib import pyplot as plt
plt.scatter(range(len(ytest)), ytest, colorb, labeltrue)
plt.plot(range(len(ytest)), yp, colorr, labelpredicted)
plt.xlabel(Sample Index)
plt.ylabel(House Price)
plt.legend()
plt.show()GridSearchCV它存在的意义就是自动调参只要把参数输进去就能给出最优化的结果和参数。但是这个方法适合于小数据集一旦数据的量级上去了很难得出结果。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法拿当前对模型影响最大的参数调优直到最优化再拿下一个影响最大的参数调优如此下去直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优但是省时间省力巨大的优势面前还是试一试吧后续可以再拿bagging再优化。调参的要旨是每次调一个或两个超参数然后将找到的最优超参数代入到模型中继续调余下的参数。 class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoringNone, fit_paramsNone, n_jobs1, iidTrue, refitTrue, cvNone, verbose0, pre_dispatch‘2*n_jobs’, error_score’raise’, return_train_score’warn’)
##
sklearn.model_selection.GridSearchCV(
estimator,
param_grid,
scoringNone,n_jobsNone,iid’warn’,
refitTrue,
cv’warn’,
verbose0,
pre_dispatch‘2*n_jobs’,
error_score’raise-deprecating’,
return_train_scoreFalse)estimator选择使用的分类器并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数或者score方法estimatorRandomForestClassifier(min_samples_split100,min_samples_leaf20,max_depth8,max_features‘sqrt’,random_state10),param_grid需要最优化的参数的取值值为字典或者列表例如param_grid {‘n_estimators’:range(10,71,10)}。scoringNone根据所选模型不同评价准则不同。比如scoring”accuracy”。Classification【‘accuracy’‘average_precision’‘f1’‘f1_micro’‘f1_macro’‘f1_weighted’‘f1_samples’‘neg_log_loss’‘roc_auc’‘recall’ ‘precision’ 】Clustering【‘adjusted_rand_score’】Regression【‘neg_mean_absolute_error’‘neg_mean_squared_error’‘neg_median_absolute_error’‘r2’】n_jobs1 进程个数默认为1。 若值为 -1则用所有的CPU进行运算。 若值为1则不进行并行运算这样的话方便调试。iidTrue默认True,为True时默认为各个样本fold概率分布一致误差估计为所有样本之和而非各个fold的平均。refitTrue默认为True,程序将会以交叉验证训练集得到的最佳参数重新对所有可用的训练集与开发集进行作为最终用于性能评估的最佳模型参数。即在搜索参数结束后用最佳参数结果再次fit一遍全部数据集。cvNone交叉验证参数默认None使用三折交叉验证。pre_dispatch‘2*n_jobs’指定总共分发的并行任务数。当n_jobs大于1时数据将在每个运行点进行复制这可能导致OOM而设置pre_dispatch参数则可以预先划分总共的job数量使数据最多被复制pre_dispatch次。 多类别支持向量机是通过将多个二分类问题相互比较来进行多类别分类的。一种常用的方法是一对一One-vs-One策略在该策略下每个类别之间都有一个分类器。假设有K个类别那么将会有K * (K-1) / 2个分类器。每个分类器只关注其两个类别之一对于属于其中一个类别的样本将其标记为正例而对于属于另一个类别的样本将其标记为负例。最后使用投票机制来确定对新样本的分类结果即选择获得最多正例标签的类别作为最终的分类结果。 在MC-SVM中我们可以使用与二分类SVM类似的方法来训练分类器。对于每对类别之间的二分类任务我们通过最小化带有正则化项的目标函数来找到一个最优的超平面。 min w , b 1 2 w T w C ∑ i 1 n ξ i \min_{w,b} \frac{1}{2}w^Tw C\sum_{i1}^{n}\xi_{i} w,bmin21wTwCi1∑nξi 其中 w w w是超平面的法向量 b b b是偏置项 ξ i \xi_{i} ξi是松弛变量n是样本数量C是惩罚参数用于控制误分类样本和决策边界之间的平衡。与二分类SVM类似我们还可以使用软间隔Soft Margin来容忍某些样本的误分类。此时目标函数需要加入松弛变量项公式为 min w , b , ξ 1 2 w T w C ∑ i 1 n ξ i \min_{w,b,\xi} \frac{1}{2}w^Tw C\sum_{i1}^{n}\xi_{i} w,b,ξmin21wTwCi1∑nξi 同时我们需要满足以下约束条件 y i ( w T x i b ) ≥ 1 − ξ i , ∀ i ξ i ≥ 0 , ∀ i y_{i}(w^Tx_{i} b) \geq 1 - \xi_{i}, \forall i\\ \xi_{i} \geq 0, \forall i yi(wTxib)≥1−ξi,∀iξi≥0,∀i 其中 x i x_{i} xi表示样本特征 y i y_{i} yi为对应的类别标签。 计算步骤 导入所需的库和数据集。对数据集进行预处理包括划分为训练集和测试集并进行归一化处理。定义MC-SVM模型并使用训练集进行训练。使用测试集评估模型的性能。 from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.svm import SVC
from sklearn.multiclass import OneVsOneClassifier
from sklearn.datasets import load_iris
# 分类算法数据集
data load_iris()
idata,itarget data.data, data.target
Xtrain,Xtest,ytrain,ytest train_test_split(idata,itarget,test_size0.2,random_state2023)
from sklearn.preprocessing import StandardScaler
s StandardScaler()
Xtrains s.fit_transform(Xtrain)
Xtests s.fit_transform(Xtest)
model OneVsOneClassifier(SVC())
model.fit(Xtrains,ytrain)
y_pre model.predict(Xtests)
r2 r2_score(ytest,y_pre)
print(r2)reshape函数用于在不更改数据的情况下为数组赋予新形状。numpy.reshape(a, newshape, order‘C’) a需要 reshape 的数组newshape新形状应与原始形状兼容。如果是整数则结果将是该长度的一维数组。一个形状尺寸可以为-1。在这种情况下该值是根据数组的长度和其余维来推断的。orderorder{‘C’‘F’‘A’}可选使用此索引顺序读取a的元素并使用此索引顺序将元素放置到重新形成的数组中。C’意味着使用C样索引顺序读取/写入元素最后一个轴索引变化最快回到第一个轴索引变化最慢。F’意味着使用Fortran样索引顺序读取/写入元素第一个索引变化最快最后一个索引变化最慢。注意C’和’F’选项不考虑底层数组的内存布局而只是参考索引的顺序。A’意味着在Fortran类索引顺序中读/写元素如果a 是Fortran 在内存中连续的否则为C样顺序。 在实际使用中特别是在运用函数的时候系统经常会提示是否需要对数据不知道几列反正是1行【使用reshape(1,-1)】或者不知道几行反正是1列【reshape(-1,1)】进行转换 import numpy as np
temp [i1 for i in range(27)]
print(temp)
temp_333 np.array(temp).reshape((3,3,3))
print(temp_333,temp_333.shape)
temp_n1 temp_333.reshape((-1,1))
print(temp_n1,temp_n1.shape)
temp_1n temp_n1.reshape((1,-1))
print(temp_1n,temp_1n.shape)
temp_13n temp_1n.reshape((1,3,-1))
print(temp_13n,temp_13n.shape)
temp_1n3 temp_13n.reshape((1,-1,3))
print(temp_1n3,temp_1n3.shape)transpose()函数的作用就是调换数组的行列值的索引值类似于求矩阵的转置numpy.transpose (arr, axes)。Numpy库中提供了转置函数 transepose()完成高维数组的转置返回的是源数据的视图不进行任何复制操作。二维数组(即矩阵)的转换较好理解但高维数组的转置则比较抽象。 import numpy as np
t np.arange(1,25).reshape(2, 3, 4)
print(t,t.shape)
t1 t.transpose(1, 0, 2)
# 语句t1 t.transpose(1, 0, 2)相当于把0轴和1轴位置进行了交换2轴位置没有变化。对比一下t: (0, 1, 2) → t1: (1, 0, 2).
print(t1,t1.shape)
t2 t1.transpose(2,1,0)
print(t2,t2.shape)支持向量机属于一类监督学习算法主要用于分类和回归问题。在核函数支持向量机中我们首先将输入特征映射到一个高维特征空间然后在这个特征空间中构建一个最优超平面用于对数据进行分类或回归。对于回归问题根据SVM的原理我们设定一个边界超平面使得所有数据点到这个边界的距离之和最小。通过引入核函数我们可以在低维空间中进行计算而不是在高维特征空间中从而避免了高维度的计算开销。 假设我们有一个训练集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } \{(\mathbf{x}_1, y_1), (\mathbf{x}_2, y_2), ..., (\mathbf{x}_m, y_m)\} {(x1,y1),(x2,y2),...,(xm,ym)}其中 x i ∈ R n \mathbf{x}_i \in \mathbb{R}^n xi∈Rn 表示输入特征向量 y i ∈ R y_i \in \mathbb{R} yi∈R 表示对应的目标值。我们的目标是找到一个超平面 f ( x ) w T ϕ ( x ) b f(\mathbf{x}) \mathbf{w}^T\phi(\mathbf{x}) b f(x)wTϕ(x)b使得对于所有的 i i i有 ∣ f ( x i ) − y i ∣ ≤ ϵ |f(\mathbf{x}_i) - y_i| \leq \epsilon ∣f(xi)−yi∣≤ϵ。可以通过构建一个拉格朗日函数来 将问题转换为一个凸优化问题。拉格朗日函数为 L ( w , b , α , η ) 1 2 ∥ w ∥ 2 − ∑ i 1 m α i ( y i − w T ϕ ( x i ) − b ) − ∑ i 1 m η i ( α i − C ) L(\mathbf{w}, b, \boldsymbol{\alpha}, \boldsymbol{\eta}) \frac{1}{2}\|\mathbf{w}\|^2 - \sum_{i1}^{m}\alpha_i (y_i - \mathbf{w}^T\phi(\mathbf{x}_i) - b) - \sum_{i1}^{m}\eta_i(\alpha_i - C) L(w,b,α,η)21∥w∥2−i1∑mαi(yi−wTϕ(xi)−b)−i1∑mηi(αi−C) 其中 α [ α 1 , α 2 , . . . , α m ] T \boldsymbol{\alpha} [\alpha_1, \alpha_2, ..., \alpha_m]^T α[α1,α2,...,αm]T 是拉格朗日乘子向量 η [ η 1 , η 2 , . . . , η m ] T \boldsymbol{\eta} [\eta_1, \eta_2, ..., \eta_m]^T η[η1,η2,...,ηm]T 是松弛变量乘子向量 C C C 是一个正则化参数控制了拉格朗日乘子的惩罚。需要求解拉格朗日函数的对偶问题。对偶问题最终被转化为求解 max α min w , b L ( w , b , α , η ) \max_{\boldsymbol{\alpha}} \min_{\mathbf{w}, b} L(\mathbf{w}, b, \boldsymbol{\alpha}, \boldsymbol{\eta}) αmaxw,bminL(w,b,α,η) 求解得到的 α \boldsymbol{\alpha} α 可以帮助我们确定支持向量并用于预测新样本的目标值。 计算流程 加载数据集并进行预处理。切分数据集为训练集和测试集。定义核函数支持向量机模型。训练模型并进行预测。评估模型性能。 from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.svm import SVR
import numpy as np
import pandas as pd
data_url http://lib.stat.cmu.edu/datasets/boston
raw_df pd.read_csv(data_url, sep\s, skiprows22, headerNone)
data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target raw_df.values[1::2, 2]
data StandardScaler().fit_transform(data)
Xtrains,Xtests,ytrain,ytest train_test_split(data,target,test_size0.2,random_state2023)
# s StandardScaler()
# Xtrains s.fit_transform(Xtrain)
# Xtests s.fit_transform(Xtest)
model SVR(kernelrbf, C1.0, epsilon0.1)
# 使用SVR类来创建一个支持向量机回归模型指定核函数为高斯径向基核函数RBF kernel正则化参数为1.0松弛变量容忍度为0.1。
model.fit(Xtrains,ytrain)
ypre model.predict(Xtests)
r2 r2_score(ytest,ypre)
print(r2)数据标准化应该在训练集和测试集划分后分别对训练集和测试集进行数据标准化处理。不应该是数据标准化后再进行划分。虽然从模型测试的结果看可能出现的差距不大。在真正的部署过程中测试数据实际上就是那些源源不断刚刚出现的数据你不知道它什么分布也不知道它出现什么样的数值。所以你要用训练数据得到的均值和标准偏差去转换它。这更加贴近部署的实际。测试集的归一化的均值和标准偏差应该来源于训练集。数据预处理我们使用StandardScaler对特征矩阵进行标准化处理将所有特征缩放到均值为0、方差为1的标准正态分布。 稀疏支持向量机SSVM通过引入稀疏性约束可以在保持较小的存储和计算开销的同时实现和经典支持向量机相近的性能。它在L1-正则化的基础上添加了一个对偶问题的修正项。我们考虑一个线性的回归问题其中有m个训练样本。给定输入矩阵X大小为m×nm为样本数n为特征数量和对应的目标向量y大小为m×1我们的目标是学习一个最佳的回归模型。稀疏支持向量机的目标函数可以表示为如下形式的优化问题 min w , b , ξ i 1 2 w T w C ∑ i ξ i \min_{w,b,\xi_{i}} \frac{1}{2}w^{T}w C \sum_{i} \xi_{i} w,b,ξimin21wTwCi∑ξi 最小化经验误差 1 2 w T \frac{1}{2}w^{T} 21wT其中w是回归系数。 最小化目标函数中的正则项 C ∑ i ξ i C \sum_{i} \xi_{i} C∑iξi.其中C是正则项系数 ξ i \xi_{i} ξi 是松弛变量。 满足约束条件 y i − w T x i − b ≤ ϵ ξ i y_{i} - w^{T}x_{i} - b \leq \epsilon \xi_{i} yi−wTxi−b≤ϵξi 和 w T x i b − y i ≤ ϵ ξ i w^{T}x_{i} b - y_{i} \leq \epsilon \xi_{i} wTxib−yi≤ϵξi其中 ϵ \epsilon ϵ是一个预定义的容忍度值。 支持向量机SVMSupport Vector Machine是机器学习中常见的一种分类算法是一种二分类模型它的目的是寻找一个超平面来对样本进行分割分割的原则是间隔最大化最终转化为一个凸二次规划问题来求解。支持向量机要做的就是要在这些可以选择的直线中选择一条最好的直线来作为分类的直线。 当训练样本线性可分时通过硬间隔最大化学习一个线性可分支持向量机当训练样本近似线性可分时通过软间隔最大化学习一个线性支持向量机当训练样本线性不可分时通过核技巧和软间隔最大化学习一个非线性支持向量机。 SVM算法可以让我们找到这样一个最佳的线超平面来划分数据。相比于KNN之类的算法SVM算法只需要计算一次得出最佳线超平面即可。面对测试数据只需要判断数据点落在线的哪一侧就可以知道该数据点所属分类了。比起KNN每次都需要计算一遍邻居点的分类SVM算法显得简单无比。 from sklearn.svm import LinearSVC, LinearSVR,SVC,SVR
LSVC LinearSVC(penaltyl2,losssquared_hinge,dualTrue,tol0.0001,C1.0,multi_classovr,fit_interceptTrue,intercept_scaling1,class_weightNone,verbose0,random_stateNone,max_iter1000)penalty:正则化参数L1和L2两种参数可选仅LinearSVC有。 loss:损失函数有‘hinge’和‘squared_hinge’两种可选前者又称L1损失后者称为L2损失默认是是’squared_hinge’其中hinge是SVM的标准损失squared_hinge是hinge的平方。 dual:是否转化为对偶问题求解默认是True。 tol:残差收敛条件默认是0.0001与LR中的一致。 C:惩罚系数用来控制损失函数的惩罚系数类似于LR中的正则化系数默认值为1.0。C越大即对分错样本的惩罚程度越大因此在训练样本中准确率越高但是泛化能力降低也就是对测试数据的分类准确率降低。相反减小C的话容许训练样本中有一些误分类错误样本泛化能力强。对于训练样本带有噪声的情况一般采用后者把训练样本集中错误分类的样本作为噪声。 multi_class:负责多分类问题中分类策略制定有‘ovr’和‘crammer_singer’ 两种参数值可选默认值是’ovr’ovr’的分类原则是将待分类中的某一类当作正类其他全部归为负类通过这样求取得到每个类别作为正类时的正确率取正确率最高的那个类别为正类‘crammer_singer’ 是直接针对目标函数设置多个参数值最后进行优化得到不同类别的参数值大小。 fit_intercept:是否计算截距与LR模型中的意思一致。 class_weight:与其他模型中参数含义一样也是用来处理不平衡样本数据的可以直接以字典的形式指定不同类别的权重也可以使用balanced参数值。 verbose:详细输出默认是False. random_state:随机种子的大小。 max_iter:最大迭代次数默认是1000。 coef_:各特征的系数重要性。_ _intercept_:截距的大小常数值 import numpy as np
import pandas as pd
data_url http://lib.stat.cmu.edu/datasets/boston
raw_df pd.read_csv(data_url, sep\s, skiprows22, headerNone)
data np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target raw_df.values[1::2, 2]
from sklearn.model_selection import train_test_split
Xtr,Xte,ytr,ytetrain_test_split(data,target)
from sklearn.preprocessing import StandardScaler
s StandardScaler()
Xtrs s.fit_transform(Xtr)
Xtes s.fit_transform(Xte)
from sklearn.svm import LinearSVR
model LinearSVR()
model.fit(Xtrs,ytr)
ypr model.predict(Xtes)
from sklearn.metrics import r2_score
r2 r2_score(yte,ypr)
print(r2)
print(model.coef_)稀疏支持向量机是一种强大的机器学习算法它可以用于处理大规模的回归问题。通过合适地选择超参数稀疏支持向量机可以提供较好的回归性能并具有较小的存储和计算开销。 核贝叶斯支持向量机Kernelized Bayesian Support Vector Machines是基于贝叶斯定理和支持向量机Support Vector MachinesSVM的基础上发展起来的一种算法。相比于传统的SVM算法核贝叶斯支持向量机能够充分利用概率信息在处理一些复杂的问题时更具优势。核贝叶斯支持向量机的算法原理如下 假设我们有一个包含N个训练样本的数据集每个样本的特征表示为 x i x_i xi目标变量表示为 y i y_i yi。核贝叶斯支持向量机的目标是通过学习一个函数 f ( x ) f(x) f(x)来预测新样本 x x x 的目标变量 y y y。核贝叶斯支持向量机通过使用一个非线性核函数来扩展支持向量机。核函数将样本映射到一个高维特征空间中使得在该特征空间中样本是线性可分的。核贝叶斯支持向量机通过最大化后验概率来确定模型参数并通过最大化边缘似然来对超参数进行估计。在预测新样本 x x x的目标变量 y y y时可以使用后验概率 p ( y ∣ x ) p(y|x) p(y∣x)或者求解最大后验概率 p ( y ∣ x ) p(y|x) p(y∣x)来进行分类。 核贝叶斯支持向量机的公式推导包括对模型参数和超参数的后验概率求解。对于目标变量 y y y的后验概率 p ( y ∣ x , D ) ∫ p ( y , w ∣ x , D ) d w ∫ p ( y ∣ w , x ) p ( w ∣ D ) d w p(y|x,D) \int{p(y,w|x,D)}dw \int{p(y|w,x)p(w|D)dw} p(y∣x,D)∫p(y,w∣x,D)dw∫p(y∣w,x)p(w∣D)dw 其中 p ( y , w ∣ x , D ) p(y,w|x,D) p(y,w∣x,D)是联合概率、 p ( y ∣ w , x ) p(y|w,x) p(y∣w,x)是似然概率、 p ( w ∣ D ) p(w|D) p(w∣D)是先验概率。 对于超参数 α \alpha α和 β \beta β的边缘似然marginal likelihood p ( D ∣ α , β ) ∫ p ( D ∣ w , β ) p ( w ∣ α ) d w p(D|\alpha, \beta) \int{p(D|w,\beta)p(w|\alpha)dw} p(D∣α,β)∫p(D∣w,β)p(w∣α)dw 通过最大化边缘似然的对数可以得到超参数的估计值 α ^ , β ^ arg max α , β log p ( D ∣ α , β ) \hat{\alpha}, \hat{\beta} \arg\max_{\alpha,\beta}{\log{p(D|\alpha,\beta)}} α^,β^argα,βmaxlogp(D∣α,β) 不平衡类别SVM是一种监督学习算法用于解决分类问题特别是在样本类别分布不均衡的情况下。传统的SVM致力于找到两个类别之间的最佳分割超平面而不平衡类别SVM则在此基础上加入了类别权重以便给予少数类更多的关注。SVM的目标函数可以表示为 min w , b 1 2 ∥ w ∥ 2 C ∑ i 1 n ξ i \min_{w,b} \frac{1}{2}\|w\|^2 C \sum_{i1}^{n} \xi_i w,bmin21∥w∥2Ci1∑nξi
)$$是先验概率。 对于超参数 α \alpha α和 β \beta β的边缘似然marginal likelihood p ( D ∣ α , β ) ∫ p ( D ∣ w , β ) p ( w ∣ α ) d w p(D|\alpha, \beta) \int{p(D|w,\beta)p(w|\alpha)dw} p(D∣α,β)∫p(D∣w,β)p(w∣α)dw 通过最大化边缘似然的对数可以得到超参数的估计值 α ^ , β ^ arg max α , β log p ( D ∣ α , β ) \hat{\alpha}, \hat{\beta} \arg\max_{\alpha,\beta}{\log{p(D|\alpha,\beta)}} α^,β^argα,βmaxlogp(D∣α,β) 不平衡类别SVM是一种监督学习算法用于解决分类问题特别是在样本类别分布不均衡的情况下。传统的SVM致力于找到两个类别之间的最佳分割超平面而不平衡类别SVM则在此基础上加入了类别权重以便给予少数类更多的关注。SVM的目标函数可以表示为 min w , b 1 2 ∥ w ∥ 2 C ∑ i 1 n ξ i \min_{w,b} \frac{1}{2}\|w\|^2 C \sum_{i1}^{n} \xi_i w,bmin21∥w∥2Ci1∑nξi 其中 w w w 是超平面的法向量 b b b是偏置项 ξ i \xi_i ξi是松弛变量 C C C是正则化参数。不平衡类别SVM通过为不同类别的样本设定不同的 C C C值来实现类别不平衡的处理。