话不多说,光谱数据集通过csv文件导入,安装对应的库后运行代码即可
import pandas as pd
import xgboost as xgb
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
import seaborn as sns
# 读取训练和测试数据
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
# 分离特征和标签
X_train = train_df.iloc[:, :-1]
y_train = train_df.iloc[:, -1]
X_test = test_df.iloc[:, :-1]
y_test = test_df.iloc[:, -1]
# 编码标签
label_encoder = LabelEncoder()
y_train = label_encoder.fit_transform(y_train)
y_test = label_encoder.transform(y_test)
# 创建DMatrix
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'objective': 'multi:softmax', # 多分类
'num_class': len(label_encoder.classes_), # 分类数
'eval_metric': 'mlogloss', # 多分类log损失
'max_depth': 6,
'eta': 0.3,
'verbosity': 1,
'nthread': 4
}
# 训练模型
num_round = 100
bst = xgb.train(params, dtrain, num_round)
# 预测
preds = bst.predict(dtest)
# 计算准确率
accuracy = accuracy_score(y_test, preds)
print(f'Accuracy: {accuracy * 100:.2f}%')
# 计算混淆矩阵
cm = confusion_matrix(y_test, preds)
cm_display_labels = label_encoder.classes_
# 绘制混淆矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=cm_display_labels, yticklabels=cm_display_labels)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
运行后
简单说明一下其中的超参数:
-
objective: 'multi:softmax'
:- 指定模型的学习目标为多分类问题,输出类别标签。
-
num_class: len(label_encoder.classes_)
:- 定义分类任务中的类别数。
-
eval_metric: 'mlogloss'
:- 评估模型性能的指标为多分类的对数损失(log loss)。
-
max_depth: 6
:- 树的最大深度,控制模型的复杂度和防止过拟合。
-
eta: 0.3
:- 学习率,用于更新模型中的每棵树的权重,控制步长。
-
verbosity: 1
:- 控制训练过程中的输出信息,1表示输出详细信息。
-
nthread: 4
:- 指定训练时使用的线程数,设置为4个线程。