接下来我们看一下gamma参数。
def gamma_for_RBF(): wine = datasets.load_wine() #选取数据集前两个特征 X = wine.data[:,:2] y = wine.target C = 1.0 #SVM参数正则化 models =(svm.SVC(kernel='rbf',gamma=0.1,C=C), svm.SVC(kernel='rbf',gamma=1,C=C), svm.SVC(kernel='rbf',gamma=10,C=C)) models = (clf.fit(X,y) for clf in models) #设置标题 titles = ('gamma = 0.1', 'gamma = 1', 'gamma = 10') fig, sub = plt.subplots(1,3,figsize =(10,3)) X0, X1 = X[:,0],X[:,1] xx, yy = make_meshgrid(X0, X1) #使用前面定义的函数画图 for clf, title, ax in zip(models,titles,sub.flatten()): plot_contour(ax,clf,xx,yy,cmap=plt.cm.plasma,alpha=0.8) ax.scatter(X0,X1,c=y,cmap=plt.cm.plasma,s=20,edgecolors='k') ax.set_xlim(xx.min(),xx.max()) ax.set_ylim(yy.min(),yy.max()) ax.set_xlabel('Feature 0') ax.set_ylabel('Feature 1') ax.set_xticks(()) ax.set_yticks(()) ax.set_title(title) plt.show()
由此可以看出:
- gamma越小,RBF内核直径越大,更多节点被圈进去,趋于欠拟合。
- gamma越大,RBF内核直径越小,更少节点被圈进去,趋于过拟合。
SVM的优势和劣势如下:
SVM需要考虑:
我们下面通过波士顿房价数据例子来讨论一下如何调优的过程。
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split def SVM_for_boston(): boston = datasets.load_boston() X,y = boston.data,boston.target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state =8) for kernel in ['linear','rbf','sigmoid','poly']: svr = svm.SVR(kernel=kernel) svr.fit(X_train,y_train) print(kernel,'核函数的模型训练集得分: {:.3f}'.format(svr.score(X_train,y_train))) print(kernel,'核函数的模型测试集得分: {:.3f}'.format(svr.score(X_test,y_test)))
输出
linear 核函数的模型训练集得分: 0.709 linear 核函数的模型测试集得分: 0.696 rbf 核函数的模型训练集得分: 0.192 rbf 核函数的模型测试集得分: 0.222 sigmoid 核函数的模型训练集得分: 0.059 sigmoid 核函数的模型测试集得分: 0.075 poly 核函数的模型训练集得分: 0.195 poly 核函数的模型测试集得分: 0.207
这个结果是非常糟糕的。通过下面程序来看一下数据分布图。
ax = plt.gca() #将特征数字中的最大和最小值一散点图形式画出来 plt.plot(X.min(axis=0),'v',label='min') plt.plot(X.max(axis=0),'^',label='max') plt.yscale('log') #纵坐标为对数形式 plt.legend(loc='best') #设置图注位置最佳 ax.set_xlabel('feature') ax.set_ylabel('featuremagnitude') plt.show()
图标横坐标是第几个样本,对应纵坐标为数据的最大最小值数据,由此可见数据在10-2到103之间,差距更大。下面我们通过StandardScaler()函数来对训练集和测试集数据进行预处理。
#对训练集和测试集数据进行预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaler =scaler.transform(X_train) X_test_scaler = scaler.transform(X_test) plt.plot(X_train_scaler.min(axis=0),'v',label='trainset min') plt.plot(X_train_scaler.max(axis=0),'^',label='trainset max') plt.plot(X_test_scaler.min(axis=0),'v',label='testset min') plt.plot(X_test_scaler.max(axis=0),'^',label='testset max') plt.legend(loc='best') ax.set_xlabel('scaledfeature') ax.set_ylabel('scaledfeature magnitude') plt.show()
这样数据集中在-4到10之间。我们通过预处理后的数据进行训练模型。
for kernel in ['linear','rbf','sigmoid','poly']:
svr =svm.SVR(kernel=kernel)
svr.fit(X_train_scaler,y_train)
print(kernel,'预处理后训练集得分:{:.3f}'.format(svr.score(X_train_scaler,y_train)))
print(kernel,'预处理后测试集得分:{:.3f}'.format(svr.score(X_test_scaler,y_test)))
输出:
linear 预处理后训练集得分: 0.706 linear 预处理后测试集得分: 0.698 rbf 预处理后训练集得分: 0.665 rbf 预处理后测试集得分: 0.695 sigmoid 预处理后训练集得分: 0.564 sigmoid 预处理后测试集得分: 0.634 poly 预处理后训练集得分: 0.686 poly 预处理后测试集得分: 0.623
由此可见,Linear变化不大,其他都变化很大。下面我们调节下C与gamma参数,首先设置C=100,gamma=0.1。
# 调节参数 for kernel in ['linear','rbf','sigmoid','poly']: svr = svm.SVR(kernel=kernel,C=100,gamma=0.1) svr.fit(X_train_scaler,y_train) print(kernel,'调节参数后训练集得分: {:.3f}'.format(svr.score(X_train_scaler,y_train))) print(kernel,'调节参数后测试集得分:{:.3f}'.format(svr.score(X_test_scaler,y_test)))
输出
linear 调节参数后训练集得分: 0.706 linear 调节参数后测试集得分: 0.699 rbf 调节参数后训练集得分: 0.966 rbf 调节参数后测试集得分: 0.894 sigmoid 调节参数后训练集得分: -3768.620 sigmoid 调节参数后测试集得分: -5454.605 poly 调节参数后训练集得分: 0.950 poly 调节参数后测试集得分: 0.318
然后我们看一下C=100,gamma=0.005
# 调节参数 for kernel in ['linear','rbf','sigmoid','poly’]: svr =svm.SVR(kernel=kernel,C=100,gamma=0.005) svr.fit(X_train_scaler,y_train) print(kernel,'调节参数(C=100,gamma=0.005)后训练集得分:{:.3f}'.format(svr.score(X_train_scaler,y_train))) print(kernel,'调节参数(C=100,gamma=0.005)后测试集得分: {:.3f}'.format(svr.score(X_test_scaler,y_test)))
输出
linear 调节参数后训练集得分: 0.706 linear 调节参数后测试集得分: 0.699 rbf 调节参数后训练集得分: 0.841 rbf 调节参数后测试集得分: 0.829 sigmoid 调节参数后训练集得分: 0.698 sigmoid 调节参数后测试集得分: 0.695 poly 调节参数后训练集得分: 0.240 poly 调节参数后测试集得分: 0.232
最后绘制表格,分析一下输出结果。
模型 |
预处理前 |
预处理后 |
调节参数后(gamma=0.1) |
调节参数(gamma=0.005) |
默认gamma与C |
C=100 |
|||
linear |
0.709 |
0.706 |
0.706 |
0.706 |
0.696 |
0.698 |
0.699(不变) |
0.699(不变) |
|
rbf |
0.192 |
0.665 |
0.966 |
0.841 |
0.222 |
0.695 |
0.894(提高) |
0.829(略降) |
|
sigmoid |
0.059 |
0.564 |
-3768.620 |
0.698(提高) |
0.075 |
0.634 |
-5454.605(失控) |
0.695 |
|
poly |
0.195 |
0.686 |
0.950 |
0.240(降低,但是不存在过拟合) |
0.207 |
0.623 |
0.318(过拟合) |
0.232 |
通过调节可以看出:
- linear基本不受影响;
- C=100,gamma=0.1:sigmoid失控,poly出现过拟合,rbf表现很好。
- C=100,gamma=0.005:sigmoid恢复,poly出现降低,但是没有过拟合现象,rbf略有下降。
由此可见,选择模型类型和调节参数是非常重要的。
—————————————————————————————————
软件安全测试
https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486
接口自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486
DevOps 和Jenkins之DevOps
https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486
DevOps与Jenkins 2.0之Jenkins
https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486
Selenium自动化测试
https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486
性能测试第1季:性能测试基础知识
https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486
性能测试第2季:LoadRunner12使用
https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486
性能测试第3季:JMeter工具使用
https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486
性能测试第4季:监控与调优
https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486
Django入门
https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486
啄木鸟顾老师漫谈软件测试
https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486