1.简介:
(1)无监督异常值检测
(2)解决非平衡样本分类
2.函数定义
class sklearn.svm.OneClassSVM(kernel=’rbf’, degree=3, gamma=’auto’, coef0=0.0, tol=0.001, nu=0.5, shrinking=True, cache_size=200, verbose=False, max_iter=-1, random_state=None)
3.参数含义:
kernel:
4.OneClass与2分类,多分类的区别
典型的2类问题:识别邮件是否是垃圾邮件,一类“是”,另一类“不是”
典型的多类问题:人脸识别,每个人对应的脸就是一个类,然后把待识别的脸分到对应的类中去
而OneClassClassification,它只有一个类,属于该类就返回结果“是”,不属于就返回结果“不是”,乍一听感觉与2分类没什么区别,其实他们的思想有很大差异。在2分类问题中,训练集中就由两个类的样本组成,训练出的模型是一个2分类模型;而OneClassClassification中的训练样本只有一类,因此训练出的分类器将不属于该类的所有其他样本判别为“不是”即可,而不是由于属于另一类才返回的“不是”结果。
现实场景中的OneClassClassification例子:现在有一堆某商品的历史销售数据,记录着买该产品的用户信息,此外还有一些没有购买过该产品的用户信息,想通过2分类来预测他们是否会买该产品,也就是弄两个类,一类是“买”,一类是“不买”。当我们要开始训练2分类器的时候问题来了,一般来说没买的用户数会远远大于已经买了的用户数,当将数量不均衡的正负样本投入训练时,训练出的分类器会有较大的bias(偏向值)。因此,这时可以使用OneCLassClassification方法来解决,即训练集中只有已经买过该产品的用户数据,在识别一个新用户是否会买该产品时,识别结果就是“会”或者“不会”。
5.OneClassCLassification的具体实现
多类Classification方法有很多,比如SVM寻找一个最优超平面把正负样本分开,总之都涉及到不止一个类的样本,相当于告诉算法“这种东西长什么样,那种东西长什么样”。于是训练出一个模型能够区分这些东西。
问题在于,OneCLassClassification只有一个类,该怎么办?
介绍一个方法:SVDD(support vector domain description),中文翻译为“支持向量域描述”
其基本思想是:既然只有一个class,那么我就训练出一个最小的超球面(超球面是指3维以上的空间中的球面,对应的2维空间中就是曲线,3维空间中就是球面),将这堆数据全部“包起来”,识别一个新的数据点时,如果这个数据点落在超球面内,就属于这个类,否则不是。
下面是在2维空间(实际情况中,如果提取的特征多,维数就高)中的例子,
更多原理公式推导,详见 http://blog.sina.com.cn/s/blog_4ff49c7e0102vlbv.html