内容来自:https://github.com/GreedyAIAcademy/Machine-Learning
最初
支持向量机的目的:找到一条好的分割线
什么杨的分割线最好?
有最大间隔的分割线最好。
推导过程
Support Vector是被选中用于计算的点,也就是距离分界线最近的几个点。
显然d1+d2=“向量(x1-x2)的模”*cosθ。
根据向量内机的算法:向量w*向量(x1-x2)=|w|*|x1-x2|cosθ
因此,d1+d2=向量w*向量(x1-x2)/|w|,又根据上面的两个方程式相加就可以知道d1+d2=2/|w|
又因为向量w向量w的转置矩阵=|w|的平方
所以为了让(d1+d2)最大,也就是让"向量w向量w的转置矩阵"最小,然后再加上一个松弛变量就有了这样的方程:
实际生活中如果考虑全部的点很有可能画不出分割线,松弛变量的意思就是舍弃一些点画出分割线:
最终的向量内积方程的形式是:
扩展SVM到支持多个类别
两种方法:
- OVR (one versus rest): 对于K个类别的情况, 训练K个SVM, 第 j 个SVM用于判读任意条数据是属于类别 j 还是属于类别非 j. 预测的时候, 具有最大值的 ????_i^???? ???? 表示给定的数据 x 属于类别 i.
- OVO (one versus one), 对于K个类别的情况, 训练K * (K-1) /2 个SVM, 每一个SVM只用于判读任意条数据是属于K中的特定两个类别. 预测的时候, 使用K * (K-1) /2 个SVM做 K * (K-1) /2 次预测, 使用计票的方式决定数据被分类为哪个类别的次数最多, 就认为数据 x 属于此类别.
一些函数参考
make_blobs():https://www.cnblogs.com/peixu/p/8011656.html
gridSearchCV(): https://blog.csdn.net/weixin_41988628/article/details/83098130
分类评估:https://blog.csdn.net/u012429555/article/details/82973387
协方差的意义:https://blog.csdn.net/GoodShot/article/details/79940438
PCA降维参数:https://www.cnblogs.com/akrusher/articles/6442549.html
scatter:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html
课后练习
#引入包
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
# PCA数据降维和SVC初始化
# make_pipeline建立管道,让pca的输出作为svc的输入
pca = PCA(n_components=117, whiten=True, random_state=42)
svc = SVC(kernel='linear', class_weight='balanced')
model = make_pipeline(pca, svc)
# 将数据分为训练数据和测试数据
from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(X_mush, y_mush, random_state=41)
#调参:通过交叉验证寻找最佳的 C (控制间隔的大小)
from sklearn.model_selection import GridSearchCV
param_grid = {'svc__C': [1, 5, 10, 50]}
grid = GridSearchCV(model, param_grid)
%time grid.fit(Xtrain, ytrain)
print(grid.best_params_)
# 用训练好的SVM做预测
model = grid.best_estimator_
yfit = model.predict(Xtest)
# 生成报告
from sklearn.metrics import classification_report
print(classification_report(ytest, yfit, target_names=["p","e"]))
结果和PCA降维有关,n_components=117、50时都是1,n_components=8时的结果如下:
precision recall f1-score support
p 0.94 0.96 0.95 1047
e 0.96 0.94 0.95 984
micro avg 0.95 0.95 0.95 2031
macro avg 0.95 0.95 0.95 2031
weighted avg 0.95 0.95 0.95 2031
分类评估的字段解析
定义
TP、True Positive:预测为正,实际也为正
FP、False Positive:预测为正,实际为负
FN、False Negative:预测与负、实际为正
TN、True Negative:预测为负、实际也为负。
precision=TP/(TP+FP)
recall=TP/(TP+FN)
f1-score=2precisionrecall/(precision+recall)
宏平均:算数平均值
微平均:Micro-average=(TP+FP)/(TP+TN+FP+FN)
加权平均:weighted avg
support: 支持每个类别的用例数
图文举例说明
示例报告内容如下:
示例的结果矩阵如下:
解释
如图,这是一份人脸识别的报告,每个标签都代表一个人:
对角线是TP:表示预测图片是这个人,实际也是这个人;
除去对角线上的数据后:
整行看是FP:表示你预测是这个人,实际是别人;
整列看是FN:表示你预测不是这个人,实际是这个人;
针对每个label,除去上面涉及的数据,剩下的就是TN,即预测和结果都不是这个人
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:机器学习笔记4:SVM支持向量积的推导过程 - Python技术站