문제

대본


Java GUI 응용 프로그램 내에서 데이터 세트를 통해 감독 학습을 구현하려고합니다. 사용자에게는 검사 할 항목 또는 '보고서'목록이 제공되며 사용 가능한 라벨 세트에 따라 레이블을 지정합니다. 감독 학습이 완료되면 라벨이 붙은 인스턴스가 학습 알고리즘에 제공됩니다. 이것은 사용자가 그들을보고 싶어 할 가능성에 대해 나머지 항목을 주문하려고 시도합니다.

사용자의 시간을 최대한 활용하려면 전체 보고서 모음에 대한 정보를 가장 많이 제공하고 사용자에게 라벨을 붙일 보고서를 사전 선택하고 싶습니다. 내가 이해하는 바와 같이, 이것을 계산하려면, 각 보고서의 모든 상호 정보 값의 합을 찾아서 해당 값으로 주문해야합니다. 그런 다음 감독 학습의 라벨링 된 보고서는 베이지안 네트워크를 형성하여 나머지 보고서 각각의 이진 값의 확률을 찾습니다.

예시


여기서 인공적인 예는 설명하는 데 도움이 될 수 있으며 의심 할 여지없이 잘못된 용어를 사용했을 때 혼란을 해결할 수 있습니다. :-) 응용 프로그램이 사용자에게 뉴스 기사를 표시하는 예를 고려하십시오. 표시된 사용자의 선호도를 기반으로 먼저 표시 할 뉴스 기사를 선택합니다. 상관 관계가있는 뉴스 스토리의 특징은 country of origin, category 또는 date. 따라서 사용자가 스코틀랜드 출신 일 때 단일 뉴스 기사를 흥미롭게 표시하면 기계 학습자에게 스코틀랜드의 다른 뉴스 기사가 사용자에게 흥미로울 가능성이 높아 졌다고 말합니다. 스포츠와 같은 카테고리 또는 2004 년 12 월 12 일과 같은 날짜와 유사합니다.

이 선호도는 모든 뉴스 기사 (예 : 카테고리 별, 날짜별로)에 대한 주문을 선택하거나 무작위로 주문한 다음 사용자가 진행할 때 선호도를 계산하여 계산할 수 있습니다. 내가하고 싶은 것은 사용자가 소수의 특정 뉴스 기사를보고 관심이 있는지 (감독 학습 부분) 말하면서 그 순서에 대한 일종의 "헤드 스타트"를 얻는 것입니다. 사용자를 보여줄 이야기를 선택하려면 전체 이야기 모음을 고려해야합니다. 이것은 상호 정보가 나오는 곳입니다. 각 이야기마다 사용자가 분류 할 때 다른 모든 이야기에 대해 얼마나 많이 말할 수 있는지 알고 싶습니다. 예를 들어, 스코틀랜드에서 비롯된 많은 이야기가 있다면 사용자가 그중 하나를 (최소한) 분류하도록하고 싶습니다. 범주 또는 날짜와 같은 다른 상관 기능과 유사합니다. 목표는 분류 될 때 다른 보고서에 대한 가장 많은 정보를 제공하는 보고서의 예를 찾는 것입니다.

문제


내 수학이 약간 녹슬고 기계 학습에 익숙하지 않기 때문에 상호 정보의 정의를 Java의 구현으로 변환하는 데 어려움이 있습니다. Wikipedia는 상호 정보의 방정식을 다음과 같이 설명합니다.

mutual information equation

그러나 아무것도 분류되지 않았을 때 실제로 사용할 수 있는지 확실하지 않으며 학습 알고리즘이 아직 계산되지 않았습니다.

내 예에서와 같이, 나는이 수업의 많은 새로운 새로운 사례를 가지고 있다고 말합니다.

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

내 특정 시나리오에서 필드/기능 간의 상관 관계는 정확히 일치 예를 들어, 하루 및 10 년의 날짜 차이는 불평등이 동일합니다.

상관 관계에 대한 요인 (예 : 날짜가 범주보다 더 상관 관계가 있습니까?)이 반드시 같지는 않지만 사전 정의되고 일정 할 수 있습니다. 이것은 함수의 결과를 의미합니까? p(x,y) ~이다 사전 정의 된 값, 아니면 용어를 혼합하고 있습니까?

질문 (마지막으로)


이 (가짜) 뉴스 기사의 예를 감안할 때 상호 정보 계산을 구현하려면 어떻게해야합니까? 도서관, Javadoc, 코드 예제 등은 모두 환영받는 정보입니다. 또한,이 접근법이 근본적으로 결함이 있다면, 그것이 왜 그런지에 대해 설명하는 것이 대답만큼 가치가 있는지 설명합니다.


추신. 나는 Weka와 Apache Mahout과 같은 도서관을 알고 있으므로 그것들을 언급하는 것만으로도 유용하지 않습니다. 저는 여전히 뮤추얼 정보에 대한 물건을 찾고있는이 두 라이브러리에 대한 문서와 예제를 검색하고 있습니다. 실제로 도움이되는 것은 이러한 라이브러리가 상호 정보에 도움이되는 리소스 (코드 예제, Javadoc)를 가리키는 것입니다.

도움이 되었습니까?

해결책

나는 당신의 문제가 ... 같은 것 같아요 ...

"표지되지 않은 예제 목록이 주어지면 사용자가 예제에 레이블을 지정하고 교육 세트에 추가하면 모델의 예측 정확도가 얼마나 개선 될 것인지 목록을 정렬하십시오."

이 경우 두 인스턴스 사이에서 MI를 계산할 수 없기 때문에 상호 정보가 사용되는 것이 옳다고 생각하지 않습니다. MI의 정의는 랜덤 변수 측면에 있으며 개별 인스턴스는 랜덤 변수가 아니라 값 일뿐입니다.

기능과 클래스 레이블은 임의 변수 일 수 있습니다. 즉, 전체 데이터 세트에 대한 값 분포가 있습니다. 두 가지 기능 사이의 상호 정보를 계산하여 하나의 기능이 다른 기능이 어떻게 제공되는지 또는 기능과 클래스 레이블 사이에 예측에 얼마나 많은 도움이 될 수 있는지에 대한 아이디어를 얻을 수 있습니다. 이것은 사람들이 일반적으로 감독 학습 문제에서 상호 정보를 사용하는 방법입니다.

Ferdystschenko의 적극적인 학습 방법을보고 있다는 제안은 좋은 것이라고 생각합니다.


Grundlefleck의 의견에 대한 응답으로, 나는 Java 객체에 대한 그의 아이디어를 사용하여 용어에 대해 조금 더 깊이 갈 것입니다 ...

종합적으로, 우리는 '인스턴스', 'thing', 'report'및 'example'이라는 용어를 사용하여 객체가 박히는 객체를 참조했습니다. 이러한 것들을 Java 클래스의 사례로 생각해 봅시다 (Boilerplate 생성자를 제외하고) :


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

기계 학습의 일반적인 용어는 E1이 예시, 모든 예제에는 두 가지가 있습니다 특징 F1과 F2와 E1의 경우 F1은 'foo'값을 가져 가고 F2는 'bar'값을 취합니다. 예제 모음을 a라고합니다 데이터 세트.

데이터 세트의 모든 예제에 대해 F1의 모든 값을 취하십시오. 이것은 문자열 목록이며 분포로 생각할 수도 있습니다. 우리는이 기능을 a로 생각할 수 있습니다 랜덤 변수 목록의 각 값은 해당 임의 변수에서 가져온 샘플입니다. 예를 들어 F1과 F2 사이의 MI를 계산할 수 있습니다. 의사 코드는 다음과 같습니다.

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

그러나 E1과 E2 사이의 MI를 계산할 수는 없으며 그렇게 정의되지는 않습니다.

다른 팁

DT (Decision Tree)와 관련하여 정보를 얻는다는 것을 알고 있습니다. DT (DT)는 DT를 구성 할 때 각 노드의 분할이 정보 이득을 극대화하는 것입니다. WEKA가 DT 노드 아래의 특정 분할에 대한 정보 게인을 계산할 수 있는지 모르겠지만 DTS는 WEKA에서 구현되므로 직접 사용할 수 있습니다.

그 외에도, 내가 당신을 올바르게 이해한다면, 당신이하려는 것은 일반적으로 적극적인 학습. 거기에서 먼저 기계 학습 알고리즘에 공급되는 초기 라벨링 교육 데이터가 필요합니다. 그런 다음 분류기 라벨에 표지되지 않은 인스턴스 세트와 각각의 신뢰도 값을 반환합니다. 신뢰도가 가장 낮은 인스턴스는 일반적으로 가장 유익한 인스턴스이므로 인간 주석에이를 보여주고 수동으로 레이블을 지정하고 교육 세트에 추가하고 분류기를 재교육하고 모든 작업을 수행하고 수행합니다. 분류기가 충분히 높은 정확도를 가질 때까지 또는 다른 중지 기준이 충족 될 때까지 다시 끝납니다. 따라서 이것이 당신에게 효과가 있다면, 당신은 원칙적으로 당신이 선택한 알고리즘이 신뢰도 값을 반환 할 수있는 한 WEKA 또는 다른 ML- 프레임 워크에서 구현 된 ML-angorithm을 사용할 수 있습니다 (베이지안 접근법의 경우 확률 일뿐입니다). .


당신의 편집 된 질문으로 나는 당신의 목표를 이해하게 될 것이라고 생각합니다. 당신이 원하는 것이 mi를 계산하는 경우, Stompchicken의 답변과 의사 코드는 내 견해에서 훨씬 더 명확하지 않을 수 없습니다. 또한 MI는 당신이 원하는 것이 아니며 휠을 다시 발명하려고한다고 생각합니다.

요약하자 : 사용자가 업데이트 할 수있는 분류기를 훈련시키고 싶습니다. 이것은 적극적인 학습의 고전적인 사례입니다. 그러나이를 위해서는 초기 분류기가 필요합니다 (기본적으로 사용자 랜덤 데이터를 레이블에 부여 할 수 있지만 옵션이 아닙니다). 초기 분류기를 훈련하려면 적어도 소량의 라벨링 된 교육이 필요합니다. 감독 학습을위한 데이터. 그러나 당신이 가진 모든 것은 표지되지 않은 데이터입니다. 이것들과 함께 무엇을 할 수 있습니까?

글쎄, 당신은 할 수 있습니다 무리 WEKA가 제공하는 표준 클러스터링 알고리즘 또는 일부 특정 클러스터링 도구를 사용하여 관련 인스턴스 그룹으로 구성되어 있습니다. 클루토. 이제 각 클러스터의 X 가장 중심 인스턴스 (클러스터 수와 사용자의 인내에 따라 x)를 사용하고 사용자가 흥미롭거나 흥미롭지 않은 것으로 표시되면 다른 인스턴스 에이 레이블을 채택 할 수 있습니다. 그 클러스터도 (또는 적어도 중앙 클러스터의 경우). Voila, 이제 사용자가 새로운 인스턴스를 흥미롭거나 말할 때마다 분류기를 업데이트하여 초기 분류기를 훈련시키고 활성 학습 프로세스를 시작하는 데 사용할 수있는 교육 데이터가 있습니다. MI를 계산하여 달성하려는 것은 본질적으로 비슷하지만 귀하의 요금에 대한 잘못된 마차 일 수 있다고 생각합니다.

시나리오의 세부 사항을 모르면 레이블 자체에 관심이있는 경우를 제외하고는 레이블이 붙은 데이터가 필요하지 않을 수도 있다고 생각해야합니다. 데이터를 한 번 클러스터링하고 사용자가 모든 클러스터의 중앙 구성원에서 흥미로운 항목을 선택하고 선택한 클러스터의 다른 항목을 흥미로울 수 있다고 제안하십시오. 또한 여기저기서 다른 클러스터의 임의 인스턴스를 제안하므로 사용자가이 중 하나를 선택하면 해당 클러스터도 일반적으로 흥미로울 수 있다고 가정 할 수 있습니다. 모순이 있고 사용자가 클러스터의 일부 멤버를 좋아하지만 같은 클러스터의 일부는 좋아하지 않으면, 당신은 나쁜 입자 그룹으로 데이터를 다시 클러스터하려고합니다. 시작부터 계층 적 클러스터링을 사용하고 모든 모순 사용자 입력 원인에서 클러스터 계층을 아래로 이동함으로써 재 훈련 단계를 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top