chapter5:分類的進一步探討---演算法評估及kNN

CopperDong發表於2017-10-05

一、10折交叉驗證(10-fold cross validation)

  將資料集隨機分成10份,使用其中9份進行訓練而將另外1份用作測試。該過程可以重複10次,每次使用的測試資料不同

二、留一法(Leave-One-Out)

    在機器學習領域,n折交叉驗證(n是資料集中樣本的數目)被稱為留一法。

    它的一個優點是每次迭代中都使用了最大可能數目的樣本來訓練。

    另一個優點是該方法具有確定性

       因為10折交叉驗證中隨機將資料分到桶中,而留一法是確定性的

    主要一個不足在於計算的開銷很大

    另一個缺點與分層取樣(stratification)有關

三、分層取樣

   10折交叉驗證期望每份資料中例項比例按照其在整個資料集的相同比例,而留一法評估的問題在於測試集中只有一個樣本,因此它肯定不是分層取樣的結果。

   總而言之,留一法可能適用於非常小的資料集,到目前為止10折交叉測試是最流行的選擇

四、混淆矩陣

   精確率百分比的計算

五、一個程式設計的例子

  汽車MPG資料集

  利用分層取樣方法將資料分到10個桶中

# divide data into 10 buckets
import random

def buckets(filename, bucketName, separator, classColumn):
    """the original data is in the file named filename
    bucketName is the prefix for all the bucket names
    separator is the character that divides the columns
    (for ex., a tab or comma and classColumn is the column
    that indicates the class"""

    # put the data in 10 buckets
    numberOfBuckets = 10
    data = {}
    # first read in the data and divide by category
    with open(filename) as f:
        lines = f.readlines()
    for line in lines:
        if separator != '\t':
            line = line.replace(separator, '\t')
        # first get the category
        category = line.split()[classColumn]
        data.setdefault(category, [])
        data[category].append(line)
    # initialize the buckets
    buckets = []
    for i in range(numberOfBuckets):
        buckets.append([])       
    # now for each category put the data into the buckets
    for k in data.keys():
        #randomize order of instances for each class
        random.shuffle(data[k])
        bNum = 0
        # divide into buckets
        for item in data[k]:
            buckets[bNum].append(item)
            bNum = (bNum + 1) % numberOfBuckets

    # write to file
    for bNum in range(numberOfBuckets):
        f = open("%s-%02i" % (bucketName, bNum + 1), 'w')
        for item in buckets[bNum]:
            f.write(item)
        f.close()

# example of how to use this code          
buckets("pimaSmall.txt", 'pimaSmall',',',8)

六、Kappa統計量

  “分類器到底好到什麼程度”

  Kappa統計量比較的是分類器與僅僅基於隨機的分類器的效能。

七、近鄰演算法的改進

   考察k個而不只是1個最近的鄰居(kNN)


八、一個新資料集也挑戰

   皮馬印第安人糖尿病資料集(Pima Indians Diabetes Data Set),該資料集是美國國立糖尿病、消化和腎臟疾病研究所

   每個例項表示一個超過21歲的女性的資訊,分兩類,即5年沒是否患過糖尿病。每個人有8個屬性

    def knn(self, itemVector):
        """returns the predicted class of itemVector using k
        Nearest Neighbors"""
        # changed from min to heapq.nsmallest to get the
        # k closest neighbors
        neighbors = heapq.nsmallest(self.k,
                                   [(self.manhattan(itemVector, item[1]), item)
                     for item in self.data])
        # each neighbor gets a vote
        results = {}
        for neighbor in neighbors: 
            theClass = neighbor[1][0]
            results.setdefault(theClass, 0)
            results[theClass] += 1
        resultList = sorted([(i[1], i[0]) for i in results.items()], reverse=True)
        #get all the classes that have the maximum votes
        maxVotes = resultList[0][0]
        possibleAnswers = [i[1] for i in resultList if i[0] == maxVotes]
        # randomly select one of the classes that received the max votes
        answer = random.choice(possibleAnswers)
        return( answer)

人們將kNN分類器用於:








相關文章