支持向量机实战
这次我们使用Jupyter Notebook来完成Support Vector Machines的探索!
我们这次使用的实验数据是非常典型的分类数据集——Iris 数据集。Iris中文名为鸢尾花,此数据集包含了150个数据样本,分为三类,每类50个数据,每个数据包含了4个属性(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。我们接下来会使用SVM模型去预测鸢尾花属于下列种类(Setosa、Versicolour、Virginica)的哪一个。
因为数据集很经典,所以我们不需要特地把数据集单独下载下来,可以通过网址直接在Jupyter Notebook上得到。
获取数据:
# The Iris Setosa
from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/5/56/Kosaciec_szczecinkowaty_Iris_setosa.jpg'
Image(url,width=300, height=300)
# The Iris Versicolor
from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/4/41/Iris_versicolor_3.jpg'
Image(url,width=300, height=300)
# The Iris Virginica
from IPython.display import Image
url = 'http://upload.wikimedia.org/wikipedia/commons/9/9f/Iris_virginica.jpg'
Image(url,width=300, height=300)
读入数据后进行编写:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
iris = sns.load_dataset('iris')
EDA
在开始建模之前可视化数据是一个十分重要的环节,他可以很好的帮助你理解各个Feature之间的关系。完善的EDA会让我们在之后的建模环节有清楚的目的性!但是这项重要的工作被很多人忽略了!
我们先全局画一张图标,这样更能掌握变量关系。之后我们在进行细化可视化。
# Setosa is the most separable.
sns.pairplot(iris,hue='species',palette='Dark2')
我们选择其中一个Feature进行可视化,这里我们选择了Setosa的花萼宽度。
setosa = iris[iris['species']=='setosa']
sns.kdeplot( setosa['sepal_width'], setosa['sepal_length'],
cmap="plasma", shade=True, shade_lowest=False)
Model:
1·拆分数据集,将数据集拆成训练数据和预测数据两部分;
from sklearn.model_selection import train_test_split
X = iris.drop('species',axis=1)
y = iris['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
2·建模;
from sklearn.svm import SVC
svc_model = SVC()
svc_model.fit(X_train,y_train)
以上我们建模就完成了,我们进行预测。
3·预测;
predictions = svc_model.predict(X_test)
from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))
我们可以看到就算不进行优化,这个准确率也是十分惊人的。但主要还是数据集很简单,并且数据很少的缘故。但是我们使用简单的数据集有助于我们理解较为复杂的模型。
4·优化;
模型越是复杂,训练好的模型就越是困难。接下来介绍几个重要的超参数:
超参数是什么呢?他是模型在数据学习中学不到的东西,需要人为调节才能达到最好效果。
1·C :控制着能接受错误的最大程度(防止模型过拟合);
2·Gamma :控制投影规则的影响范围;
下面是一张C、gamma不同组合的示意图,可以帮助我们更好的理解其中含义:
在进行超参数搜寻的时候我们需要用到一个工具——GridsearchCV
在设定好C、gamma的搜寻区间之后,我们就可以进行搜寻了,当然,这里我们只是进行了较为简单的粗略搜寻。较为精细的搜寻我们以后会介绍,他会结合GridsearchCV和RandomizedsearchCV.
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1,1, 10, 100], 'gamma': [1,0.1,0.01,0.001]}
grid = GridSearchCV(SVC(),param_grid,refit=True,verbose=2)
grid.fit(X_train,y_train)
结果:
因为GridsearchCV中的refit参数我们设置为True,代表在找到最佳的配置之后会重新训练模型,所以我们在预测的时候就可以直接使用上述模型啦。
grid_predictions = grid.predict(X_test)
print(classification_report(y_test,grid_predictions))
我们可以看到这个准确度还是有提高的,对于我们来说模型越精准越好,最好能100%预测,所以对于这种模型的优化是无止境的,我们追求的就是极致。:)
OK!对于SVM的学习,我们就到这里了,以后会有更精彩的数据集和模型优化手段。