2015. 4. 6. 17:18

C5.0 Visual Studio 2008(VC++)에서 빌드(Build) (C5.0, C4.5, J48, Decision tree(의사결정트리))

C5.0(링크)은 C4.5(Weka에서 J48)의 확장 버전으로, 기본적으로 Linux/Unix 기반입니다. 이를 Visual Studio 기반의 Windows에서 빌드하기 위해서는 다음과 같은 몇몇 작업이 필요합니다.


(주의) 본 공유된 소스는 C5.0의 License(GPL)을 따릅니다. 라이센스 정책 위반을 알려주신다면, 삭제토록 하겠으며, 누군가 본 소스를 사용하고, 배포시에는 C5.0에 해당되는 GPL License를 따라야 합니다. 자세한건 C5.0의 License를 검토하시기 바랍니다.


c5.0.zip

  • c5.0.zip에 있는 c50이 Library source이므로, 사용할 project directory에 복사한다.
    대략 아래와 같은 모습이다.
    붉은색 부분이 C5.0의 source code로, 링크에서 C5.0항목에서 다운로드된 것을 압축 해제한 것이다. 현재 2.07 GPL Version이다.

c50

├─compat

│  └─sys

│          compat.c

│          time.h

│          unistd.h

└─source

       attwinnow.c

       c50.c

       classify.c

       confmat.c

       construct.c

       contin.c

       defns.i

       discr.c

       extern.i

       formrules.c

       formtree.c

       getdata.c

       getnames.c

       global.c

       gpl.txt

       implicitatt.

       info.c

       Makefile

       mcost.c

       modelfiles.c

       p-thresh.c

       prune.c

       report.c

       rules.c

       ruletree.c

       siftrules.c

       sort.c

       subset.c

       text.i

       trees.c

       update.c

       utility.c

       xval

       xval.c

  • 다음과 같은 항목에 대해 VC Project에 Add files 한다.
  • 다음과 같은 항목에 대해 VC Project에 Add files한다. (compat\sys\compat.c)
  • /c50/source/c50.c를 c5.0.c로 복사하고, 해당 파일을 main 함수가 포함된 파일로 대체한다. 일단, WinMain 이 포함된 파일은 .c로 하고, #include <sys/resource.h>에 해당되는 함수는 주석 처리한다.
    대략 아래와 같은 코드이다.

	...
	Attribute		Att;
	// 	struct rlimit RL;
	/*  Make sure there is a largish runtime stack  */
	// 	getrlimit(RLIMIT_STACK, &RL);
	// 
	// 	RL.rlim_cur = Max(RL.rlim_cur, 20 * 1024 * 1024);
	// 
	// 	if ( RL.rlim_max > 0 )	/* -1 if unlimited */
	// 	{
	// 		RL.rlim_cur = Min(RL.rlim_max, RL.rlim_cur);
	// 	}
	// 
	// 	setrlimit(RLIMIT_STACK, &RL);
	...

  • Project setting -> C/C++ -> General -> Additional Include Directory는 아래와 같다.

    즉, /c50/source와 /c50/compat에 대한 상대 경로를 입력한다.
  • Precompile header 오류등은 해당 옵션을 Off (Project setting -> C/C++ -> Precompiled Headers -> Create/Use Precompiled Header ==> Not Using ...)
이런 과정을 거치면 빌드가 성공됩니다. 수많은 Warning이 발생하지만, 넘어갈 수 있는 수준입니다.
특징은 이러한 과정에서 c5.0 GPL 소스 자체에 대한 수정은 이뤄지지 않았고, <sys/resource.h>에 의해, main 함수를 복사하여 수정한 것이 사용되었습니다.

위 첨부된 파일의 release 경로의 test.bat를 실행하면 아래와 같습니다.
(테스트에 사용된 vote dataset은 weka에 포함된 dataset을 이용하였습니다.)

E:\Temp\_c50_\Release>c5.0.exe -f vote

C5.0 [Release 2.07 GPL Edition]         Mon Apr 06 17:13:39 2015
-------------------------------

    Options:
        Application `vote'

Class specified by attribute `Class'

Read 435 cases (17 attributes) from vote.data

Decision tree:

physician-fee-freeze = n: democrat (253.4/3.7)
physician-fee-freeze = y:
:...synfuels-corporation-cutback = n: republican (145.7/4)
    synfuels-corporation-cutback = y:
    :...mx-missile = y: democrat (6/1)
        mx-missile = n:
        :...adoption-of-the-budget-resolution = n: republican (22.6/3.3)
            adoption-of-the-budget-resolution = y: democrat (7.2/2.2)


Evaluation on training data (435 cases):

            Decision Tree
          ----------------
          Size      Errors

             5   14( 3.2%)   <<


           (a)   (b)    <-classified as
          ----  ----
           261     6    (a): class democrat
             8   160    (b): class republican


        Attribute usage:

             97%  physician-fee-freeze
             40%  synfuels-corporation-cutback
             11%  mx-missile
              9%  adoption-of-the-budget-resolution


Time: 0.0 secs

E:\Temp\_c50_\Release>pause
계속하려면 아무 키나 누르십시오 . . .


익숙한 Tree 구문이 datamining 결과로 표현됩니다. 참고로, vote.tree 파일도 생성되니, 내용확인이 가능합니다.


data file format에 관련해서는, 링크를 참고하시기 바랍니다.