大师兄的数据分析学习笔记(十八):分类模型(四)

2022-07-22  本文已影响0人  superkmi

大师兄的数据分析学习笔记(十七):分类模型(三)
大师兄的数据分析学习笔记(十九):分类集成(一)

四、支持向量机

4.1 关于支持向量机
  • 多维空间中的维度用向量x表示,其分量x_n代表各维度:x^T = [x_0,x_1,x_2,...,x_n]
  • \omega代表维度中的面,也叫超平面\omega^T = [\omega_0,\omega_1,\omega_2,...,\omega_n]
  • 高维面: \omega^Tx+b = 0
  • 分界面:\omega^Tx_p + b \geq \epsilon \omega^Tx_p + b \leq -\epsilon -> \omega^Tx_p + b \geq 1 \omega^Tx_p + b \leq -1

    -上面公式简化后:y_i(\omega^Tx_i+b)\geq1
  • 根据点到面的距离公式:d = |\frac{Ax_0+By_0+Cz_0+D}{\sqrt{A^2+B^2+C^2}}|, 公式中的A、B、C就是维度中的面,也就是\omega
  • 因此,间隔最大的切分也就是max\frac{2}{\omega^2} min\frac{||\omega^2||}{2}
  • s.t. y_i(\omega^Tx_i+b)\geq1 拉格朗日乘数法-> L = \frac{1}{2}||\omega||^2 - \sum_{n=1}^Na_n*\{y_n(\omega^Tx_n+b)-1\}
4.2 特殊情况处理
1. 容忍一部分的错误归类
2. 扩维
  • 比如用多项式扩维法从二维扩围到五维:(x1,x_2)->(x_1,x_2,x_1x_2,x_1^2,x_2^2)
  • 而从三维用同样的方法可以扩展到十九维。
  • 线性核函数:k(x,x_i)=x\times x_i
  • 多项式核函数:k(x,x_i)=((x\times x_i)+1)^d
  • 高斯径向基(RBF)核函数:k(x,x_i)=exp(-\frac{||x-x_i||^2}{\delta^2})
4.3 问题处理
1.少部分异常
2.样本不平衡
3.多分类问题
  1. 有几个分类,就建几个SVM,将样本的每个SVM都跑一遍,找成功分类并且离超平面最远的作为正确分类。
  2. 在分类两两之间分别建立SVM,取出其中被分类次数最多的分类作为正确分类。
4.4 代码实现
>>>import os
>>>import pandas as pd
>>>import numpy as np
>>>from sklearn.model_selection import train_test_split
>>>from sklearn.metrics import  accuracy_score,recall_score,f1_score
>>>from sklearn.svm import SVC

>>>models = []
>>>models.append(("SVM Classifier",SVC()))

>>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
>>>X_tt,X_validation,Y_tt,Y_validation = train_test_split(df.JobLevel,df.JobSatisfaction,test_size=0.2)
>>>X_train,X_test,Y_train,Y_test = train_test_split(X_tt,Y_tt,test_size=0.25)

>>>for clf_name,clf in models:
>>>    clf.fit(np.array(X_train).reshape(-1,1),np.array(Y_train).reshape(-1,1))
>>>    xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
>>>    for i in range(len(xy_lst)):
>>>        X_part = xy_lst[i][0]
>>>        Y_part = xy_lst[i][1]
>>>        Y_pred = clf.predict(np.array(X_part).reshape(-1,1))
>>>        print(i)
>>>        print(clf_name,"-ACC",accuracy_score(Y_part,Y_pred))
>>>        print(clf_name,"-REC",recall_score(Y_part,Y_pred,average='macro'))
>>>        print(clf_name,"-F1",f1_score(Y_part,Y_pred,average='macro'))
>>>        print("="*40)
0
SVM Classifier -ACC 0.3197278911564626
SVM Classifier -REC 0.2620657705498396
SVM Classifier -F1 0.19869489047039893
========================================
1
SVM Classifier -ACC 0.29591836734693877
SVM Classifier -REC 0.23682033096926713
SVM Classifier -F1 0.18196778711484593
========================================
2
SVM Classifier -ACC 0.2755102040816326
SVM Classifier -REC 0.22332554517133957
SVM Classifier -F1 0.1684558664064194
========================================
上一篇下一篇

猜你喜欢

热点阅读