1. 程式人生 > >資料探勘(三)分類模型的描述與效能評估,以決策樹為例

資料探勘(三)分類模型的描述與效能評估,以決策樹為例

關於分類的第一部分我們要講一些關於分類的基本概念,然後介紹最基本的一種分類模型-決策樹模型,再基於此討論一下關於分類模型的效能評估。

===============================================================================

分類的直觀理解就是給定樣本的各類屬性,根據我們的模型或者某種規則將樣本劃分到若干不同的類別中,劃分目標是離散的就叫分類,如果是連續的我們就稱之為迴歸。所以,分類的官方定義就是:通過學習得到一個目標函式f,把每個屬性集x對映到一個預先定義的類標號中。

分類模型按照目的劃分可分為描述性建模和預測性建模。所謂描述性就是建立了一個分類模型之後,我們就可以得到哪些特徵對哪些類別有決定性的作用,是一個解釋性的工具,而預測性是指建立完模型後我們拿來用在一個未知的樣本,確定它的類別。還有要說的一點就是,分類技術適合用於二元或者標稱型別的資料集,因為分類不考慮隱含在目標類中的序數關係,僅僅考慮樣本各屬性上的異同。

就像上面所說的,分類模型其實同時具有描述性和預測性,描述性要求模型可以最大程度上符合訓練資料,而預測性則要求模型在未知資料上有較好的預測能力。因此訓練誤差不是我們唯一的判別標準,較好的泛化能力也是我們的主要訴求。所以在訓練分類模型的時候,我們通常將資料劃分成訓練集和檢驗集,其中訓練集用於建立模型,驗證集用於檢驗模型的泛化能力,當然這其中訓練集和檢驗集的劃分還涉及到很多問題,比如說資料的不平衡啊,樣本是否符合同一分佈等等,這裡我們先不討論這些問題,但是得知道劃分訓練集和檢驗集的必要性。

對於二元分類模型的效能通常根據模型正確和錯誤預測樣本計數進行評估,通常這些數字被存放在一個2*2的矩陣中,如下所示,我們稱之為混淆矩陣。

Predicted

1

0

Actual

1

a

b

0

c

d

其中,a,b,c,d分別是預測為1,0而實際是1,0的樣本個數,與混淆矩陣相關的概念有以下這麼幾個

準確率:正確預測數除以預測總數。(a+d)/(a+b+c+d)

錯誤率:錯誤預測數除以預測總數。(b+c)/(a+b+c+d)

精確率:正確預測為正類的樣本數除以實際正類的的數目。a/(a+c)

召回率:正確預測為正類的樣本數除以預測正類的數目。a/(a+b)

混淆矩陣確實叫人有點混淆,其中比較有意思的就是精確率和召回率了,通俗地講,這兩個對應的就是“找的準”和“找的全”,精確率是指預測為正的樣本中真正為正的樣本的概率,召回率是指實際為正的樣本中被預測為正的樣本的概率。在知乎上看到一位同學舉得一個例子,預測一個人到底是不是罪犯的時候,我們抱著不冤枉一個好人的原則,可能要求模型的精確率比較高,這樣找出來的罪犯基本都是罪犯,儘管有可能召回率低導致漏掉一些真正的罪犯,但這樣可以儘量避免冤枉好人;另一個場景,預測地震的時候,我們希望召回率儘量高,因為這樣我們可以避免漏過任何一次地震,儘管有可能導致精確率不高有很多次誤報,但我們依然不希望有任何一次地震被漏報。說了這麼多,相信你對這些二元分類模型的描述有點概念了,接下來我們講講如何在Python中劃分訓練檢驗集以及使用這些評價引數。這裡用的一個數據集是sklearn自帶的乳腺癌資料,根據30個特徵將該腫瘤劃分成初期和惡性,分類器用的決策樹。

from sklearn.datasets import load_breast_cancer
from sklearn.cross_validation import train_test_split
from sklearn import tree
from sklearn.metrics import confusion_matrix,classification_report

breast_cancer=load_breast_cancer()
data=breast_cancer.data
target=breast_cancer.target
x_train,x_test,y_train,y_test=train_test_split(data,target,test_size=0.3,random_state=0)
clf=tree.DecisionTreeClassifier(random_state=0)
clf.fit(x_train,y_train)
y_pred=clf.predict(x_test)
print '============================================================'
print 'Confusion Matrix'
print confusion_matrix(y_test,y_pred,labels=[1,0])
print '============================================================'
print classification_report(y_test,y_pred,labels=[1,0])

結果如下

============================================================

Confusion Matrix

[[97 11]

 [ 459]]

============================================================

            precision    recall  f1-score  support

         1       0.96      0.90     0.93       108

         0       0.84      0.94     0.89        63

avg / total       0.92     0.91      0.91       171

通過confusion_matrix和classification_report這兩個函式我們可以輕易地得到混淆矩陣及模型的精確率和召回率等等考慮在這個場景下,我們應該更注重模型的哪個引數呢?病人來看病我們的原則是啥,絕對不要漏掉一個真正的病患!因為有病誤診為沒病可能會要了病人的命,而沒病誤診為有病只會讓別人噴我是個庸醫,想忽悠別人多花點治療費,所以從醫生的立場來看,追求的是召回率一定要高,這才是負責任的做法。所以啊,學完這個是不是對醫生有多點理解呢,畢竟別人揹負了你生命的責任,條件允許的話就聽醫生的吧,該查的查,該治的治~

===============================================================================接下來我們介紹介紹決策樹演算法。之前在機器學習系列寫的決策樹在這裡,傳送門http://blog.csdn.net/sinat_22594309/article/details/59090895

在那篇文章裡我介紹了關於決策樹兩個最重要的部分,一是如何選擇劃分的屬性,常用的標準有資訊增益,資訊增益比和Gini係數;二是決策樹的損失函式,我們如何評價一個樹的優劣,一方面看分類之後的資訊增益,另一方面也要考慮模型的複雜度,同時這些也是我們優化決策樹的依據。這些內容我在這裡就不重複了,大家有興趣可以自己去看看。

相信很多同學對熵總是有點不理解,雖然知道該他可以衡量一個系統的混亂度,但究竟是為什麼,我這裡可以給出一個比較直觀的解釋,相信可以幫助大家理解。

1 假設袋子裡有四個球,A,B,C,D,每個被抽到的概率都為1/4,現在隨機從袋子裡拿一個,讓你猜這是哪個球。

最佳的策略是啥呢?先猜是不是AB,是的話就在AB之中,再問是A嗎就可確定;不是的話就在CD之中,再問是C嗎就能確定。所以正確猜中的次數的期望就是1/4*2*4=2。

2 袋子裡還是四個球,A,B,C,D,但是每個被抽中的概率變為1/2,1/4,1/8,1/8,還是隨機從袋子裡面拿一個猜是哪個球。

這個時候最佳的策略是啥?先猜是不是A,因為A概率最大很有可能一次猜中,不是的話就在BCD中,由於這三者中B概率最大,所以猜是不是B,不是的話,再猜是不是C就能確定是C還是D了。那麼這樣的話,猜中的次數的期望就是1/2*1+1/4*2+1/8*3*2=1.75。如果我們沒有采取最佳的策略而是沿用1的策略呢,猜中的次數的期望就是1/2*2+1/4*2+1/8*2*2=2。

寫到這裡,不知道機智的你發現了沒,每一種策略都對應了一個概率分佈。以第二個問題為例,策略1對應的概率分佈為(1/2,1/4,1/8,1/8),策略2對應的概率分佈為(1/4,1/4,1/4,1/4),然後對應的猜中次數的期望就是資料的實際分佈乘以策略對應概率分佈倒數的對數之和,這個形式是不是有點眼熟呢,如果策略使用的是真是分佈,那麼這個猜中次數的期望就是熵。很明顯,熵越大,猜中所需的次數越多,說明原始資料越混亂。但是如果採用策略所使用的不是真實分佈,那麼算出來的猜中次數期望會變大,我們將之稱為交叉熵。然後不同策略對應的交叉熵之差,我們就稱為相對熵。總結起來,如下:

真實分佈為Pk(k=1,2,3,4…),策略所用分佈為qk(k=1,2,3,4…)


此外,關於決策樹的特點,我覺得可以稍微總結一下:

1 決策樹是一種構建分類模型的非引數方法,它不假定類和其屬性服從一定的概率分佈。

2 決策樹的建立並不需要特別大的計算開銷,所以往往能很快完成構建,預測的速度也很快。

3 決策樹相對比較容易解釋,特別是在小資料集上。

4 決策樹對冗餘屬性不是很敏感,因為一旦有某個屬性被選中,與其相關的冗餘屬性會自動被忽略。

5 決策樹的決策邊界通常是直線,也就是隻涉及到某一個屬性,但其實也可以做斜決策樹,邊界為多個屬性的組合,不過這樣的計算開銷會變得很大,因為屬性組合是在太多,可以通過一開始構造符合屬性然後使用正常決策樹演算法達到構建斜決策樹的目的。

以上就是關於決策樹的一些補充內容,很多人覺得決策樹演算法相對初級一點,實際使用也只是在一些比較小的資料集上,但是畢竟它是Random Forest,GDBT等各種樹啊森林的基礎,所以也別小看它啦。另外,只要你想,決策樹在訓練集上的正確率可以做到非常非常高,這就引來了我們下一個話題,過擬合及分類器效能評價。

首先什麼是過擬合?通俗的來說,就是我們為了追求訓練集上的錯誤率儘可能低,將模型構建的十分複雜,導致構建的模型在測試集上表現效果反而很差。導致這種情況的原因有哪些呢?

1、 噪聲。由於過分追求訓練集的正確率,導致訓練集中的一些噪聲或例外也被擬合在我們的模型之中,這樣分類器在實際使用時出現較高的錯誤率就是不可避免的了。

2、 缺乏代表性的樣本。這種情況通常出現在資料集比較小的情況,由於訓練資料不夠或者很不平衡,導致對於某些種類缺乏代表性樣本,模型實際拿來預測的時候效果不好也就是意料之中的事兒了。

3、 多重比較過程。首先解釋一下多重比較過程,假如預測某一件事成功的概率為0.1,對於某個個體來說,確實成功的概率不高,但假如讓50個人同時來預測這件事,假設他們是獨立的,那麼50個人中有人成功的概率會很高。這在決策樹構建的過程中也是這樣,我們往往會設定一個閾值,然後用增益是否大於這個閾值來決定是否要拓展決策樹,然而資料的屬性是很多的,我們在選擇的時候其實就相當於是一個多重比較的過程,這樣找到一個劃分節點的機率就會大大增加,但其實這樣是有欺騙性的。

那麼如何避免過擬合的情況發生呢?由於過擬合往往出現在對資料的過分擬合導致模型太複雜,所以在決策樹中,決定是否新增一個節點的時候,除了訓練誤差我們還可以新增一個複雜度懲罰項,這樣就綜合考慮了訓練誤差和模型複雜度。

當然,在決策樹種最常見的用於防止過擬合的方法就是剪枝了。

剪枝分為兩種,一種是在決策樹構建過程中進行剪枝。也就是通過設定增益的閾值或者葉節點的樣本數等等,防止構建太深的決策樹導致過擬合,但這也面臨一個閾值選擇的問題,因為閾值設定太大,導致對資料利用不足,容易欠擬合,但是閾值太小又起不到防止過擬合的作用。比較常見的做法是利用確認集,也就是將訓練集劃分成訓練集和確認集,在訓練集上用不同的超引數訓練模型,然後在驗證集上驗證,取驗證集上誤差率最小的超引數所確定的模型。

既然說到了驗證集,我們就順便提一下交叉驗證吧,交叉驗證是一種很好的評估分類器效能的方法,當然根據這個效能評價我們可以完成比如上面所說的超引數選擇,還有模型啊特徵的選擇。交叉驗證具體的做法就是將訓練集分成若干份,每次選擇其中一份作為驗證集,其他的用作訓練集,這樣的過程可以重複若干次,保證每份資料都被用作驗證集一次,這樣若干次計算出來的誤差總和就可以作為我們評價一個分類器效能的參考。感覺平時最常用的就是10折交叉驗證,極端情況也有留一驗證,這樣的做法雖然充分利用了資料來訓練,但是檢驗的誤差方差比較大。下面給出一個在Python中利用交叉驗證來選擇超引數的簡單例子,還是用的上面的乳腺癌資料,優化的超引數是樹的深度。

from sklearn.cross_validation import cross_val_score
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn import tree
breast_cancer=load_breast_cancer()
data=breast_cancer.data
target=breast_cancer.target
max_depth=np.linspace(1,15,15,endpoint=True)
scores_final=[]
for depth in max_depth:
    clf=tree.DecisionTreeClassifier(random_state=0,max_depth=depth)
    scores=cross_val_score(clf,data,target,cv=10,scoring='accuracy')
    print 'max_depth=%f ,scores=%f'%(depth,scores.mean())
    scores_final.append(scores.mean())
from matplotlib import pyplot as plt
plt.plot(max_depth,scores_final,'r-',lw=2)
plt.xlabel('max_depth')
plt.ylabel('CV scores')
plt.grid()
plt.show()

結果如下

max_depth=1.000000 ,scores=0.892966

max_depth=2.000000 ,scores=0.921164

max_depth=3.000000 ,scores=0.910543

max_depth=4.000000 ,scores=0.922858

max_depth=5.000000 ,scores=0.928092

max_depth=6.000000 ,scores=0.924705

max_depth=7.000000 ,scores=0.919411

max_depth=8.000000 ,scores=0.917563

max_depth=9.000000 ,scores=0.917563

max_depth=10.000000 ,scores=0.917563

max_depth=11.000000 ,scores=0.917563

max_depth=12.000000 ,scores=0.917563

max_depth=13.000000 ,scores=0.917563

max_depth=14.000000 ,scores=0.917563

max_depth=15.000000 ,scores=0.917563


從上面畫的圖中我們可以看出,一開始由於樹的深度比較淺,導致模型有點欠擬合,後來隨著樹的深度逐漸加深,我們看到交叉驗證的得分逐漸上升,在樹深度為5的時候得分達到最高。此後,樹的深度繼續增加但CV的得分反而降低了,原因就在於過於複雜的樹有可能導致資料有點過擬合了,效果反而不好,這樣我們最終選擇的超引數-樹的深度就是5。

還有一種就是在決策樹完全構建完成後進行剪枝,通過用葉節點或者樹中最常見的分代替子樹,自下而上直至樹不能被優化。後剪枝的效果往往比先剪枝好,但是當某個子樹被剪後,用於它的計算資源就浪費了。

關於分類器的效能評價的話,除了上面所說的交叉驗證之外,其它的多半是一些取樣的方法,包括提前劃分訓練集和確認集啊,隨機二次抽樣或者說有放回抽樣等等,我想大家有興趣可以自己去看看,但最常用的應該還是交叉驗證吧。

這次我們主要討論了和分類相關的一些概念以及決策樹模型的特點,最後講了一些關於過擬合和分類器效能評估(主要是交叉驗證)的內容,下一次會介紹一些所謂更加高階的分類演算法,但是這次我們所提到的這些概念和方法下次還是用得到~

Have a nice day~~~


相關推薦

資料分類模型描述效能評估決策

關於分類的第一部分我們要講一些關於分類的基本概念,然後介紹最基本的一種分類模型-決策樹模型,再基於此討論一下關於分類模型的效能評估。 =================================

資料倉庫資料

一·資料處理的兩種基本型別:操作型,分析型。 二·操作型數據和分析型資料的區別 操作型資料 分析型資料 細節的 綜合的,或提煉的 在存取瞬間是準確的(當前資料) 代表過去的資料(歷史資料) 可更新 不可更新 操作需求

用 WEKA 進行資料 1簡介和迴歸

簡介 什麼是 資料探勘?您會不時地問自己這個問題,因為這個主題越來越得到技術界的關注。您可能聽說過像 Google 和 Yahoo! 這樣的公司都在生成有關其所有使用者的數十億的資料點,您不禁疑惑,“它們要所有這些資訊幹什麼?”您可能還會驚奇地發現 Walmart 是最為先進的進行資料探勘並將結果

資料KDD初學基礎概要

資料探勘(KDD)Knowledge discovery in database 從各種各樣的應用資料中發現有趣資料模式。 資料來源包括:資料庫、資料倉庫、Web、其他資訊儲存庫。 可挖掘的資料型別:資

資料1知識點總結

詳細文章轉自:https://blog.csdn.net/sinat_22594309/article/details/74923643資料探勘的一般過程包括以下這幾個方面:1、 資料預處理2、 資料探勘3、 後處理一、資料預處理主要手段分為兩種:選擇分析所需的資料物件和屬性

資料2關聯規則FpGrowth演算法

介紹了關聯規則挖掘的一些基本概念和經典的Apriori演算法,Aprori演算法利用頻繁集的兩個特性,過濾了很多無關的集合,效率提高不少,但是我們發現Apriori演算法是一個候選消除演算法,每一次消除都需要掃描一次所有資料記錄,造成整個演算法在面臨大資料集時顯得無能

在R中使用支援向量機SVM進行資料

在R中,可以使用e1071軟體包所提供的各種函式來完成基於支援向量機的資料分析與挖掘任務。請在使用相關函式之前,安裝並正確引用e1071包。該包中最重要的一個函式就是用來建立支援向量機模型的svm()函

大宗交易資料

思路 在網上可以看到很多關於股票的資料探勘,其中也包括了一些大宗交易的資料探勘和分析。本人之前也做過比較長時間的學習,所以出於好奇,嘗試對這類資料進行挖掘: 最開始的想法 來看下百度百科對於大宗交易的解釋: 百度百科的大宗交易介紹 總的來說,就是大宗

跟我一起資料1——建立資料倉庫的意義

資料倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH。資料倉庫是為企業所有級別的決策制定過程提供支援的所有型別資料的戰略集合。它是單個數據儲存,出於分析性報告和決策支援的目的而建立。 為企業提供需要業務智慧來指導業務流程改進和監視時間、成本、質量和控制。

淺談資料概論

前言:學習資料的來源均出自,《圖解機器學習》-杉山將,中國工信出版集團。《資料探勘導論》-戴紅,清華大學出版書,資料探勘演算法原理與實現。 筆者自述:不知道什麼時候就開始有想學習資料探勘這一塊的知識,但是卻從來都沒有過開始。直到幾天前,突然鬼使神差的去了圖書館,找了基本資料

跟我一起資料20——網站日誌挖掘

收集web日誌的目的 Web日誌挖掘是指採用資料探勘技術,對站點使用者訪問Web伺服器過程中產生的日誌資料進行分析處理,從而發現Web使用者的訪問模式和興趣愛好等,這些資訊對站點建設潛在有用的可理解的未知資訊和知識,用於分析站點的被訪問情況,輔助站點管理和決策支援等。 1、

新浪微博資料python本週人們在討論的熱門話題的提取

分析熱門話題微博: (1)人們在討論(查詢)什麼話題(熱門話題) (2)該話題下的微博獲取 (3)那些人轉發了微博(涉及的人物) (4)轉發的時間和地點(話題的在時間和空間上的影響度) (5)網民對此持有什麼態度(情感分析) 開始之前,python的字典和列表的操作知識必須

springboot框架開發微信公眾號之訊息的使用以文字訊息和圖文訊息

流程圖 程式碼實現 封裝各種訊息的屬性 響應訊息基類 package com.gzc.weixin.message.response; /** * * @Description: 響應訊息基類(公眾賬號→普通使用者) * @Parameters: * @Return: *

使用Weka進行資料Weka教程九模型序列化/持久化儲存和載入

有很多時候,你在構建了一個模型並完成調優後,你很可能會想把這個模型存入到磁碟中,免得下次再重新訓練。尤其是神經網路、SVM等模型訓練時間非常長,重新訓練非常浪費時間。那麼怎麼持久化模型呢? 其實既然模型也是一個JAVA物件,那我就按照JAVA的序列化和反序列化

資料-入門-8基於樸素貝葉斯的文字分類

主要內容: 1、動機 2、基於樸素貝葉斯的文字分類器 3、python實現 一、動機 之前介紹的樸素貝葉斯分類器所使用的都是結構化的資料集,即每行代表一個樣本,每列代表一個特徵屬性。 但在實際中,尤其是網頁中,爬蟲所採集到的資料都是非結構化的,如新聞、微博、帖子等,如果要對對這一類資料進行分類,應該怎麼辦

KDD資料韓家煒學習----導論

為什麼進行資料探勘 有需求,才會有解決需求的辦法。 對於工作,學習,生活中的各種海量資料,我們需要一種工具來從這些資料中發現有價值的資訊,把這些資料轉化成有組織的知識----需求產生 解決辦法:資料探勘 經典的例子:谷歌預測流感趨勢 資料庫系統技術的演變,如下圖

【強烈推薦】:關於系統學習資料Data Mining的一些建議!!

微信公眾號 關鍵字全網搜尋最新排名 【機器學習演算法】:排名第一 【機器學習】:排名第一 【Python】:排名第三 【演算法】:排名第四 關於資料探勘 提到收據挖掘(Data Mining, DM),很多想學習的同學大多數都會問我: 什麼是資料探勘? 怎麼培養資料分析的能力? 如何成為一名資料科學家? (

python/pandas資料十四-groupby,聚合分組級運算

groupby import pandas as pd df = pd.DataFrame({'key1':list('aabba'), 'key2': ['one','two','one','two','one'],

使用Weka進行資料Weka教程六Weka取樣Filter/Resample/SMOTE

資料預處理中,有一個原理很簡單但是非常重要的部分:取樣。良好的取樣可以讓資料集變得平衡,會大大的提高預測和分類的效果。 取樣是很複雜的一個領域,背後涉及到資料的分佈/資料的性質等很多內容。常見的取樣有: Simple Random Sampling(簡單隨機

資料機器學習面試--SVM面試常考問題

應聘資料探勘工程師或機器學習工程師,面試官經常會考量面試者對SVM的理解。 以下是我自己在準備面試過程中,基於個人理解,總結的一些SVM面試常考問題(想到會再更新),如有錯漏,請批評指正。(大神請忽視) 轉載請註明出處:blog.csdn.net/szlcw1 SVM的原