我來填坑了,最近好忙,沒有時間寫博客,今天上午剛剛進行完本課程的實驗考試,在這裏進行簡要彙總。網絡
任務介紹
- 利用20000條手寫識別數據,提早訓練好分類器,考試時只須要跑預測模型便可。
- 本質上一個分類問題,類別總數是10。
本任務比較有意思的一點是,老師提供的訓練數據,是利用PCA與LDA降維獲得的特徵,而不是MNIST集原始的RGB特徵。所以若是採用深度學習的方法,不適合使用CNN再次抽取特徵。學習
個人模型
- 本實驗主要採用ensemble學習的方式,對多個分類器進行集成,其中包括單模型成績很好的SVM,KNN, MLP,也有單模型效果較弱的隨機森林,GBDT模型。
- 在進行集成學習以前,對於每個單模型,均採用十折交叉驗證的方式進行訓練,而且使用Stacking融合策略,將每一折驗證集拼接,構成新一輪的訓練集特徵。交叉驗證獲得了10個不一樣的單模型,用這些模型分別對測試集進行預測,最後對預測的機率取平均,獲得了新一輪的測試集特徵。
每一個單模型生成的數據特徵維度爲10維(由於一共有10個類別),以後將每一個單模型對應的特徵向量進行拼接,獲得了5x10維的特徵(由於一共有5個單模型),最用使用xgboost分類器進行集成學習,預測每一個類別的機率值。測試
訓練方式
- 從訓練集中分出一部分數據做爲驗證集,用該驗證集指導模型進行收斂,並記錄下來模型達到最優狀況時的迭代次數。
- 以後不劃分驗證集,用全體訓練集進行模型訓練,達到以前記錄的迭代次數時,中止訓練。
- 之因此採用這種方式,是由於我但願使用更多的數據進行訓練,比較適用於訓練集數目較小的狀況。
實驗結果
- 我在線下的最高得分有0.98325,可是今天進行實驗考試的時候,成績只有0.97885。我後來本身思考了一下,應該在Stacking融合階段,我只是將訓練集按照8:2劃分驗證集,Stacking會致使驗證集泄漏,使得得分虛高,正確的作法應該是8:1:1這種劃分方式,切分出測試集,並以測試集的分數做爲模型真實的得分。若是隻是在xgboost階段劃分驗證集,有兩個問題:
- 此驗證集在前面一層stacking中參與了訓練過程,容易形成過擬合。
- 驗證集應該和測試集的處理過程保持一致。而測試集是十折模型相加取平均的,驗證集只是某一折模型的預測結果,不公平,沒有指導價值。
- 不過無所謂了,雖然模型過擬合了,可是最後的成績好像是小組第二。
後記
- 由於數據的特徵已是抽取後的特徵,因此不適合用CNN再作分類器,不過能夠採用多層前向殘差網絡設計模型。這種模型仍是很簡單的,調參功底極大影響最終的成績。