鸢尾花数据分类-SVM分类与交叉验证案例
本章将讲解如何用py实现SVM分类操作;
要明确的是:SVM一开始是由二分类问题提出的,但不代表其只能处理二分类问题;
原生 SVM 数学只能区分两类(A / 非 A),遇到 3 类、4 类数据,必须拆成一堆二分类小模型再整合结果,两种拆分方案:OVO 一对一、OVR 一对多。
拿鸢尾花 3 类举例:类别 0 (setosa)、1 (versicolor)、2 (virginica)
- OVO 一对一 One vs One(SVC 默认)
规则:任意两个类别单独拉出来训练一个二分类器,两两对比。3 个类别组合数量:C_3 ^2个小 SVM
分类器 1:只学 0 VS 1
分类器 2:只学 0 VS 2
分类器 3:只学 1 VS 2 - OVR 一对多 One vs Rest(One vs All)
规则:每次拿一类当正样本,剩下所有其他类合并当成一大类负样本。3 个类别对应3 个独立二分类器
分类器 1:正 = 0,负 =(1+2)
分类器 2:正 = 1,负 =(0+2)
分类器 3:正 = 2,负 =(0+1)
一、加载对应的库
from sklearn.svm import SVC #(SVC就是分类问题,SVR是回归问题)
from sklearn.preprocessing import StandardScaler #标准化
from sklearn import datasets # 数据集函数
from sklearn.model_selection import train_test_split # 用于划分数据集
二、读数据
通过dataset提取的数据是一个类,因此可以用.data和.target的方式提取数据;X是159行,4列,也就是150个样本,4个特征;而y是150行1列,代表150个样本;
iris = datasets.load_iris() #读取鸢尾花数据
X = iris.data
y = iris.target
三、标准化与拆分训练集
std = StandardScaler()
X_std = std.fit_transform(X)
X_train,X_test,y_train,y_test=train_test_split(X_std,y,test_size=0.3)
四、SVM建模
这里SVC的核心参数分别为:
1.C=1.0, # 错误样本的惩罚参数
2.kernel='rbf', # 使⽤何种核算法。linear线性、poly多项式、rbf⾼斯、sigmod、precomputed⾃定义
3.degree=3, # 多项式核函数的阶数
4.gamma='auto', # 当kernel为‘rbf’, ‘poly’或‘sigmoid’时的kernel系数。
svm_classification = SVC()
svm_classification.fit(X_train,y_train)
五、查看模型效果
svm_classification.score(X_test,y_test)
print(svm_classification.predict(X_test))
六、交叉验证
1.导入相关的库
from sklearn.model_selection import GridSearchCV
2.定义参数组合
参数组合需要用一个字典来填写,SVM常用的参数就是核函数kernel与惩罚系数C
params = {
'kernel': ['linear', 'poly', 'rbf'],# 分别是线性核,多项式核,高斯核
'C':[0.01,0.1,0.5,1,2,10,100]
}
3.模型训练
model = GridSearchCV(svm_classification,param_grid=params,cv = 10)
model.fit(X_train,y_train)
4.查看参数最好的参数组合
print(f'最好的参数组合是:{model.best_params_}')
print(f'最好的socre:{model.best_score_}')
5.用最优模型对测试集预测
GridSearchCV 内部会自动保存参数最优、训练完成的模型,直接调用model.predict()即可:
y_pred = model.predict(X_test)
print("最优参数模型预测结果:", y_pred)
# 测试集真实准确率
test_acc = model.score(X_test, y_test)
print("测试集准确率:", test_acc)

浙公网安备 33010602011771号