機器學習:12. SVM支持向量機(下)

二分類SVC的進階

1. 二分類SVC中的樣本不均衡問題:重要參數(shù)class_weight

樣本不均衡是指在一組數(shù)據(jù)集中饰躲,標簽的一類天生占有很大的比例,但我們有著捕捉出某種特定的分類的需求的狀況校摩。
但是冗荸,分類模型天生會傾向于多數(shù)的類父阻,讓多數(shù)類更容易被判斷正確,少數(shù)類被犧牲掉侄旬。因此降传,這樣得到的模型評估指標將失去意義。此在支持向量機中勾怒,我們要大力依賴我們調(diào)節(jié)樣本均衡的參數(shù):SVC類中的class_weight和接口fit中可以設(shè)定的sample_weight婆排。

SVC的參數(shù):class_weight
可輸入字典或者"balanced”声旺,可不填,默認None 對SVC段只,將類i的參數(shù)C設(shè)置為class_weight [i] * C腮猖。

SVC的接口fit的參數(shù):sample_weight
數(shù)組,結(jié)構(gòu)為 (n_samples, )赞枕,必須對應(yīng)輸入fit中的特征矩陣的每個樣本在fit時的權(quán)重澈缺。較大的權(quán)重加在少數(shù)類的樣本上,以迫使模型向著少數(shù)類的方向建模炕婶。
參數(shù)的使用
1 導入庫

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs

2 創(chuàng)建樣本不均衡數(shù)據(jù)集

class_1 = 500 #類別1有500個樣本 10:1
class_2 = 50 #類別2只有50個
centers = [[0.0, 0.0], [2.0, 2.0]] #設(shè)定兩個類別的中心
clusters_std = [1.5, 0.5] #設(shè)定兩個類別的方差姐赡,通常來說,樣本量比較大的類別會更加松散

X, y = make_blobs(n_samples=[class_1, class_2], #n_samples=[標簽1樣本數(shù), 標簽2樣本數(shù)]
                        centers=centers,
                        cluster_std=clusters_std,
                        random_state=0, shuffle=False)
X.shape

#看看數(shù)據(jù)集長什么樣
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="rainbow",s=10)
#其中紅色點是少數(shù)類柠掂,紫色點是多數(shù)類
image.png

3. 在數(shù)據(jù)集上分別建模

#不設(shè)定class_weight
clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(X, y)

#設(shè)定class_weight
wclf = svm.SVC(kernel='linear', class_weight={1: 10}) #少數(shù)類1占的權(quán)重是10
wclf.fit(X, y)

#給兩個模型分別打分看看项滑,這個分數(shù)是accuracy準確度
#可以看到做樣本均衡后,準確率下降了
clf.score(X,y)
wclf.score(X,y)
輸出結(jié)果

4. 繪制兩個模型下數(shù)據(jù)的決策邊界

#首先要有數(shù)據(jù)分布
plt.figure(figsize=(6,5))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="rainbow",s=10)
ax = plt.gca() #獲取當前的子圖涯贞,如果不存在枪狂,則創(chuàng)建新的子圖

#繪制決策邊界的第一步:要有網(wǎng)格
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T

#第二步:找出我們的樣本點到?jīng)Q策邊界的距離
Z_clf = clf.decision_function(xy).reshape(XX.shape)
a = ax.contour(XX, YY, Z_clf, colors='black', levels=[0], alpha=0.5, linestyles=['-'])

Z_wclf = wclf.decision_function(xy).reshape(XX.shape)
b = ax.contour(XX, YY, Z_wclf, colors='red', levels=[0], alpha=0.5, linestyles=['-'])

#第三步:畫圖例
plt.legend([a.collections[0], b.collections[0]], ["non weighted", "weighted"],
            loc="upper right")
plt.show()
兩個模型

可以看到做了樣本平衡后,少數(shù)類幾乎全部都被分類正確了宋渔,但是多數(shù)類有許多被分錯了州疾。沒有做樣本均衡時,多數(shù)類分布正確皇拣,但是少數(shù)類分布錯誤的多严蓖,所以沒做均衡的準確率反而高,就可以理解了氧急。做均衡是為了能夠更加準確得評判少數(shù)類谈飒。

圖例這一步是怎么做到的

a.collections #調(diào)用這個等高線對象中畫的所有線,返回一個惰性對象

#用[*]把它打開試試看
[*a.collections] #返回了一個linecollection對象态蒂,其實就是我們等高線里所有的線的列表

#現(xiàn)在我們只有一條線,所以我們可以使用索引0來鎖定這個對象
a.collections[0]

#plt.legend([對象列表],[圖例列表],loc)
#只要對象列表和圖例列表相對應(yīng)费什,就可以顯示出圖例
image.png

2 SVC的模型評估指標

在現(xiàn)實中钾恢,我們往往都在追求捕捉少數(shù)類,因為在很多情況下鸳址,將少數(shù)類判斷錯的代價是巨大的瘩蚪。所以在現(xiàn)實中,我們往往在尋找捕獲少數(shù)類的能力和將多數(shù)類判錯后需要付出的成本的平衡稿黍。為了評估這樣的能力疹瘦,我們將引入新的模型評估指標:混淆矩陣和ROC曲線來幫助我們。

2.1 混淆矩陣

混淆矩陣是二分類問題的多維衡量指標體系巡球,在樣本不平衡時極其有用言沐。在混淆矩陣中邓嘹,我們將少數(shù)類認為是正例,多數(shù)類認為是負例险胰。在決策樹汹押,隨機森林這些普通的分類算法里,即是說少數(shù)類是1起便,多數(shù)類是0棚贾。在SVM里,就是說少數(shù)類是1榆综,多數(shù)類是-1妙痹。普通的混淆矩陣,一般使用{0,1}來表示鼻疮。


混淆矩陣中怯伊,永遠是真實值在前,預(yù)測值在后

2.1.1 模型整體效果:準確率

準確率Accuracy就是所有預(yù)測正確的所有樣本除以總樣本陋守,通常來說越接近1越好震贵。

準確率

2.1.2 捕捉少數(shù)類的藝術(shù):精確度,召回率和F1 score

精確度

精確度Precision水评,又叫查準率猩系,表示所有被我們預(yù)測為是少數(shù)類的樣本中,真正的少數(shù)類所占的比例
image.png

在支持向量機中中燥,精確度可以被形象地表示為決策邊界上方的所有點中寇甸,紅色點所占的比例。精確度越高疗涉,代表我們捕捉正確的紅色點越多拿霉,對少數(shù)類的預(yù)測越精確。當每一次將多數(shù)類判斷錯誤的成本非常高昂的時候(比如大眾召回車輛的例子)咱扣,我們會追求高精確度绽淘。

召回率

召回率Recall,又被稱為敏感度(sensitivity)闹伪,表示所有真實為1的樣本中沪铭,被我們預(yù)測正確的樣本所占的比例。召回率越高偏瓤,代表我們盡量捕捉出了越多的少數(shù)類杀怠。如果我們希望不計一切代價,找出少數(shù)類(比如找出潛在犯罪者的例子)厅克,那我們就會追求高召回率赔退。

而召回率和精確度是此消彼長的,兩者之間的平衡代表了捕捉少數(shù)類的需求和盡量不要誤傷多數(shù)類的需求的平衡。究竟要偏向于哪一方硕旗,取決于我們的業(yè)務(wù)需求:究竟是誤傷多數(shù)類的成本更高窗骑,還是無法捕捉少數(shù)類的代價更高。

2.1.3 判錯多數(shù)類的考量:特異度與假正率

特異度(Specificity)表示所有真實為0的樣本中卵渴,被正確預(yù)測為0的樣本所占的比例慧域。

特異度

特異度衡量了一個模型將多數(shù)類判斷正確的能力,而1 - specificity就是一個模型將多數(shù)類判斷錯誤的能力浪读,叫做假正率(False Positive Rate):

假正率FPR

2.1.4 sklearn中的混淆矩陣

image.png

2.2 ROC曲線和相關(guān)問題

ROC曲線昔榴,全稱The Receiver Operating Characteristic Curve,譯為受試者操作特性曲線碘橘。這是一條以不同閾值下的假正率FPR為橫坐標互订,不同閾值下的召回率Recall為縱坐標的曲線。橫坐標是FPR痘拆,代表著模型將多數(shù)類判斷錯誤的能力仰禽,縱坐標Recall,代表著模型捕捉少數(shù)類的能力纺蛆,所以ROC曲線代表著吐葵,隨著Recall的不斷增加,F(xiàn)PR如何增加桥氏。我們建立ROC曲線的根本目的是找尋Recall和FPR之間的平衡温峭,讓我們能夠衡量模型在盡量捕捉少數(shù)類的時候,誤傷多數(shù)類的情況會如何變化字支。

2.2.1 重要接口decision_function

我們在畫等高線凤藏,也就是決策邊界的時候曾經(jīng)使用SVC的接口decision_function,它返回我們輸入的特征矩陣中每個樣本到劃分數(shù)據(jù)集的超平面的距離堕伪。所以揖庄,到超平面的距離一定程度上反應(yīng)了樣本歸屬于某個標簽類的可能性。接口decision_function返回的值也因此被我們認為是SVM
中的置信度(confidence)欠雌。

2.2.2 sklearn中的ROC曲線和AUC面積

在sklearn中蹄梢,我們有幫助我們計算ROC曲線的橫坐標假正率FPR,縱坐標Recall和對應(yīng)的閾值的類sklearn.metrics.roc_curve富俄。同時禁炒,我們還有幫助我們計算AUC面積的類sklearn.metrics.roc_auc_score.


sklearn.metrics.roc_curve

sklearn中的ROC曲線和AUC面積

from sklearn.metrics import roc_curve
#drop_intermediate=True默認是TRUE,舍棄一些ROC上不顯示的閾值點蛙酪,這里就計算了45個
FPR, recall, thresholds = roc_curve(y,clf_proba.decision_function(X), pos_label=1)

FPR.shape

recall.shape

thresholds #此時的threshold就不是一個概率值,而是距離值中的閾值了翘盖,所以它可以大于1桂塞,也可以為負
輸出結(jié)果

sklearn.metrics.roc_auc_score (y_true, y_score, average=’macro’, sample_weight=None, max_fpr=None)
AUC面積的分數(shù)使用以上類來進行計算,輸入的參數(shù)也比較簡單馍驯,就是真實標簽阁危,和與roc_curve中一致的置信度分數(shù)或者概率值玛痊。

計算AUC

from sklearn.metrics import roc_auc_score as AUC
area = AUC(y,clf_proba.decision_function(X))
area

0.9696400000000001
畫圖

plt.figure()
plt.plot(FPR, recall, color='red',
            label='ROC curve (area = %0.2f)' % area)
plt.plot([0, 1], [0, 1], color='black', linestyle='--')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
ROC曲線

2.2.3 利用ROC曲線找出最佳閾值

在ROC曲線中,隨著recall的變大狂打,F(xiàn)PR的大小越小越好擂煞。所以我們希望找到的最有點,其實是Recall和FPR差距最大的點趴乡。這個點对省,又叫做約登指數(shù)。

#找出max(recall - FPR)對應(yīng)的索引
maxindex = (recall - FPR).tolist().index(max(recall - FPR))
#decision_function生成的置信度來說是-1.08晾捏,用概率返回的就是概率
thresholds[maxindex] #該索引對應(yīng)的就是thresholds就是最佳閾值

-1.0860191749391461

看看這個點在圖片上哪里

plt.figure()
plt.plot(FPR, recall, color='red',
label='ROC curve (area = %0.2f)' % area)
plt.plot([0, 1], [0, 1], color='black', linestyle='--')
#我們可以在圖像上來看看這個點在哪里
plt.scatter(FPR[maxindex],recall[maxindex],c="black",s=30) 
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
image.png

最佳閾值就這樣選取出來了蒿涎,由于現(xiàn)在我們是使用decision_function來畫ROC曲線,所以我們選擇出來的最佳閾值其實是最佳距離惦辛。如果我們使用的是概率劳秋,我們選取的最佳閾值就會使一個概率值了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胖齐,一起剝皮案震驚了整個濱河市玻淑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呀伙,老刑警劉巖补履,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異区匠,居然都是意外死亡干像,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門驰弄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻汰,“玉大人,你說我怎么就攤上這事戚篙∥弼辏” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵岔擂,是天一觀的道長位喂。 經(jīng)常有香客問我,道長乱灵,這世上最難降的妖魔是什么塑崖? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮痛倚,結(jié)果婚禮上规婆,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好抒蚜,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布掘鄙。 她就那樣靜靜地躺著,像睡著了一般嗡髓。 火紅的嫁衣襯著肌膚如雪操漠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天饿这,我揣著相機與錄音浊伙,去河邊找鬼。 笑死蛹稍,一個胖子當著我的面吹牛吧黄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唆姐,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拗慨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奉芦?” 一聲冷哼從身側(cè)響起赵抢,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎声功,沒想到半個月后烦却,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡先巴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年其爵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伸蚯。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡摩渺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剂邮,到底是詐尸還是另有隱情摇幻,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布挥萌,位于F島的核電站绰姻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏引瀑。R本人自食惡果不足惜狂芋,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憨栽。 院中可真熱鬧帜矾,春花似錦辆影、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锯蛀。三九已至灭衷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旁涤,已是汗流浹背翔曲。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劈愚,地道東北人瞳遍。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像菌羽,于是被迫代替她去往敵國和親掠械。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容