圖片分類-K近鄰分類器

你可以注意到當我們做預測的時候,如果僅僅用最近的圖片的是遠遠不夠的。其實,我們更常用的是k近鄰分類器。這個思想非常簡單。代替尋找訓練集中最近的圖片,我們會尋找k個最相近的圖片,並且讓他們再測試圖片上投票。特別的,再k=1的時候,我們已經涵蓋了最近鄰分類器。只管來說,更高的k值有一個平滑的影響使得分類器對極端值有更好的處理:

knn分類
這張圖表達了最近鄰分類,和5-最近鄰分類之間的差距,用二維的電荷3個類別(紅色、藍色、綠色區域)。標記顏色的區域可以展示出通過過L2距離計算出的決策範圍。白色部分展示的是有歧義的點(例如,類別投票至少要有兩種類型)。可以看到再一個最近鄰分類器中,異常數據點(例如,再藍色點中的綠色點)創建了一個很小的獨立不正確預測區域,然而5-近鄰分類器平滑的忽略了這些非法數據,而且提高了測試數據的一般性。我們也可以看到5-近鄰的灰色區域圖片也被近鄰選票所約束(例如,2個近鄰是紅色,另兩個是藍色,最後一個是綠色)。
實際中,你會經常想要使用k近鄰。但是k的值取多少。下面我們將解釋這個問題。

驗證集的超參數調優

k近鄰分類器需要一個k值的設置。但是那個數字是最好的呢?並且,我們看到還有很多不同的距離函數我們使用過:L1norm,L2norm,這裏還有許多其他的我們沒有考慮的函數(例如,向量點積)。這些都叫超參數並且他們經常出現在機器學習算法的設計中。有時候選擇一個什麼樣的參數並不明顯。
你可能想我們應該嘗試不同的值看哪個表現的最好。這是一個很好的想法並且這也就是我們要做的。但是這必須很小心的取嘗試。特別的,我們不能用測試集來調整超參數。無論你何時設計機器學習算法,你應該考慮測試集作爲一個最先考慮的資源。因此,最真實的危險就是你可以調整你的超參數再測試集上運行的很好,但是如果你把你的模型運用到真實場景中去,效果就會大打折扣。實際中,我們都會說你過擬合了你的測試集。另一個方面,當你使用他的時候,如果你把超參數測試運用在測試集上,那麼你會再測試集中有很好的效果,並且因此你的測試集準確率會提高。但實際上並沒有那麼高。但如果你僅僅在最後使用測試集,這裏還是存在着測試一個普遍性分類器的參數(在以後的課程中會有)。
僅僅再最後使用一次測試集評估
幸運的是,這裏有一個正確的方法去測試你的超參數並且不會接觸到測試集。這個想法就是把你的訓練集一分爲二:一個很小的訓練集,我們叫做驗證集。使用CIFAR-10做個例子,我們可以使用49000作爲訓練集,剩下的1000個作爲驗證集。這個驗證集就是用來調超參數的。
這裏有一個很像CIFAR-10的例子:

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]

# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:

  # use a particular value of k and evaluation on validation data
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # here we assume a modified NearestNeighbor class that can take a k as input
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # keep track of what works on the validation set
  validation_accuracies.append((k, acc))

在最後一個過程,我們可以畫一個圖來展示哪個k值可以得到最好的結果。我們會把這個值與真實測試集來評估準確率。
將你的測試集分爲訓練集和驗證集。用驗證集來調所有的參數。在最後運行一次測試集並且報告準確率。

交叉驗證.

再這些例子中你的訓練集的大小會是很小的,人們有時會使用隨機調參技術叫做交叉驗證。再考慮上一個例子,這個思想就是不再玄奇前一千個點來做驗證集,二十你可以獲取一個更好的並且更少噪音的評估。例如,再5-個交叉驗證中,我們可以把訓練集分爲5整份,用四個做訓練,1個做驗證。我們會迭代哪個是驗證集,評估性能,並且最終再不同的集合中平均性能。

針對k的驗證集
針對k值的5份交叉驗證。針對每個k值我們訓練四份並且再第五份上評估。對於每一個k我們接受一個再驗證集上的準確率(y軸就是準確率,每個結果就是一個點)。趨勢線由針對每個k的平均結果並且偏差顯示爲標準差。在這個特殊的例子中,交叉驗證中表示當k=7的時候再這個特殊數據集中表現最好(對應圖中最高點)。如果我們把數據集切割成更多份,我們會看到更平滑的曲線。

實際中.

在實際中,人們更喜歡避免交叉驗證而是選擇用一個單獨驗證集,由於交叉驗證是非常耗時的。分割人們趨向於使用50%-90%的訓練集剩下的用驗證。然而,這取決於多種因素:例如如果超參數的數字非常大那麼你情願用更大的驗證集。如果很小,用交叉驗證是更安全的。實際中典型的份額就是3份、5份、和十份交叉驗證。
交叉驗證集
常規數據分塊。一個訓練和測試集給了。一個訓練集被分爲幾份(例如五份)。1-4份訓練集。一份(例如圖中黃色部分)作爲驗證集並且用來測試超參數。交叉驗證會迭代每一份作爲驗證集,從1到5。這會叫做5份交叉驗證。在每個最後驗證過後並且所有最好的超參數決定以後,模型會在測試集中評估一次。

近鄰分類器的優點和缺點

來評價以下近鄰分類器的好壞是值得的。很明顯,一個優點就是很容易實現和理解。另外,分類器沒有時間訓練,由於所有訓練數據需要存儲和索引。然而,我們在測試時間上花費很多,由於區分一個測試用例需要與每一個訓練數據來對比。這點很不好,由於在實際中我們通常會更加關注測試時間而不是訓練時間。實際上,這節課後面的深度神經網絡把這個權衡弄到了另外一個極限:他們訓練起來非常耗時,然而一旦訓練好了,就很容易去區分一個樣本。這種模式更適合於實際中。
另一方面,近鄰分類器的計算複雜度是一個很活躍的領域,並且有很多合適的近鄰算法(ANN)和庫存在可以加速計算效率(例如,FLANN)。
最近鄰算法有時可以在許多地方使用,但是很少在圖片識別中使用。一個問題就是圖片是高維的對象。並且高維空間的距離是非常不直觀的。以下圖片就是兩個圖片的L2相似度:

這裏寫圖片描述
高維數據的基於像素距離非常直觀。一個原始圖片(左)和三個其他圖片都是在L2距離上都是很遠的。很明顯,像素距離並不能很好的響應抽象的相似度。
這裏有一個更加可視化的圖片讓你相信用像素來對比圖片的不同是不夠的。我們可以用一個可視化工具叫t-SNE來展示CIFAR-10的圖片並且把他們在二維中嵌入這樣他們之間的距離就被很好展示出來。圖片中,圖片旁邊的圖片被看作是L2距離很近的圖片。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章