使用XGboost对2021年数学建模国赛E题的问一进行求解,这是一个多分类问题,数据规模是650*3500,650个样本,特征是3500个不同光波长下的吸收率,然后标签是11个产地,要求我们训练模型能够进行产地的分类。
import xgboost as xgb
from xgboost import plot_importance
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data = pd.read_excel(r"C:\Users\21138\Desktop\附件2.xlsx")
X =data.drop("OP",axis =1)
Y =data['OP']
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42)
params = {
'booster':'gbtree',
'objective':'multi:softmax',
'num_class':11,
'gamma':0.1,
'max_depth':4,
'lambda':2,
'subsample':0.7,
'colsample_bytree':0.7,
'min_child_weight':3,
'slient':1,
'eta':0.1,
'seed':1000,
'nthread':4,
}
dtrain = xgb.DMatrix(X_train,Y_train)
num_rounds = 500
model = xgb.train(params,dtrain,num_rounds)
dtest = xgb.DMatrix(X_test)
Y_pred = model.predict(dtest)
accuracy = accuracy_score(Y_test,Y_pred)
print('accuarcy:%.2f%%'%(accuracy*100))
plot_importance(model)
plt.show()
结果不管怎么调试都只有50%左右的准确率
也试着提高lambda和降低max_depth来解决过拟合,但准确率都不高
想问问有可能达到高准群率吗,还是说算法不适合这个问题?
如果xgboost效果不太好,你还可以试试catboost,或者randomforest。但这些树模型其实都有一个前提,虽然它们不是距离算法不用归一化,但它们依然对数据是有很强的敏感性的,你怎么调都是50%,那说明这个数据集就是这样,解决方法需要清洗数据集,也就是常说的预处理,或者组合特征,如果是图像,那就图像增强或者TTA,不做预处理,很难有算法直接适应数据的
不知道你这个问题是否已经解决, 如果还没有解决的话: