Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2017 18:09:46

Lion
Зарегистрирован: 2017-05-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

тестирование классификации в scikit-learn

На своих данных обучил document_classification_20newsgroups.py из scikit-learn, получил словарь и модели (12 штук). Теперь модели загружаю и пытаюсь тестировать на отдельных файлах:

 with open(fl, 'r', encoding='utf8') as f:
    data_test = f.readlines()
#считал текстовый файл
with open('dict.txt', 'r', encoding='utf8') as f:
    voc = [line.rstrip('\n') for line in f]
#считал словарь из обучения 
clf = joblib.load("LinearSVC.dump")
#загрузил модель(как пример) 
vectorizer = CountVectorizer( vocabulary=voc)
X_test = vectorizer.transform(data_test)
#получил из текста вектор = длине словаря
pred = clf.predict(X_test)
#сам тест
print(pred)
При обучении результат показывал на разных методах 96-98%. При тестировании отдельных файлов результат “на глаз” 30-50%. Не могу понять, что делаю не то.

Офлайн

#2 Май 12, 2017 15:18:27

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

тестирование классификации в scikit-learn

Покажите как учили, размер выборки, результаты кросс валидации. Возможно переобучение…

Что значит: “на глаз” 30-50%? accuracy_score?

 from sklearn.metrics import accuracy_score
print(accuracy_score(y_true, clf.predict(X_test)))

Отредактировано noob_saibot (Май 12, 2017 15:19:08)

Офлайн

#3 Май 12, 2017 15:58:31

Lion
Зарегистрирован: 2017-05-04
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

тестирование классификации в scikit-learn

“На глаз” - это значит натравливаю каждое сообщение на разные модели, и смотрю результат по каждой модели, а результат - “кто в лес, кто по дрова”.

В общем, разобрался. При обучении нужно скидывать матрицу TFiDF,

     vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5, stop_words='english')
    X_train = vectorizer.fit_transform(data_train.data)
    joblib.dump(vectorizer, "vectorizer.dump")
а при тестировании ее загружать:
vectorizer = joblib.load("vectorizer.dump")
и эту штуку сразу и фитить:
X_test = vectorizer.transform(data_test)
Я же грузил только словарь из процедуры TFiDF
 dict(zip(vectorizer.get_feature_names(), idf))
и на нем строил тестовый вектор. Видимо, при получении моделей словарь хешируется и порядок нарушается.
Как я понимаю, тестирование работает не с одним вектором (полученным из тестового сообщения), а с пучком векторов на весах из TFiDF по тематикам, выбирая самый близкий по косинусу.
В принципе, это правильно: результат получается на 0.5-1% выше, чем на просто одном частотном векторе сообщения, но и работает, соответственно, медленнее.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version