您的位置:首页 > 其它

SVM分类器的概率校准在scikit-learn 中的几种实现方式

2018-02-19 19:05 627 查看
SVM分类器的分类结果只有类别,没有概率,属于maximum-margin 的方法

如果我们想从SVM的分类结果中得到属于某个类别的置信概率,就要用到 概率校准

经典的概率校准思路有Platt Scaling,核心思想就是把分类的结果作为新的训练集,用logistics回归再训练一个关系,得到具体的概率值

P(y=1∣x)=11+e(A∗f(x)+B)P(y=1∣x)=11+e(A∗f(x)+B)

具体的理论知识不赘述了,可以看文后引用的参考文献

scikit-learn 中进行概率校准很简单

1)有专门的函数 CalibratedClassifierCV,可以对训练好的分类器模型进行校准,校准过程用到了cross-validation,参数cv就是这个意思。

可选的方法有

sigmoid: 就是Platt Scaling 的 方法(我的理解)

isotonic: 用isotonic 回归替代了sigmoid,大体思路一样


这样的校准不仅用于SVC,还可以用在其他各种分类器上

2)专就SVC而言,sklearn 中也提供了一个参数,只要设置 ‘probability = True’,就可以获得预测概率,很简单

这个参数的实现原理也是Platt Scaling

概率校准结果的评价用Brier 分数。

Brier 分数反映预测概率的准确性,越小越好,等于0时,意味着完全正确,等于1时,意味着预测的概率完全不准。

下面是三种方法在Iris Flower 数据集上的应用的代码,分数不同,但反映不了具体的性能,仅供参考

0.导入相关的库

import numpy as np
from sklearn import datasets
from sklearn.svm import LinearSVC,SVC
from sklearn.preprocessing import StandardScaler
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import brier_score_loss
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt


1.导入Iris Flower 数据集

#只导入前两类,用两个类别100个数据
iris = datasets.load_iris()
X = iris.data[:100]
y = iris.target[:100]


2.数据标准化

scalar = StandardScaler()
X = scalar.fit_transform(X)


3.划分数据集

X_train, X_test = train_test_split(X,test_size = 0.2,random_state = 42)
y_train,y_test = train_test_split(y,test_size =0.2,random_state = 42)


y_test


array([1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0])


4.训练线性SVM分类器

linear_svc = LinearSVC(C=1.0)
clf = linear_svc.fit(X_train,y_train)


#随便选一个数据,作为后续预测的例子
x_sample = [X_train[66]]
y_sample = y_train[66]
y_sample


0


clf.predict(x_sample)


array([0])


5.概率校准

5.1 使用 isotonic regression

clf_isotonic = CalibratedClassifierCV(clf,cv=2,method = 'isotonic')
clf_isotonic.fit(X_train,y_train)


CalibratedClassifierCV(base_estimator=LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0),
cv=2, method='isotonic')


clf_isotonic.predict_proba(x_sample)


array([[1., 0.]])


5.2 使用sigmoid (Platt scaling)

clf_sigmoid = CalibratedClassifierCV(clf,cv=2,method = 'sigmoid')
clf_sigmoid.fit(X_train,y_train)


CalibratedClassifierCV(base_estimator=LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0),
cv=2, method='sigmoid')


clf_sigmoid.predict_proba(x_sample)


array([[0.95372182, 0.04627818]])


5.3 SVC 分类器自带参数校准(Platt scaling)

SVC_prob = SVC(kernel = 'linear',probability = True,random_state=0)
clf_prob = SVC_prob.fit(X_train,y_train)


clf_prob.predict_proba(x_sample)


array([[0.97512656, 0.02487344]])


6.使用Brier 分数评价结果

# isotonic 方法在测试集上对类别0 的预测概率
y_pred_isotonic = clf_isotonic.predict_proba(X_test)[:,0]
y_pred_isotonic


array([0.        , 0.        , 0.        , 1.        , 1.        ,
1.        , 1.        , 0.        , 1.        , 1.        ,
1.        , 1.        , 0.        , 1.        , 0.        ,
1.        , 0.        , 0.        , 1.        , 0.99224446])


clf_isotonic_score = brier_score_loss(y_test,y_pred_isotonic,pos_label=0)
clf_isotonic_score


3.007423463740823e-06


# sigmoid 方法在测试集上对类别0 的预测概率
y_pred_sigmoid = clf_sigmoid.predict_proba(X_test)[:,0]
y_pred_sigmoid


array([0.00868318, 0.02838737, 0.01635684, 0.91598769, 0.94559943,
0.95382487, 0.98198061, 0.06049953, 0.96589119, 0.96322886,
0.95022074, 0.93235678, 0.03351543, 0.98424352, 0.04139341,
0.96987556, 0.01385618, 0.00854675, 0.94583165, 0.91734167])


y_pred_sigmoid_score = brier_score_loss(y_test,y_pred_sigmoid,pos_label=0)
y_pred_sigmoid_score


0.0020438257628262657


# “SVC 参数” 方法在测试集上对类别0 的预测概率
y_pred_prob = clf_prob.predict_proba(X_test)[:,0]
y_pred_prob


array([8.01673220e-06, 1.14149792e-02, 3.07476903e-03, 9.61672027e-01,
9.67162468e-01, 9.77874749e-01, 9.94306123e-01, 3.01072891e-02,
9.81856911e-01, 9.83148483e-01, 9.65382710e-01, 9.69897739e-01,
9.03854695e-03, 9.92058842e-01, 1.60902778e-02, 9.86984501e-01,
1.55278635e-05, 3.76329999e-06, 9.78982637e-01, 9.46469035e-01])


y_pred_prob_score = brier_score_loss(y_test,y_pred_prob,pos_label = 0)
y_pred_prob_score


0.000535674433908579




参考文献

概率校准-sklearn 文档

Platt Scaling -wiki

Isotonic regression -wiki

Brier分数-sklearn 文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐