通过使用聚类作为特征改进分类

Improving classification by using clustering as a feature

我正在尝试通过聚类来改进我的分类结果,并将聚类数据用作另一个特征(或者单独使用它而不是所有其他特征 - 还不确定)。

假设我使用的是无监督算法 - GMM:

gmm = GaussianMixture(n_components=4, random_state=RSEED)

gmm.fit(X_train)

pred_labels = gmm.predict(X_test)

我用训练数据训练模型,用测试数据预测聚类。

现在我想使用分类器(例如 KNN)并使用其中的聚类数据。所以我尝试了:

#define the model and parameters
knn = KNeighborsClassifier()

parameters = {'n_neighbors':[3,5,7],
              'leaf_size':[1,3,5],
              'algorithm':['auto', 'kd_tree'],
              'n_jobs':[-1]}

#Fit the model
model_gmm_knn = GridSearchCV(knn, param_grid=parameters)
model_gmm_knn.fit(pred_labels.reshape(-1, 1),Y_train)

model_gmm_knn.best_params_

但我得到:

ValueError: Found input variables with inconsistent numbers of samples: [418, 891]

训练和测试的维度不同。 那么我该如何实施这种方法呢?

您的方法不正确 - 您正试图将 test 数据 pred_labels 的聚类标签用作单个特征,以便将分类器与你的训练标签Y_train。即使在这些数据集的维度相同的巨大巧合情况下(因此不会给出维度不匹配错误,如此处所示),这在概念上是错误的并且实际上没有任何意义。

你真正想做的是:

  1. 用你的训练数据拟合 GMM
  2. 使用这个拟合 GMM 为您的训练和测试数据获取聚类标签。
  3. 将聚类标签作为新特征附加到两个数据集中
  4. 用这个 "enhanced" 训练数据拟合你的分类器。

总而言之,假设您的 X_trainX_test 是 pandas 数据帧,程序如下:

import pandas as pd

gmm.fit(X_train)
cluster_train = gmm.predict(X_train)
cluster_test = gmm.predict(X_test)

X_train['cluster_label'] = pd.Series(cluster_train, index=X_train.index)
X_test['cluster_label'] = pd.Series(cluster_test, index=X_test.index)

model_gmm_knn.fit(X_train, Y_train)

注意你应该用你的测试数据拟合你的聚类模型 - 只用你的训练数据,否则你会遇到类似于[=15=时遇到的数据泄漏],您的结果将既无效又具有误导性。