[公告] 痞客邦新服務上線 每日星座運勢測算[公告] 痞客邦應用市集全新改版![公告] 痞客邦「應用市集」新 App 上架-iFontCloud Professional[公告] 痞客邦後台發表文章提供插入多張圖片新功能[公告]痞客邦新服務上線 部落客商店聚集就在《痞市集》

  人應該是一種犯賤到哭哭的動物。

  為了趕論文做實驗限制自己不上B,結果就開始更新部落格,還發佈一些有的沒的根本不會有人看的程式。嘖嘖。

  不管啦。總之我又寫了一個比上次更複雜一點點的小工具。

  在我們做分類問題的時候,好不容易把分類器做好、訓練好、也跑完測資了,接著就需要評估實驗結果。但評估有時是件麻煩事,因為不同的工具有各式各樣不同的輸入輸出,例如(這裡都是以一行為單位):

  【輸入格式】 (藍色為真正的分類,其餘為feature)
    SVM格式:1 1:0.4 2:30.4 3:4.55 4:0.1 5:35
    CRF++格式:NN O M N A S NN
    你自己亂寫的格式可能長這樣:1

  【輸出格式】 (紅色是你做出來的分類、藍色是真正的分類,其餘為feature)
    SVM格式:1 (沒錯就只有這樣)
    CRF++格式:NN O M N A S NN NA
    你自己亂寫的格式可能長這樣:1 1

  每次都要重新parse格式然後算precision、recall跟f-score實在很討厭。而且有時還會有一些很奇妙的怪問題發生,例如:

  【和同學沒溝通好】
    他的+1類是你的1類、他的Y類是你的N類

  【你臨時想換方法評估】
    原本有Y, M, N三種,你想知道如果把M也當成N會怎麼樣?

  【你想觀察Confusing Matrix】
    不得不說你的要求真的很多。

  於是我用java寫了一個分類評估的小工具解決這個問題:

 

 

ClassEval.jar

Usage: java -jar ClassEval.jar correctFile resultFile outputFile [-e +1=1;-1=0;-2=0] [-c] [-o 0;1;2;3;4;5;6;7] [-encode ENCODE] [-ic #] [-ir #]

correctFile寫有標準答案的檔案
resultFile你的分類器做出的結果檔(結果檔和答案檔可以是同一個)
outputFile輸出檔名(後面會幫你接上.csv)

correctFile和resultFile兩個檔案裡面有空行沒有關係,程式會自己跳過,但「扣掉空行後的總行數」必須要一樣(廢話),不然程式會叫。

-e +1=1;-1=0;-2=0 指定相等的類別(equal)
格式是這樣:「要被換掉的分類名稱=要被換成誰」,可以寫好幾個,用「;」分開即可。用意在解決前述「想把A類也當成B類」「我的A類其實就是你的B類」這種問題。為了避免一些不必要的困擾,所以我強制規定不接受遞移相等。也就是說,不能「你=我;我=他」。要達到這個效果,你必須寫「你=他;我=他」。也不能寫「我=我」(對,因為很無聊,所以我不准你這樣寫)。

-c 如果輸出檔本來就存在的話把它覆蓋掉(cover)
預設是串接(append)在原檔案後面。如果是要做一串實驗(例如4-fold cross-validation)的話應該用append接在一起會比較好用吧?

-o 0;1;2;3;4;5;6;7 指定類別輸出的順序(order list)
如果沒有指定的話,先遇到的類別就會排在前面,但有時候類別之間有順序會比較方便閱讀,例如1,2,3,4,...A,B,C,D...這樣。所以可以用這個參數來指定類別的順序,用分號把類別隔開即可。這並不會影響到評估結果,只是輸出的時候比較方便看而已。另外,如果某些類別已經被-e指定要換掉,那即使出現在-o參數裡面還是會被移除。而那些沒有被-o指定順序、卻存在的類別,會接在你指定的順序最後面依照「程式看到的順序」排下去。

-encode ENCODE 指定編碼(預設為BIG5)
讀檔和輸出的編碼。如果你的類別名稱有用到其他的編碼裡面的字的時候就要下,如果只是字母和數字就不用。

-ic # 指定標準答案檔裡面答案在每行中的 array index(預設為0,正數從左算、負數從右算,右邊第一格為-0)
本程式以「一行」為最小單位,但你要的答案到底在一行的哪裡呢?這個參數就可以指定。首先我們會用空白([/s]+,任何空白的意思)把一行切成一個array,我們在這裡下的就是這個array的index。但如CRF++這種「答案寫在行尾」的格式,如果只能從左邊開始數未免也太痛苦了(而且很容易數錯),所以我的程式也可以從右邊數過來:-ic後面的數字可分為正數負數兩種。正數是從左邊開始數,負數是從右邊開始數,左邊第一格是0(預設),右邊第一格是-0例如:

  【SVM輸入格式】:1 1:0.4 2:30.4 3:4.55 4:0.1 5:35
  這時就可以下 -ic 0,但其實不用下,因為預設就是0

  【CRF++輸入格式】:NN O M N A S NN
  這時就要下 -ic -0

-ir 和-ic一樣,只是它是用來指定結果檔

  【CRF++輸出格式】:NN O M N A S NN NA
  這時就要下 -ic -1 -ir -0

需要注意的是,如果你下的index超過array的範圍,程式就會叫。請小心服用。

 

  如果一切順利的話,你會得到outputFile.csv檔,請用M$ Excel來開。裡面有Confusing Matrix、各類的Precision、Recall和F1-score,以及全部的accuracy。這樣應該很夠了吧。如果真的有不夠的話你可以改原始碼,我有壓進jar檔裡。

  一樣,如果對誰有用就拿去吧。

Posted by windx at 痞客邦 PIXNET 留言(1) 引用(0) 人氣()


open trackbacks list Trackbacks (0)

留言列表 (1)

Post Comment
  • 佩服~
  • 檔案掛掉了說~
    可否在補上呢?感謝~
  • 補上啦

    windx replied in 2009/09/10 12:05

You haven’t logged in yet, please use guest status to leave message. You can also log in with above service account and leave message

other options