python-3.x 对于多类文本分类问题,XGBoost仅对18个类中的不可见数据预测单个类

qhhrdooz  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(134)

在目前的情况下,我训练的XGBoost模型只为看不见的数据集生成了一个类,尽管我在验证集上收到的准确率约为64%,这对我的用例来说还不错。
在我当前的用例中,我试图为每个编写的文本预测一个目标类,这是18个奇数类,总的数据集大小刚刚超过1000行(非常小),但我的主要问题是为什么XGB只生成一个类。
我使用下面的代码来实现这一点:

#tf-idf verctor representation
 tfidf_vect = TfidfVectorizer(analyzer='word',
                     stop_words=stopwords_custom,
                     max_features=total_features,
                     lowercase=True)
 fitted_vectorizer = tfidf_vect.fit(X_train)
 xtrain_tfidf = fitted_vectorizer.transform(X_train)
 xval_tfidf = fitted_vectorizer.transform(X_val)
 #Running the XGB model
 xgb_params = {"max_depth": (3,5,7),'n_estimators': (50,100,150),
'reg_alpha':[0.1,0.5,1],'reg_lambda':[1,1.5,2],'min_child_weight':[2,4,6]}
 from xgboost import XGBClassifier
 xgb_clf = XGBClassifier()
 grid_xgb = GridSearchCV(estimator=xgb_clf,
                    param_grid=xgb_params,
                    cv=5,
                    n_jobs=-1)
 grid_xgb.fit(xtrain_tfidf,y_train)

 print(grid_xgb.best_params_)
 print(grid_xgb.best_score_)
 #Training the model with best params
 final_xgb = XGBClassifier(max_depth = 5,
                      reg_alpha = 1,
                      reg_lambda = 1,
                      n_estimators = 100,
                      objective='multi:softmax',num_class=18,
                      random_state=42)
 final_xgb.fit(xtrain_tfidf,y_train)
 final_xgb_predict = final_xgb.predict(xval_tfidf)
 xgb_accuracy = metrics.accuracy_score(final_xgb_predict, y_val)
 print ("XGBoost > Accuracy: ", xgb_accuracy)

我哪里做错了?

qf9go6mv

qf9go6mv1#

我哪里做错了?
TLDR:您正在使用稀疏数据矩阵训练/进行预测,但您应该使用密集数据矩阵。请使用<ndarray>.todense()方法将fitted_vectorizer.transform(X)结果转换为密集数据矩阵,然后查看情况是否有所改善。
XGBoost将空单元格解释为缺少值,而不是0计数。
如果你用Scikit-Learn的分类器(例如GradientBoostingClassifier)替换XGBClassifier,那么你现有的代码将按预期工作。原因是Scikit-Learn对空单元格的解释不同,因为0计数。

相关问题