SVM支持向量机Python实现(基于SKlearn)
支持向量机简介
支持向量机(Support Vector Machines,SVM)
SVM 是一个非常优雅的算法,具有完善的数学理论,常用于数据分类,也可以用于数据的回归预测中,由于其优美的理论保证和利用核函数对于线性不可分问题的处理技巧, 在上世纪90年代左右,SVM 曾红极一时。
SVM 可以用于分类、回归和异常检测,均可。
优点:泛化错误率低,计算开销不大,结果易解释。
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。
适用数据类型:数值型和标称型数据。
SVM对特征的缩放非常敏感
Sklearn构建SVM分类器实现
# 导入数据集
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 导入SVM构建器
from sklearn.svm import SVC
# 计算准确率包
from sklearn.metrics import accuracy_score
iris_datas = datasets.load_iris()
# train_test_split函数利用伪随机数生成器将数据集打乱,train_size是分割比例,默认为0.25,即测试集占完整数据集的比例
X_train,X_test,train_y,test_y = train_test_split(iris_dataset['data'],iris_dataset['target'],train_size=0.7)
### 构建模型并测试
# 构建核函数为线性函数的SVM分类器
svm_clf = SVC(kernel='linear')
# 使用训练集训练分类器
svm_clf.fit(X_train,train_y)
# 使用测试集进行测试
prey = svm_clf.predict(X_test)
# 计算测试集准确率
acc = accuracy_score(test_y,prey)
print(acc)
输出准确率约在97%左右
关键函数详解
sklearn.svm.SVC()非线性多维支持向量分类
class sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)
C - 松弛变量,默认1.0
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。c>0
kernel核函数选择
- 'linear' :线性核函数
- 'poly' :多项式核函数
- 'rbf' :径像核函数/高斯核,默认值
- 'sigmod' :sigmod核函数
- 'precomputed' :核矩阵 precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,核矩阵需要为n*n的。
degree : int,可选(默认= 3)
多项式核函数的阶数,int类型,可选参数,默认为3。这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。
gamma : float,optional(默认='auto') 核函数系数,float类型,可选参数,默认为auto。只对'rbf' ,'poly' ,'sigmod'有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
coef0 : float,optional(默认值= 0.0)
核函数中的独立项,float类型,可选参数,默认为0.0。只有对'poly' 和,'sigmod'核函数有用,是指其中的参数c。
shrinking : 布尔值,可选(默认= True) 是否采用启发式收缩方式,bool类型,可选参数,默认为True。将这个值设为0是能提高运算速度
probability : 布尔值,可选(默认=False) 是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢。
tol : float,optional(默认值= 1e-3) svm停止训练的误差精度,float类型,可选参数,默认为1e^-3
cache_size : float,可选(默认为200) 内存大小,float类型,可选参数,默认为200。指定训练所需要的内存,以MB为单位,默认为200MB。
最佳参数搜索
利用 GridSearchCV
函数搜索最佳参数。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV
iris_datas = datasets.load_iris()
X_train,X_test,train_y,test_y = train_test_split(iris_datas['data'],iris_datas['target'],train_size=0.7)
svm_clf = SVC(kernel='linear')
param = {'C':[1, 5, 10],'gamma':[0.0001,0.0005,0.001]}
grid= GridSearchCV(svm_clf, param_grid=param)
grid.fit(X_train,train_y)
print(grid.best_params_)
print(grid.best_score_)
model = grid.best_estimator_
prey = model.predict(X_test)
acc = accuracy_score(test_y,prey)
print(acc)
参阅:
- 《机器学习实战》Peter Harrington,[美],ISBN: 9787115317957
- 《机器学习》西瓜书,周志华,南京大学,ISBN:9787302423287
- 《跟着迪哥学Python数据分析与机器学习实战》,唐宇迪,人民邮电出版社,ISBN: 9787115512444
- 《An Introduction to Support Vector Machines》Nello Cristianini,[英],ISBN: 9780521780193
- scikit-learn官方文档:C-Support Vector Classification
- sklearn.svm.SVC()函数解析(最清晰的解释)
- 支持向量机SVM--sklearn.svm.SVC【机器学习笔记简摘】