weka 의 Instances 속성 삭제

9758 단어 instance
최근 며칠 동안 weka 로 알고리즘 을 만 들 었 습 니 다. 이번에 부터 weka 를 접 하기 시 작 했 습 니 다. 처음에 손 이 좀 걸 리 는 것 을 피하 기 어 려 웠 습 니 다. 이번에 실현 한 것 도 여러 가지 문제 에 부 딪 혔 습 니 다. 그 중 하 나 는 weka 중의 Instances 와 관련 이 있 습 니 다. 방금 프로그램 을 뛰 었 습 니 다. 데이터 가 많아 서 하루 이틀 을 다 뛰 지 못 할 것 같 습 니 다. 이 여가 시간 을 틈 타.내 가 만난 문제 와 해결 방법 을 기록 해라. 첫째, 이렇게 하면 다른 사람 에 게 도움 이 될 수 있다. 그리고 내 가 나중에 찾 아 보 는 것 도 편리 하 다. 속담 에 잘 말 하면 썩 은 붓 이 좋 은 기억력 보다 낫다 고 했 기 때문이다.
우선, weka 는 데이터 발굴 에 관 한 연 구 를 하 는 사람들 이 반드시 접 할 수 있 는 소프트웨어 입 니 다. 이 소프트웨어 는 뉴질랜드 waikato 대학 에서 작 성 했 습 니 다. 그 안에 다양한 알고리즘 을 실 현 했 습 니 다. 여기 서 일일이 소개 하지 않 고 weka 를 사용 한 사람들 이 제 가 무슨 말 을 하 는 지 알 고 있 을 것 이 라 고 믿 습 니 다.
이 수필 은 세 가지 구체 적 인 속성 선택 과 관련 된 실제 문제 에서 출발 하여 구체 적 인 해결 방법 과 코드 를 제시 할 것 이다.실제 문 제 를 논의 하기 전에 왜 속성 삭제 가 필요 한 지, 즉 필요 한 문제 다.
 
1. 왜 속성 삭제 가 필요 합 니까?
우 리 는 교차 검증 을 할 때 훈련 집에 서 어떤 처 리 를 했 는 지 알 고 있다. 이런 처 리 는 테스트 집에 그대로 넣 어야 분류 해 얻 은 결과 가 믿 을 만하 다.
빅 데이터 시대 가 도래 했 습 니 다. 우 리 는 사례 가 많 고 차원 이 높 은 빅 데 이 터 를 자주 만 날 수 있 습 니 다. 이런 데 이 터 를 처리 할 때 효과 와 효율 두 가지 측면 에서 볼 때 우 리 는 먼저 데 이 터 를 예비 처리 해 야 합 니 다. 가장 흔히 볼 수 있 는 예비 처리 방식 은 바로 속성 선택 입 니 다. 즉, 제 가 지금 하고 있 는 것 입 니 다. 이른바 속성 선택 입 니 다.말 그대로 높 은 차원 의 데이터 에서 일부 속성 을 선택 하고 이 부분 속성 으로 속성 전 체 를 대체 하 는 것 이다. 그러면 데이터 처리 시간 을 줄 일 수 있다. 또한 알고리즘 을 적절하게 선택 하면 우 리 는 더 좋 은 결 과 를 얻 을 수 있다. 예 를 들 어 분류의 정밀도 가 더욱 높다.
만약 에 우리 가 속성 선택 후의 훈련 집 으로 분류 기 를 구축 했다 면 우 리 는 이 분류 기의 좋 고 나 쁨 을 어떻게 테스트 해 야 합 니까? 아니면 실험 으로 말 해 야 합 니까? 테스트 집에 서 이 분류 기의 정 도 를 테스트 해 야 합 니까? 앞에서 말 했 듯 이 분류 할 때 훈련 집 에서 의 처 리 는 반드시 그대로 테스트 집에 가해 야 합 니 다. 훈련 집 에서 속성 선택 을 했 습 니 다.테스트 집합 도 속성 선택 을 해 야 하고 선택 한 속성 은 훈련 집합 에서 선택 한 속성 과 완전히 일치 해 야 합 니 다. 속성 선택 후의 테스트 집합 을 얻 기 위해 서 는 훈련 집합 에서 선택 한 속성 을 제외 하고 테스트 집합 에 있 는 다른 속성 을 모두 삭제 해 야 합 니 다.
 
두 세 가지 구체 적 인 문제
이 몇 가지 문 제 를 잘 묘사 하기 위해 서, 우 리 는 일부 변 수 를 정의 하 는데, 이 변 수 는 세 가지 문제 에서 통용 된다.
train:      test:   
trainInstance: testInstances: trainInstances test
trainIndex:

1. 속성 선택 알고리즘 은 trainInstances 를 되 돌려 줍 니 다. 이때 testInstances 를 얻 기 위해 아래 코드 를 사용 할 수 있 습 니 다.
public static Instances delAttr(Instances model, Instances origin){

        boolean flag = false;

        ArrayList<Integer> al = new ArrayList<Integer>();

        for(int q = 0; q < origin.numAttributes() - 1; q++){

            String temp2 = origin.attribute(q).name();

            for(int x = 0; x < model.numAttributes() - 1; x++){

                String temp1 = model.attribute(x).name();  

                if(temp1.equals(temp2)){

                    flag = true;

                    break;

                }

            }

            if(flag)

            {

                flag = false;

                continue;

            }

            else

//                dataCopy.deleteAttributeAt(q);   //you can not do like this

                al.add(new Integer(q));

        }

        

        for(int q = 0; q < al.size(); q++){

            int deltemp = al.get(q) - q;        // pay attention to this line

            origin.deleteAttributeAt(deltemp);

        }



        return origin;

    }

model 은 trainInstances 에 해당 하고 origin 은 test 에 해당 하 며 돌아 오 는 origin 은 testInstances 에 해당 합 니 다.
위의 코드 의 사상 은 속성 이름 을 통 해 삭제 해 야 할 속성의 아래 표 지 를 모두 ArrayList 의 데이터 구조 에 저장 한 다음 에 이 ArrayList 에 따라 해당 하 는 속성 을 삭제 하고 새로운 구조의 Instances 로 돌아 가 는 것 입 니 다.
위 에 내 가 쓴 두 줄 주석 을 주의 하 세 요. 왜냐하면 당신 이 하나의 속성 을 삭제 한 후에 이 속성 뒤에 있 는 모든 속성의 index 는 변화 할 것 입 니 다 (- 1). 이것 은 당신 이 String 에서 한 문 자 를 삭제 하 는 것 과 같 습 니 다. 이 점 을 알 면 두 번 째 주석 에 대응 하 는 삭제 방법 이 정상적으로 작 동 하 는 이 유 를 알 수 있 습 니 다.
주의: 만약 당신 이 사용 하 는 데이터 에 두 개 이상 의 속성 이 있 는 이름 이 완전히 같다 면, 이 방법 은 이 이름 을 가 진 모든 속성 을 보존 할 것 입 니 다. 그러나, 당신 이 진정 으로 필요 로 하 는 것 은 그 중의 하나 일 수도 있 습 니 다.
 
2. 1 을 직접 사용 하여 되 돌아 온 결 과 를 분류 기 에 맡 기 면 잘못 보고 하 는 경우 가 많 습 니 다. 그 이 유 는 약간 미묘 합 니 다. 다음 과 같이 설명 합 니 다.
train 에 네 가지 속성 이 있다 고 가정 하면 {attr 1, attr 2, attr 3, attr 4}, attr 4 는 클래스 태그 입 니 다. test 도 마찬가지 로 train 에서 속성 선택 을 하고 train Instances {attr 3, attr 2, attr 4} 를 되 돌려 줍 니 다. train Instances 와 test 를 1 에 게 건 네 주 고 test Instances {attr 2, attr 3, attr 4} 을 되 돌려 줍 니 다. test Instances 를 분류 기 에 건 네 주 고 오 류 를 보고 합 니 다.잘못된 이 유 는 trainInstances 와 test Instances 의 속성 이 잘못 되 었 기 때 문 입 니 다.
이런 상황 에서 우 리 는 두 속성의 위 치 를 교환 해 야 한다. 아래 의 이 코드 는 이 문 제 를 해결 했다.
public static Instances sort(Instances model, Instances process){

      Attribute attr;

      for(int i = 0; i < model.numAttributes()-1; i++){

          for(int j = 0; j < process.numAttributes()-1; j++){

              if(process.attribute(j).name().equals(model.attribute(i).name())){

                  if(j!=i){

                     attr = process.attribute(j);

                     process.insertAttributeAt(attr, i);

                     for(int k = 0; k < process.numInstances(); k++){

                         process.instance(k).setValue(i, process.instance(k).stringValue(j+1));    //pay attention to j+1

                     }

                     break;

                  }

              }

          }

      }

      for(int i = process.numAttributes() - 2; i > model.numAttributes()-2; i--){

          process.deleteAttributeAt(i);;

      }

      return process;

  }

 
model 은 trainInstances 에 해당 합 니 다. process 는 1 에서 돌아 오 는 testInstances 에 해당 합 니 다. 2 에서 돌아 오 는 process 는 trainInstances 의 모든 속성 과 대응 할 수 있 는 testInstances 입 니 다.
이 코드 의 사상 은 process 에서 모든 속성 이 model 에 대응 하 는 위 치 를 찾 은 다음 에 process 의 대응 위치 에 이 속성 을 삽입 하 는 것 입 니 다. 속성 을 삽입 할 때 속성 값 을 복사 해 야 합 니 다.
제 가 사용 하 는 데 이 터 는 모두 nominal 형식 이기 때문에 속성 값 을 복사 할 때 stringValue 라 는 방법 을 선택 하 였 습 니 다. numeric 나 다른 유형 이 라면 해당 하 는 방법 을 선택해 야 합 니 다. 이것 은 weka 의 Instance 류 에서 찾 을 수 있 습 니 다.
 
3. 속성 선택 알고리즘 은 다음 배열 trainIndex 를 되 돌려 줍 니 다.
3 과 1 의 차이 점 은 자신 이 속성 명 으로 일치 하 는 이 절 차 를 생략 하 는 것 이다. 따라서 데이터 집중 에 여러 속성 이 있 는 이름 이 완전히 일치 하 더 라 도 영향 을 주지 않 는 다. 왜냐하면 아래 표 시 를 되 돌려 주기 때문이다.
이 경우 아래 코드 를 사용 할 수 있 습 니 다.
public static Instances delAttr(ArrayList<Integer> al, Instances inst){

        for(int i = inst.numAttributes() - 1; i > -1; i--){    //delete from back to forward

            if(!al.contains(i))

                inst.deleteAttributeAt(i);

        }

        

        return inst;

    }

 
메모: 이 코드 는 제 가 뒤에서 앞으로 삭 제 했 습 니 다. 이런 삭제 방법 은 문제 가 되 지 않 습 니 다. 매번 삭제 해 야 할 속성의 마지막 이 므 로 앞에서 삭제 해 야 할 속성의 아래 표 지 는 아무런 영향 을 주지 않 습 니 다.
주의: 속성 아래 표 시 를 받 은 후에 정렬 을 한 적 이 있 는 지, 정렬 을 하지 않 았 다 면 먼저 정렬 을 하고 어 릴 때 부터 큰 순서 로 배열 하 는 것 이 좋 습 니 다. 그러면 약간의 추가 시간 이 필요 하지만 가끔 은 예상 치 못 한 실 수 를 피 할 수 있 습 니 다. 구체 적 인 원인 은 잘 모 르 겠 지만 저 는 만난 적 이 있 습 니 다.
 
3. 총화
분명 한 것 은 세 번 째 상황 이 가장 간단 하고 코드 가 뚜렷 하 며 시간 도 상대 적 으로 적 기 때문에 속성 을 선택 한 후에 다음 표 배열 을 직접 얻 는 것 이 가장 좋다. 그렇지 않 으 면 얻 은 결 과 를 다음 표 배열 로 바 꿀 수 있다.
 

좋은 웹페이지 즐겨찾기