通过使用聚类作为特征改进分类
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
。即使在这些数据集的维度相同的巨大巧合情况下(因此不会给出维度不匹配错误,如此处所示),这在概念上是错误的并且实际上没有任何意义。
你真正想做的是:
- 用你的训练数据拟合 GMM
- 使用这个拟合 GMM 为您的训练和测试数据获取聚类标签。
- 将聚类标签作为新特征附加到两个数据集中
- 用这个 "enhanced" 训练数据拟合你的分类器。
总而言之,假设您的 X_train
和 X_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=时遇到的数据泄漏],您的结果将既无效又具有误导性。
我正在尝试通过聚类来改进我的分类结果,并将聚类数据用作另一个特征(或者单独使用它而不是所有其他特征 - 还不确定)。
假设我使用的是无监督算法 - 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
。即使在这些数据集的维度相同的巨大巧合情况下(因此不会给出维度不匹配错误,如此处所示),这在概念上是错误的并且实际上没有任何意义。
你真正想做的是:
- 用你的训练数据拟合 GMM
- 使用这个拟合 GMM 为您的训练和测试数据获取聚类标签。
- 将聚类标签作为新特征附加到两个数据集中
- 用这个 "enhanced" 训练数据拟合你的分类器。
总而言之,假设您的 X_train
和 X_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=时遇到的数据泄漏],您的结果将既无效又具有误导性。