支持向量机
原理: 参考链接, https://zhuanlan.zhihu.com/p/28660098
里面的内容讲解很全, 公式推导什么的都有, 但是简单总结下支持向量机
-
寻求最优分类边界
正确:对大部分样本可以正确地划分类别。
泛化:最大化支持向量间距。
公平:与支持向量等距。
简单:线性,直线或平面,分割超平面。 -
基于核函数的升维变换
通过名为核函数的特征变换,增加新的特征,使得低维度空间中的线性不可分问题变为高维度空间中的线性可分问题。
线性核函数:linear,不通过核函数进行维度提升,仅在原始维度空间中寻求线性分类边界。
多项式核函数:poly,通过多项式函数增加原始样本特征的高次方幂
径向基核函数:rbf,通过高斯分布函数增加原始样本特征的分布概率
SVM python 用例
本次用例根据声音和语音的声学特性来识别男性或女性的声音。这个数据集由3168个录音样本组成,这些样本来自男性和女性。语音样本在seewave和调谐器软件包中通过声学分析进行预处理,分析频率范围为0hz-280hz(人声范围)。
meanfreq:平均频率(kHz)
sd:频率标准差
median:中值频率(kHz)
Q25:第一个分位数(单位:kHz)
Q75:第三分位数(单位:kHz)
IQR:分位数范围(单位:kHz)
skew:偏斜
kurt:峰度
sp.ent:光谱熵
sfm: 平坦度
model:模式频率
centroid:频率质心
peakf:峰值频率(能量最高的频率)
meanfun:通过声学信号测量的基频平均值
minfun:通过声信号测量的最小基频
maxfun:通过声信号测量的最大基频
meandom:通过声学信号测量的主频的平均值
mindom:声信号中测得的主频最小值
maxdom:通过声信号测量的主频的最大值
dfrange:通过声信号测量的主频范围
modindx:调制指数。计算为基频相邻测量值之间的累积绝对差除以频率范围
label:男或女
其实在做核函数选择的时候, 有时候会纠结, 但是较麻烦的方法, 还是都用一下, 看看哪个模型好就用哪个.
读取数据:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('voice.csv')
data.head()
检查数据
整理数据
# 数据清洗
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data["label"]=le.fit_transform(data["label"])
data["label"]
划分自变量和因变量
y = data["label"]
X = data.drop(["label"], axis = 1)
归一化处理, 减小量纲
# 归一化
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler as mms
Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,y,test_size=0.2,random_state=420)
MMS_01=mms().fit(Xtrain)
MMS_02=mms().fit(Xtest)
X_train=MMS_01.transform(Xtrain)
X_test =MMS_02.transform(Xtest)
数据可视化
其实中间应该有个理解数据, 通过可视化可以看看特征之间的趋势和关联, 在此处就先略过. 对于业务理解的同学来讲, 此步骤不应该省略的, 小笨我也只是偷个懒.
调用SVM
from sklearn.svm import SVC
svm = SVC(random_state = 1)
svm.fit(x_train, y_train)
利用网格搜索对三种核函数进行最优模型选择
# 基于径向基核函数的支持向量机分类器
from sklearn.model_selection import GridSearchCV
params = [{'kernel':['linear'],},
{'kernel':['poly'], 'degree':[2, 3],},
{'kernel':['rbf'], 'C':[1,10,100,1000], 'gamma':[1, 0.1, 0.01, 0.001]}]
model = GridSearchCV(SVC(), params,cv= 6)
model.fit(X_train, Ytrain)
# 获取得分最优的的超参数信息
print(model.best_params_)
# 获取最优得分
print(model.best_score_)
# 获取最优模型的信息
print(model.best_estimator_)