scikit RandomForestClassifier - реальные результаты не соответствуют прогнозу - PullRequest
1 голос
/ 23 октября 2019

Я новичок в машинном обучении и пытаюсь классифицировать текст с помощью scikit RandomForestClassifier. У меня проблема в том, что результаты моих тестов не соответствуют отчету о классификации склеарна. Учебный набор содержит около 25 тыс. Образцов, около 25% из которых помечены как 1 и 75% 0. У меня есть дополнительный набор из 1 тыс. Тестов, который я использую для тестирования после тренировки.

# Поезд

    vectorizer = TfidfVectorizer(max_features=40, stop_words=stopwords.words('english'))
    X = vectorizer.fit_transform(documents).toarray()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=0)

    classifier = RandomForestClassifier(
    n_jobs=-1, bootstrap=False, n_estimators=200, random_state=0)

    classifier.fit(X_train, y_train)
    y_pred = classifier.predict(X_test)

    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    print(accuracy_score(y_test, y_pred))

               precision    recall  f1-score   support

       0       0.98      0.99      0.98      4231
       1       0.95      0.90      0.92       883

accuracy                           0.97      5114

# Тест

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]

df, y = df.data, df.target

test_documents = []
for body in range(0, len(df)):
    document = str(df[body])
    test_documents.append(document)
X = vectorizer.fit_transform(test_documents).toarray()
prediction = pd.DataFrame(classifier.predict(X))

              precision    recall  f1-score   support

       0       0.89      0.87      0.88       856
       1       0.38      0.42      0.40       154

1 Ответ

1 голос
/ 23 октября 2019

Я надеялся, что Mr_U4913 собирался добавить это, но вместо этого я сделаю это.

попробуйте это для своего тестового кода:

test

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]

df, y = df.data, df.target

test_documents = []
for body in range(0, len(df)):
    document = str(df[body])
    test_documents.append(document)
X = vectorizer.transform(test_documents).toarray()  #here is where change is!
prediction = pd.DataFrame(classifier.predict(X))

Обратите внимание на изменение. ..мы теперь используем метод преобразования для векторизатора. Я предполагаю, что вы можете поместить этот тестовый код в тот же файл, что и ваш обучающий код, чтобы ваш объект векторизатора был еще жив.

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

edit: вы также можете попробовать классификатор логистики ... иногда это дает приличные результаты в этомсортировка данных.

...