LDA modelinin doğruluğu neden sürekli değişiyor ve neden yüksek?

Önce bütün hedefi açıklayalım, sonra soruyu gözden geçirelim.

Konuyu bir belge koleksiyonundan çıkarmak için LAtent Dirichlet Allocation ve NMF gibi konu modelleme kullanıyorum.

Veri setim PubMed, bu koleksiyonun yaklaşık üç kategorisini kullandım ve soyut kısımdan geçtim (her kategoride 10 soyut dosya var, yani toplamda 30 soyut var)

Verilerime LDA'yı uyguladıktan sonra, değerlendirme sürecinde, her belge için oluşturulan konuların doğruluğunun ne olduğunu görmek için, sklearn'deki OneVsRestClassifier ile değerlendirdim.

OneVsRestClassifier bir sınıflandırma yöntemi olduğundan, etiketli verilere ihtiyaç duyar, bu yüzden LDA modelinin çıktısı için etiketi nasıl oluşturduğumu açıklayacağım.

LDA'da belge-konu matrisini kullandım ve bu matris her belge için olduğu gibi bazı konular da var. konular için bu konunun bu belgeye hangi olasılıkla ait olduğunu gösteren bir olasılık var.

Bu nedenle, her satırın etiketi, konuların en yüksek olasılığıdır (örneğin konuyu gösteren dizinler, örneğin ilk sütundaki olasılık, konunun0 olasılığını gösterir).

Umarım açıklamalar açıktır, eğer değilse, lütfen daha fazla örnek vereceğim.

yukarıdaki yaklaşımı yapan kod budur:

import os

from nltk.tokenize import RegexpTokenizer
from nltk.stem.porter import PorterStemmer
from sklearn.cross_validation import train_test_split
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC
import numpy as np
from sklearn import metrics

tokenizer = RegexpTokenizer(r'\w+')

# Create p_stemmer of class PorterStemmer
lines=[]
p_stemmer = PorterStemmer()
lisOfFiles=[x[2] for x in os.walk("data")]

fullPath = [x[0] for x in os.walk("data")]

for j in lisOfFiles[2]:
    with open(os.path.join(fullPath[2],j)) as f:
                    a=f.read()
                    lines.append(a)


for j in lisOfFiles[3]:
    with open(os.path.join(fullPath[3],j)) as f:
                    a=f.read()
                    lines.append(a)

for j in lisOfFiles[4]:
    with open(os.path.join(fullPath[4],j)) as f:
                    a=f.read()
                    lines.append(a)

# compile sample documents into a list
doc_set = lines

tf_vectorizer = CountVectorizer(max_features=1000,
                                stop_words='english')

tf = tf_vectorizer.fit_transform(doc_set)

# Trains the LDA models.
lda = LatentDirichletAllocation(n_topics=10, max_iter=5,
                                learning_method='online',
                                learning_offset=50.,
                                random_state=0)

lda_x=lda.fit_transform(tf)

#creating the labels

new_y = np.argmax(lda_x, axis=1)

Xtrain, Xvalidate, ytrain, yvalidate = train_test_split(lda_x, new_y, test_size=.3)

predictclass=OneVsRestClassifier(LinearSVC(random_state=0)).fit(Xtrain, ytrain).predict(Xvalidate)
yacc=metrics.accuracy_score(yvalidate,predictclass)
print (yacc)

Şimdi benim sorum:

Bu kodu çalıştırdığınızda, çoğu zaman bana 100 doğruluk veriyor gibi görünüyor: |

ve birkaç kez çalıştırdığımda doğruluk değişiyor ve asla 66'nın altına düşmüyor ancak 66 ile 100 arasında değişiyor ve çoğu zaman 100'dür.

Bu değişimin LDA'nın rastgele örneklenmesi yüzünden olduğunu biliyorum. ilk önce kodumda bir sorun olduğuna inanıyorum, çok iyi bir doğruluk elde ediyorum.

İkincisi, doğruluk böyle değişiyorsa, hangisi güvenilirse, bir çıktıda düzeltmek için herhangi bir yaklaşım var mı?

Aynı süreç NMF modelim için de oluyor.

Benim Şüphem

tek kuşkum, üzerinde çalıştığım verilerdi. ilk paragrafta açıkladığım gibi, bir listeye aktardığım 30 soyut dosyayı içeriyor, bu yüzden virgülle ayrılmış bir listem var, fakat soyut dosyada virgül varsa, doğru belgeyi nasıl gerçekleştirebilir? !!

ancak listeyi yineleyerek ve listenin boyutunu alarak test ettim.

Güncelleme 2

300 soyuttan 3000 soyut'a veri değiştirdiğimde Doğruluk hala 93'ten 97'ye değişiyor, yani farkın azaldığı anlamına geliyor.

2

Cevap yok

0