2017-02-20 9 views
0

나는이 질문을 R 메일 목록에 올렸지 만 여기서는 대답과 팁을 찾는 더 좋은 곳이라고 생각합니다.SVM을 사용한 텍스트 분류에 관한 특징 공간의 차이

저는 현재 학생의 에세이를 텍스트로 분류하고 특정 클래스에 맞는 텍스트를 찾으려고 을 시도하고 있습니다. 나는 분류자를 시험하기 위해 한 학기 (A)를 다른 학기의 훈련 및 텍스트 (B)에 사용합니다. 내 워크 플로우는 다음과 같이이다 :

  • 은 약 626와 DTM (B)를 구축, 약 1387 용어 (패키지 TM)
  • 는 B의 모든 텍스트를 읽을 수있는 DTM (A)를 구축하는 모든 텍스트를 읽어 용어 SVM (패키지 e1071)를 사용하여
  • 기차 DTM (A)로 분류,

는 지금은 classifyer를 사용하여 DTM (B)의 모든 텍스트를 분류합니다. 그러나 predict()를 사용하려고하면 항상 오류 메시지가 나타납니다. eval (expr, envir, enclos)의 오류 : 'XY'객체를 찾을 수 없습니다. DTM (A)와 DTM (B)의 숫자가 이며 결과적으로 DTM (B)에서 사용할 수있는 모델은 모두 입니다.

확실히 두 개의 서로 다른 기능 공간으로 분류하는 것이 문제지만이 "실제 세계 문제"에 대한 해결책을 찾고 싶습니다. 아이디어는 학생이 제출 한 텍스트가 다른 텍스트와 잘 맞는지 아닌지 식별하는 것입니다. 그래서 내 순진한 생각은 한 학기의 텍스트로 예측 모델을 개발하고 [DTM (A)] 다음이 모델을 사용하여 다른 학기 [DTM (B)]의 새 텍스트를 평가하는 것입니다. 새 텍스트가 원본 DTM에 없기 때문에 기능 공간이 다릅니다. 지금까지는 모든 텍스트에서 작성된 DTM을 사용하는 코드 만 발견했지만 새로운 DTM (A)`을 작성하고 매번 SVM을 다시 훈련해야합니다.

내 질문은 : 어떻게 처리해야합니까? 동일한 기능 공간을 얻으려면 DTM (A) 및 DTM (B)에 사용 된 이라는 용어와 일치해야합니까? 이것은 DTM (A) 또는 DTM (B)에 여러 개의 빈/NA 열을 추가하는 의 용어 수를 줄여서 얻을 수 있습니다. 아니면 내 문제에 다른 해결책이 있습니까?

종류는

비욘 좀 더 실험과 몇 가지 조사 후

+0

http://stackoverflow.com/questions/39721737/how-to-handle-errors-in-predict-function-of-r이 도움이 될 것으로 생각됩니다. – abhiieor

+0

감사합니다.하지만 링크 된 게시물은 DTM의 다른 열을 의미하는 다른 지형지 물에 관한 것이 아니라 다양한 수준의 카테고리 변수에 관한 것입니다. – PsyR

+0

일반화 할 수 있습니다. 새로운 학습자를 다루는 기계 학습 방법은 없습니다. 기본적으로 새로운 수준의 범주 형 변수에 더미 변수를 만들 때 얻을 수 있습니다. 그래서 본질적으로 제 대답에서 말했듯이 당신은 훈련의 한 부분이며 따라서 모델의 변수 목록을 유지할 필요가 있습니다. 이 목록을 기반으로 테스트/예측 데이터를 필터링 한 다음 훈련 된 개체에 점수를 매기십시오. – abhiieor

답변

0

, 내가 RTextTools 패키지와 그 기능 "create_matrix()"를 통해 온 간주한다. 이 함수는 새 DTM을 만들고 모델을 학습하는 데 사용 된 originalMatrix로 행렬을 조정할 수도 있습니다. 이것은 내가 찾고 있었던 바로 그 것이었다. 그래서 원래의 코드 (https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R)을 보았고,이 함께했다 :

# get all the terms which are in the training df, but not in the test df 
terms <- colnames(train.df[,which(!colnames(train.df) %in% colnames(test.df))]) 
# weight is set, this is just in case that weightTfIdf was used, otherwise it should be 0 
weight <- 0.000000001 
# now create a new matrix with the missing terms 
amat <- matrix(weight, nrow = nrow(test.df), ncol = length(terms)) 
colnames(amat) <- terms 
rownames(amat) <- rownames(test.df) 

# create a new test df with the original values plus the new matrix with the missing terms 
test.df.fixed <- cbind(test.df[,which(colnames(test.df) %in% colnames(train.df))],amat) 
test.df.fixed <- test.df.fixed[, sort(colnames(test.df.fixed))] 

결과는 교육에 사용 된 데이터 프레임의 모든 기능 (열)이있는 테스트 데이터 프레임이다. 기본적으로 다운 필터링 대신 "업 필터링"입니다. 빠른 테스트를 통해 매우 잘 작동한다는 것을 알 수있었습니다 (정확도 : .91, Kappa : .88).

0

현실 세계에서 훈련 및 테스트 데이터는 완전히 독립적입니다. 즉, 테스트 문서에 대해 아무 것도 모르는 상태입니다. 이를 염두에두고 문제를 해결하는 가장 좋은 방법은 데이터 세트 B에 대한 TDM을 데이터 세트 A에 사용 된 어휘 (예 : A에서 발생한 단어 만 집계)에 기초하는 것입니다.