перекрестная проверка и классификация текста для несбалансированных данных - PullRequest
0 голосов
/ 06 июня 2018

Я новичок в НЛП, и я пытаюсь создать текстовый классификатор, но мои данные в настоящее время несбалансированы. Самая высокая категория, содержащая до 280 записей, а самая низкая - до 30. Я пытаюсь использовать метод перекрестной проверки длятекущие данные, но после нескольких дней поиска я не могу их реализовать. Это выглядит довольно просто, но я все еще не могу реализовать это.Вот мой код

y = resample.Subsystem
X = resample['new description']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
X_train_counts.shape
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
X_train_tfidf.shape
#SVM
from sklearn.pipeline import Pipeline
from sklearn.linear_model import SGDClassifier
text_clf_svm = Pipeline([('vect', CountVectorizer(stop_words='english')),('tfidf', TfidfTransformer()),('clf-svm', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, n_iter=5, random_state=42)),])
text_clf_svm.fit(X_train, y_train)
predicted_svm = text_clf_svm.predict(X_test)
print('The best accuracy is : ',np.mean(predicted_svm == y_test))

Я проделал еще несколько gridsearch и Stemmer, но сейчас я бы поработал над перекрестной проверкой этого кода. Я довольно хорошо очистил данные, но все равно получаю точность 60% Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 06 июня 2018
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, random_state=None)
# X is the feature set and y is the target
from sklearn.model_selection import RepeatedKFold 
kf = RepeatedKFold(n_splits=20, n_repeats=10, random_state=None) 

for train_index, test_index in kf.split(X):
  #print("Train:", train_index, "Validation:",test_index)
  X_train, X_test = X[train_index], X[test_index] 
  y_train, y_test = y[train_index], y[test_index]
0 голосов
/ 06 июня 2018

Попробуйте сделать передискретизацию или недостаточную выборку.Поскольку данные сильно несбалансированы, существует больший уклон в сторону класса с большим количеством точек данных.После выборки выше / ниже смещение будет очень меньше, а точность увеличится.

В противном случае вместо SVM вы можете использовать MLP.Это дает хорошие результаты даже с несбалансированными данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...