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