您的位置:首页 > 其它

sklearn学习——SVM例程总结1(outlier and unbalanced classes)

2017-02-26 13:18 351 查看

写在前面的话

最近两周一直在看SVM,有人称它为数学届的奇迹,推导过程极其重要,其中蕴含的思想和技巧是极其深刻和巧妙的,对学习者而言,过程的推导的意义甚至超过了应用层面。这里推荐几本书:李航的《统计学习方法》,周志华的《机器学习》,《Pattern Recognition and Machine Learning》书中详细介绍了推导过程。这里不做推导过程和原理的叙述,只从sklearn例程说起。

先来个简单的:

例程1:利用线性和非线性核做回归

http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html#sphx-

[python]
#导入的常用库并给予实例
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt

#用于训练学习和预测,其中用到SVR().fit(X,Y).predict(X)
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=2)
y_rbf = svr_rbf.fit(X, y).predict(X)
y_lin = svr_lin.fit(X, y).predict(X)
y_poly = svr_poly.fit(X, y).predict(X)


来个复杂一点的,但是库没增加

例2:NonlinearSVM

http://scikitlearn.org/stable/auto_examples/svm/plot_svm_nonlinear.html#sphx-glr-auto-examples-svm-plot-svm-nonlinear-py

[python]
# plot the decision function for each datapoint on the #grid
Z = clf.decision_function(np.c_[xx.ravel(), \yy.ravel()])#用于计算每个网格点到分离超平面的距离
Z = Z.reshape(xx.shape)#写成xx矩阵大小的形式。
plt.imshow(Z, interpolation='nearest',extent=(xx.min(),'''  xx.max(), yy.min(), yy.max()),aspect='auto',origin='lower', cmap=plt.cm.PuOr_r)#plt.imshow用于画二维彩色图像,Z的大小对应着颜#色的改变,cmap=plt.cm.PuOr_r用于表示颜色,这里具体参数值含义还不是##很理解,可以调调程序感受一下就行了。
contours = plt.contour(xx, yy, Z, levels=[0], linewidths=2,linetypes='--')#contour用于在网格上画等高线,levels=[0],表示等高线的值。
#以上复杂是在画图上,可视化确实是一个很大的学问!


再来个复杂点的

例3:Separating hyperplane for unbalanced classes

[不平衡数据集的分类问题]

http://scikit-learn.org/stable/auto_examples/svm/plot_separating_hyperplane_unbalanced.html#sphx-glr-auto-examples-svm-plot-separating-hyperplane-unbalanced-py

首先,什么是不平衡数据集?

网络样本、金融样本以及生物样本中,观测样本具有涌现性,大量的样本中有用的样本点很少。这种某类样本的数量明显少于其他类样本数量的样本集称为不均衡样本集

其次,为什么 会有不平衡数据问题?

传统的学习方法以降低总体分类精度为目标,将所有样本一视同仁,同等对待,造成了分类器在多数类的分类精度较高而在少数类的分类精度很低。机器学习模型都有一个待优化的损失函数,以我们最常用最简单的二元分类器逻辑回归为例,其损失函数如下公式1所示,逻辑回归以优化总体的精度为目标,不同类别的误分类情况产生的误差是相同的,考虑一个500:1500:1的数据集,即使把所有样本都预测为多数类其精度也能达到500/501500/501之高,很显然这并不是一个很好的学习效果,因此传统的学习算法在不平衡数据集中具有较大的局限性。



最后,不平衡数据集的特点以及如何处理?

有时对少数类错分情况的后果很严重,比如癌症患者被误诊为健康人。所以需要的分类器应该是在不严重损失多数类精度的情况下,在少数类上获得尽可能高的精度

同时也暗示着使用单一的评价准则,例如全局精度或是误差率,是不能给不均衡问题提供足够的评价信息。因此利用含有更多信息的评价指标,例如接收机特性曲线、精度-recall曲线和代价曲线。

不平衡数据的分类问题是一个很现实的问题,很重要,已经有了几种解决方法。

具体可以参看:

[该昵称已经被占用]的博客http://blog.csdn.net/u011414200/article/details/47310795

[qq_34531825]的博客

http://blog.csdn.net/qq_34531825/article/details/52881804

[Xubao’s Blog]的博客

http://baogege.info/2015/11/16/learning-from-imbalanced-data/

[从实际经验中选择合适的方法]

http://www.zhaokv.com/2016/01/learning-from-imbalanced-data.html

[综述论文Learning from Imbalanced Data]

http://www.ele.uri.edu/faculty/he/PDFfiles/ImbalancedLearning_lecturenotes.pdf

本例从算法层面,利用加权法,也就是说,允许正负样本的函数间隔边界不同,C+/C-越大,对该类型误分类惩罚增大(也就是训练学习的越好)。本例中将1类数据惩罚系数为10,即C+=10,代码为
class_weight={1:10}
或者
class_weight=‘auto’
或者
class_weight={0:0.1}




[python]
w = clf.coef_[0]#coef_[0],intercept_[0]用于获取
#linear_classification中系数w,b
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - clf.intercept_[0] / w[1]#计算分离超平面,用网
#格点的形式
# get the separating hyperplane using weighted classes
wclf = svm.SVC(kernel='linear', class_weight={1: 10})
wclf.fit(X, y)#训练样本


例4,[Weighted samples]

http://scikit-learn.org/stable/auto_examples/svm/plot_weighted_samples.html#sphx-glr-auto-examples-svm-plot-weighted-samples-py

这里用sample_weight方法解决outlier问题,目的和class_weight一样,都是对不同样本点选取不同的惩罚系数,达到自适应学习的目的。

sample_weight_last_ten = abs(np.random.randn(len(X)))
sample_weight_constant = np.ones(len(X))
# and bigger weights to some outliers
#偏离正常位置很远的数据点,我们称之为 outlier
#例如可能并不是因为数据本身是非线性结构的,而只是因为数据有噪音。对于这#种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM ##模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有##少数几个 support vector 组成的,如果这些 support vector 里又存#在 outlier 的话,其影响就很大了。
sample_weight_last_ten[15:] *= 5#[15,16,17,18,19,20]*5
sample_weight_last_ten[9] *= 15

# for reference, first fit without class weights

# fit the model
clf_weights = svm.SVC()
clf_weights.fit(X, y, sample_weight=sample_weight_last_ten)
clf_no_weights = svm.SVC()
clf_no_weights.fit(X, y)


这里提醒一下,现实中大部分数据是存在outlier and unbalanced classes,这种情况下,尽管多数类大部分预测对了,计算出的正确率很高,但少数类预测错了大部分,其正确率却很低。这种情况是很危险的,比如癌症预测,很容易检测不出癌症患者。因此,传统的正确率计算不适应这类分类问题。比较好的评价模型性能指标是AUC。

可以参考如下文章:

[Xubao’s Blog]的博客

ROC和AUC介绍以及如何计算AUC

说到现在,其实以上例程都是 用于入门的,不过我也花了三天时间才能复现每一个程序。现在每天都忙于课题,之前还是关于机器学习的内容,后期,课题的需要又在整 机器人刚-柔耦合建模,信号处理,智能控制等等,除此之外,还要出差,老师给的一系列活儿,事情太多。不过,心在此,兴趣在此,相信未来也在此,继续加油,更深入的理解机器学习和其他算法知识,相信和我一样情况的人很多,比我情况更糟的人也有,他们能坚持下来,我也能。想想,一个人这一辈子如果不能坚持去做一件事情也是挺可悲的。坚定的做自己喜欢的事,乐此不疲,继续前行!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: