Wang Haihua
🍈 🍉🍊 🍋 🍌
sklearn.svm
模块¶支持向量机的分类和回归问题,都可以借助Python的sklearn模块求解。
在支持向量机分类问题的模型中,有两个重要参数需要选择,一个是软间隔惩罚系数 ,另一个是核函数的类型。核函数有如下几种:(1)线性函数,(2)多项式函数,(3)径向基函数,(4)Sigmoid函数。 网格搜索法可以用来寻找合适的参数,即尝试所有可能的参数组合。为了进行网格搜索,可以借助scikit-learn提供的GridSearchCV类。使用这个类时,我们可以通过字典来提供分类器或回归器的类型对象。字典的键就是我们将要调整的参数,而字典的值就是需要尝试的参数值的相应列表。
sklearn.svm子模块中的LinearSVC以及SVC类可以实现支持向量分类算法。其中SVC的基本语法和参数含义如下: ```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。
- `kernel`:用于指定模型的核函数,该参数如果为'linear',就表示线性核函数;如果为'poly',就表示多项式核函数,核函数中的r和p值分别使用degree参数和gamma参数指定;如果为'sigmoid',表示Sigmmoid核函数,核函数中的 参数值需要通过gamma参数指定;如果为'precomputed',表示计算一个核矩阵。
- `degree`:用于指定多项式核函数中的p参数值。
- `gamma`:用于指定多项式核函数或Sigmoid核函数中的 参数值。
- `coef0`:用于指定多项式函数或Sigmoid核函数中的参数值。
- `shrinking`:bool类型参数,是否采用启发式收缩方式,默认为True。
- `probability`:bool类型参数,是否需要对样本所属类别进行概率计算,默认为False。
- `tol`:用于指定SVM模型迭代的收敛条件,默认为0.001。
- `cache_size`:用于指定核函数运算的内存空间,默认为200M。
- `class_weight`:用于指定因变量类别的权重。
- `verbose`:bool类型参数,是否输出模型迭代过程的信息,默认为0,表示不输出。
- `decision_function_shape`:用于指定SVM模型的决策函数形状。
- `random_state`:用于指定随机数生成器的种子。
## 案例(鸢尾花分类)
```python
from sklearn import datasets, svm, metrics
from sklearn.model_selection import GridSearchCV
import numpy as np
iris=datasets.load_iris()
x=iris.data; y=iris.target
parameters = {'kernel':('linear','rbf'), 'C':[1,10,15]}
svc=svm.SVC(gamma='scale')
clf=GridSearchCV(svc,parameters,cv=5) #cv为交叉验证参数,为5折
clf.fit(x,y)
print("最佳的参数值:", clf.best_params_)
print("score:",clf.score(x,y))
yh=clf.predict(x); print(yh) #显示分类的结果
print("预测准确率:",metrics.accuracy_score(y,yh))
print("误判的样本点为:",np.where(yh!=y)[0]+1)
直接使用线性支持向量机进行分类的Python程序如下:
from sklearn import datasets, svm
from sklearn.model_selection import GridSearchCV
import numpy as np
iris=datasets.load_iris()
x=iris.data; y=iris.target
clf=svm.LinearSVC(C=1,max_iter=10000)
clf.fit(x,y); yh=clf.predict(x); print(yh)
print("预测的准确率:",clf.score(x,y))
sklearn.svm子模块中的LinearSVM以及SVR类可以实现支持向量回归算法。其中SVR的基本语法和参数含义如下:
SVR(kernel='rbf', degree=3, gamma='auto_deprecated', coef0=0.0, tol=0.001, C=1.0, epsilon=0.1, shrinking=True, cache_size=200, verbose=False, max_iter=-1)
其中,epsilon用于指定不敏感损失函数中的$\epsilon$,在线性SVR中默认为0,在非线性SVR中默认为0.1,其他参数同SVC中的参数。
from sklearn.svm import SVR
np.random.seed(123)
house=datasets.fetch_california_housing()
x=house.data; y=house.target
model = SVR(gamma='auto'); print(model)
model.fit(x,y); pred_y = model.predict(x)
参考文献
from sklearn import datasets, svm, metrics
from sklearn.model_selection import GridSearchCV
import numpy as np
iris=datasets.load_iris()
x=iris.data; y=iris.target
parameters = {'kernel':('linear','rbf'), 'C':[1,10,15]}
svc=svm.SVC(gamma='scale')
clf=GridSearchCV(svc,parameters,cv=5) #cv为交叉验证参数,为5折
clf.fit(x,y)
print("最佳的参数值:", clf.best_params_)
print("score:",clf.score(x,y))
yh=clf.predict(x); print(yh) #显示分类的结果
print("预测准确率:",metrics.accuracy_score(y,yh))
print("误判的样本点为:",np.where(yh!=y)[0]+1)
最佳的参数值: {'C': 1, 'kernel': 'linear'} score: 0.9933333333333333 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] 预测准确率: 0.9933333333333333 误判的样本点为: [84]
from sklearn.svm import SVR
np.random.seed(123)
house=datasets.fetch_california_housing()
x=house.data; y=house.target
model = SVR(gamma='auto'); print(model)
model.fit(x,y); pred_y = model.predict(x)
SVR(gamma='auto')
model.score(x,y)
0.7506287852385003