当前位置:首页>资讯 >渠道商圈>程序员技术分享:训练机器学习 SVM算法解析

程序员技术分享:训练机器学习 SVM算法解析

2012-12-29 责任编辑:未填 浏览数:未显示 中贸商网-贸易商务资源网

核心提示:  【CSDN报道】支持向量机(Support Vector Machine)已经成为一种非常受欢迎的算法。在这篇文章里,Greg Lamp简单解释了它是如何

  【CSDN报道】支持向量机(Support Vector Machine)已经成为一种非常受欢迎的算法。在这篇文章里,Greg Lamp简单解释了它是如何进行工作的,同时他也给出了使用Python Scikits库的几个示例。所有代码在Github上都是可用的,Greg Lamp以后还会对使用Scikits以及Sklearn的细节问题进行更深一步的阐述。CSDN对本篇技术性文章进行了编译整理:

  SVM是什么?

  SVM是一种训练机器学习的算法,可以用于解决分类和回归问题,同时还使用了一种称之为kernel trick的技术进行数据的转换,然后再根据这些转换信息,在可能的输出之中找到一个**的边界。简单来说,就是做一些非常复杂的数据转换工作,然后根据预定义的标签或者输出进而计算出如何分离用户的数据。

  是什么让它变得如此的强大?

  当然,对于SVM来说,完全有能力实现分类以及回归。在这篇文章中,Greg Lamp主要关注如何使用SVM进行分类,特别是非线性的SVM或者SVM使用非线性内核。非线性SVM意味着该算法计算的边界没有必要是一条直线,这样做的好处在于,可以捕获更多数据点集之间的复杂关系,而无需靠用户自己来执行困难的转换。其缺点就是由于更多的运算量,训练的时间要长很多。

  什么是kernel trick?

  kernel trick对接收到的数据进行转换:输入一些你认为比较明显的特征进行分类,输出一些你完全不认识的数据,这个过程就像解开一个DNA链。你开始是寻找数据的矢量,然后把它传给kernel trick,再进行不断的分解和重组直到形成一个更大的数据集,而且通常你看到的这些数据非常的难以理解。这就是神奇之处,扩展的数据集拥有更明显的边界,SVM算法也能够计算一个更加优化的超平面。

  其次,假设你是一个农场主,现在你有一个问题——你需要搭建一个篱笆来防止狼对牛群造成伤害。但是篱笆应该建在哪里呢?如果你是一个以数据为驱动的农场主,那么你就需要在你的牧场上,依据牛群和狼群的位置建立一个“分类器”,比较这几种(如下图所示)不同的分类器,我们可以看到SVM完成了一个很完**解决方案。Greg Lamp认为这个故事漂亮的说明了使用非线性分类器的优势。显而易见,逻辑模式以及决策树模式都是使用了直线方法。

  

 

  实现代码如下:farmer.py Python

  importnumpyasnpimportpylabasplfromsklearnimportsvmfromsklearnimportlinear_modelfromsklearnimporttreeimportpandasaspddefplot_results_with_hyperplane(clf,clf_name,df,plt_nmbr):x_min,x_max=df.x.min()-.5,df.x.max()+.5y_min,y_max=df.y.min()-.5,df.y.max()+.5#stepbetweenpoints.i.e.[0,0.02,0.04,...]step=.02#toplottheboundary,we'regoingtocreateamatrixofeverypossiblepoint#thenlabeleachpointasawolforcowusingourclassifierxx,yy=np.meshgrid(np.arange(x_min,x_max,step),np.arange(y_min,y_max,step))Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])#thisgetsourpredictionsbackintoamatrixZZ=Z.reshape(xx.shape)#createasubplot(we'regoingtohavemorethan1plotonagivenimage)pl.subplot(2,2,plt_nmbr)#plottheboundariespl.pcolormesh(xx,yy,Z,cmap=pl.cm.Paired)#plotthewolvesandcowsforanimalindf.animal.unique():pl.scatter(df[df.animal==animal].x,df[df.animal==animal].y,marker=animal,label="cows"ifanimal=="x"else"wolves",color='black',c=df.animal_type,cmap=pl.cm.Paired)pl.title(clf_name)pl.legend(loc="best")data=open("cows_and_wolves.txt").read()data=[row.split('\t')forrowindata.strip().split('\n')]animals=[]fory,rowinenumerate(data):forx,iteminenumerate(row):#x'sarecows,o'sarewolvesifitemin['o','x']:animals.append([x,y,item])df=pd.DataFrame(animals,columns=["x","y","animal"])df['animal_type']=df.animal.apply(lambdax:0ifx=="x"else1)#trainusingthexandypositioncoordiantestrain_cols=["x","y"]clfs={"SVM":svm.SVC(),"Logistic":linear_model.LogisticRegression(),"DecisionTree":tree.DecisionTreeClassifier(),}plt_nmbr=1forclf_name,clfinclfs.iteritems():clf.fit(df[train_cols],df.animal_type)plot_results_with_hyperplane(clf,clf_name,df,plt_nmbr)plt_nmbr+=1pl.show()

  让SVM做一些更难的工作吧!

  诚然,如果自变量和因变量之间的关系是非线性的,是很难接近SVM的准确性。如果还是难以理解的话,可以看看下面的例子:假设我们有一组数据集,它包含了绿色以及红色的点集。我们首先标绘一下它们的坐标,这些点集构成了一个具体的形状——拥有着红色的轮廓,周围充斥着绿色(看起来就像孟加拉国的国旗)。如果因为某些原因,我们丢失了数据集当中1/3的部分,那么在我们恢复的时候,我们就希望寻找一种方法,**程度地实现这丢失1/3部分的轮廓。

  那么我们如何推测这丢失1/3的部分**接近什么形状?一种方式就是建立一种模型,使用剩下接近80%的数据信息作为一个“训练集”。Greg Lamp选择三种不同的数据模型分别做了尝试:

  逻辑模型(GLM)

  决策树模型(DT)

  SVM

  Greg Lamp对每种数据模型都进行了训练,然后再利用这些模型推测丢失1/3部分的数据集。我们可以看看这些不同模型的推测结果:

  

 

  实现代码如下:svmflag.py Python

  importnumpyasnpimportpylabasplimportpandasaspdfromsklearnimportsvmfromsklearnimportlinear_modelfromsklearnimporttreefromsklearn.metricsimportconfusion_matrixx_min,x_max=0,15y_min,y_max=0,10step=.1#toplottheboundary,we'regoingtocreateamatrixofeverypossiblepoint#thenlabeleachpointasawolforcowusingourclassifierxx,yy=np.meshgrid(np.arange(x_min,x_max,step),np.arange(y_min,y_max,step))df=pd.DataFrame(data={'x':xx.ravel(),'y':yy.ravel()})df['color_gauge']=(df.x-7.5)**2+(df.y-5)**2df['color']=df.color_gauge.apply(lambdax:"red"ifx<=15else"green")df['color_as_int']=df.color.apply(lambdax:0ifx=="red"else1)print"Pointsonflag:"printdf.groupby('color').size()printfigure=1#plotafigurefortheentiredatasetforcolorindf.color.unique():idx=df.color==colorpl.subplot(2,2,figure)pl.scatter(df[idx].x,df[idx].y,colorcolor=color)pl.title('Actual')train_idx=df.x<10train=df[train_idx]test=df[-train_idx]print"TrainingSetSize:%d"%len(train)print"TestSetSize:%d"%len(test)#trainusingthexandypositioncoordiantescols=["x","y"]clfs={"SVM":svm.SVC(degree=0.5),"Logistic":linear_model.LogisticRegression(),"DecisionTree":tree.DecisionTreeClassifier()}#racehorsedifferentclassifiersandplottheresultsforclf_name,clfinclfs.iteritems():figure+=1#traintheclassifierclf.fit(train[cols],train.color_as_int)#getthepredictedvaluesfromthetestsettest['predicted_color_as_int']=clf.predict(test[cols])test['pred_color'] =test.predicted_color_as_int.apply(lambdax:"red"ifx==0else"green")#createanewsubplotontheplotpl.subplot(2,2,figure)#ploteachpredictedcolorforcolorintest.pred_color.unique():#plotonlyrowswherepred_colorisequaltocoloridx=test.pred_color==colorpl.scatter(test[idx].x,test[idx].y,colorcolor=color)#plotthetrainingsetaswellforcolorintrain.color.unique():idx=train.color==colorpl.scatter(train[idx].x,train[idx].y,colorcolor=color)#addadottedlinetoshowtheboundarybetweenthetrainingandtestset#(everythingtotherightofthelineisinthetestset)#thisplotsaverticallinetrain_line_y=np.linspace(y_min,y_max)#evenlyspacedarrayfrom0to10train_line_x=np.repeat(10,len(train_line_y)) #repeat10(thresholdfortraininset)ntimes#addablack,dottedlinetothesubplotpl.plot(train_line_x,train_line_y,'k--',color="black")pl.title(clf_name)print"ConfusionMatrixfor%s:"%clf_nameprintconfusion_matrix(test.color,test.pred_color)pl.show()

  结论:

  从这些实验结果来看,毫无疑问,SVM是**的优胜者。但是究其原因我们不妨看一下DT模型和GLM模型。很明显,它们都是使用的直线边界。Greg Lamp的输入模型在计算非线性的x, y以及颜色之间的关系时,并没有包含任何的转换信息。假如Greg Lamp它们能够定义一些特定的转换信息,可以使GLM模型和DT模型能够输出更好的效果,他们为什么要浪费时间呢?其实并没有复杂的转换或者压缩,SVM仅仅分析错了117/5000个点集(高达98%的准确率,对比而言,DT模型是51%,而GLM模型只有12%!)

  局限性在哪里?

  很多人都有疑问,既然SVM这么强大,但是为什么不能对一切使用SVM呢?很不幸,SVM**神奇的地方恰好也是它**的软肋!复杂的数据转换信息和边界的产生结果都难以进行阐述。这也是它常常被称之为“black box”的原因,而GLM模型和DT模型刚好相反,它们很容易进行理解。(编译/@CSDN王鹏,审校/仲浩)

  本文为CSDN编译整理,未经允许不得转载。如需转载请联系market@csdn.net

  (责任编辑:leonlee07)

分享到:
阅读上文 >> 2013,谷歌的数据科学家都将干什么呢?
阅读下文 >> 百度“语音助手” 免费美妆顾问

大家喜欢看的

  • 品牌
  • 资讯
  • 展会
  • 视频
  • 图片
  • 供应
  • 求购
  • 商城

版权与免责声明:

凡注明稿件来源的内容均为转载稿或由企业用户注册发布,本网转载出于传递更多信息的目的;如转载稿涉及版权问题,请作者联系我们,同时对于用户评论等信息,本网并不意味着赞同其观点或证实其内容的真实性;


本文地址:http://news.ceoie.com/show-160337.html

转载本站原创文章请注明来源:中贸商网-贸易商务资源网

微信“扫一扫”
即可分享此文章

友情链接

服务热线:0311-89210691 ICP备案号:冀ICP备2023002840号-2