多类分类的满分?

Perfect scores in multiclassclassification?

我正在研究 multiclass classification 问题,其中 3 (1, 2, 3) classes 是完美分布的。 (每个 class 的 70 个实例导致 (210, 8) 数据帧)。

现在我的数据按顺序分布了所有 3 个 classes,即前 70 个实例是 class1,接下来的 70 个实例是 class2,最后 70 个实例是 class 3. 我知道这种分布会导致在训练集上得分高但在测试集上得分低,因为测试集有 classes 模型没有看到。所以我在train_test_split中使用了stratify参数。下面是我的代码:-

# SPLITTING 
train_x, test_x, train_y, test_y = train_test_split(data2, y, test_size = 0.2, random_state = 
69, stratify = y)

cross_val_model = cross_val_score(pipe, train_x, train_y, cv = 5,
                              n_jobs = -1, scoring = 'f1_macro')
s_score = cross_val_model.mean()


def objective(trial):

    model__n_neighbors = trial.suggest_int('model__n_neighbors', 1, 20)
    model__metric = trial.suggest_categorical('model__metric', ['euclidean', 'manhattan', 
    'minkowski'])
    model__weights = trial.suggest_categorical('model__weights', ['uniform', 'distance'])

    params = {'model__n_neighbors' : model__n_neighbors, 
          'model__metric' : model__metric, 
          'model__weights' : model__weights}

    pipe.set_params(**params)

    return np.mean( cross_val_score(pipe, train_x, train_y, cv = 5, 
                                    n_jobs = -1, scoring = 'f1_macro'))

knn_study = optuna.create_study(direction = 'maximize')
knn_study.optimize(objective, n_trials = 10)

knn_study.best_params
optuna_gave_score = knn_study.best_value    

pipe.set_params(**knn_study.best_params)
pipe.fit(train_x, train_y)
pred = pipe.predict(test_x)
c_matrix = confusion_matrix(test_y, pred)
c_report = classification_report(test_y, pred)

现在的问题是我在所有方面都获得了满分。执行 cv 的 f1 宏观分数为 0.898。下面是我的混淆矩阵和 class化验报告:-

14  0   0 
0   14  0 
0   0   14

分类报告:-

              precision    recall  f1-score   support

       1       1.00      1.00      1.00        14
       2       1.00      1.00      1.00        14
       3       1.00      1.00      1.00        14

accuracy                            1.00        42
macro avg       1.00      1.00      1.00        42
weighted avg    1.00      1.00      1.00        42

我是过拟合了还是什么?

终于找到答案了。我使用的数据集是问题所在。该数据集是为 knn 算法量身定制的,这就是为什么我使用相同的算法获得满分的原因。

我在对这个数据集进行聚类练习并且 K-Means 算法完美地预测了聚类后得出了这个结论。