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

#python #machine-learning #xgboost #tf-idf #xgbclassifier

Вопрос:

Я создал модель бинарной классификации, которая предсказывает, является ли статья частью положительного или отрицательного класса. Я использую TF-IDF, введенный в классификатор XGBoost, наряду с другой функцией. Я получаю оценку AUC, очень близкую к 1, как при обучении/тестировании, так и при перекрестной проверке. Я получил оценку .5 при тестировании моих данных о несогласии. Это показалось мне странным, поэтому я ввел те же самые данные обучения в свою модель, и даже это дает оценку AUC .5. Приведенный ниже код принимает фрейм данных, помещается и преобразуется в векторы tf-idf и форматирует все это в DMatrix.

 def format_to_dmatrix(known_targets):  y = known_targets['target']  X = known_targets[['body', 'day_of_year']]  X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=.1, random_state=42)   tfidf.fit(X_train['body'])  pickle.dump(tfidf.vocabulary_,open("tfidf_features.pkl","wb"))  X_train_enc = tfidf.transform(X_train['body']).toarray()  X_test_enc = tfidf.transform(X_test['body']).toarray()   new_cols = tfidf.get_feature_names()  new_cols.append('day_of_year')   a = np.array(X_train['day_of_year'])  a = a.reshape(a.shape[0], 1)  b = np.array(X_test['day_of_year'])  b = b.reshape(b.shape[0], 1)   X_train = np.append(X_train_enc, a, axis=1)  X_test = np.append(X_test_enc, b, axis=1)   dtrain = xgb.DMatrix(X_train, label=y_train.values, feature_names=new_cols)  dtest = xgb.DMatrix(X_test, label=y_test.values, feature_names=new_cols)  return dtrain, dtest, tfidf  

Я перекрестно проверяю и нахожу среднее значение auc теста 0,9979, поэтому сохраняю модель, как показано ниже.

 best_model = xgb.train( params, dtrain, num_boost_round=num_boost_round, evals=[(dtest, "Test")]  

Это мой код для загрузки новых данных:

 def test_newdata(data): tf1 = pickle.load(open("tfidf_features.pkl", 'rb')) tf1_new = TfidfVectorizer(max_features=1500, lowercase=True, analyzer='word', stop_words='english', ngram_range=(1, 1), vocabulary = tf1.keys()) encoded_body = tf1_new.fit_transform(data['body']).toarray() new_cols = tf1_new.get_feature_names() new_cols.append('day_of_year') day_of_year = np.array(data['day_of_year']) day_of_year = day_of_year.reshape(day_of_year.shape[0], 1) formatted_test_data = np.append(encoded_body, day_of_year, axis=1) df= pd.DataFrame(formatted_test_data, columns=new_cols) return xgb.DMatrix(df)  

И этот код ниже показывает, что мой показатель AUC равен .5, несмотря на загрузку одних и тех же данных. Есть ли где-то ошибка, которую я пропустил?

 loaded_model = xgb.Booster() loaded_model.load_model("earn_modelv3.model")  holdout = known_targets formatted_test_data = test_newdata(holdout)  holdout_preds = loaded_model.predict(formatted_test_data)  predictions_binary = np.where(holdout_preds gt; .5, 1, 0) {round(roc_auc_score(holdout['target'], predictions_binary) ,4)