将聚类输出拟合到机器学习模型中
Fit clustering outputs into Machine Learning model
只是一台机器learning/data科学问题。
a) 假设我有一个包含 20 个特征的数据集,我决定使用 3 个特征来执行聚类的无监督学习——理想情况下这会产生 3 个聚类 (A, B 和 C)。
b) 然后我将该输出结果(集群 A、B 或 C)作为新特征(即现在共有 21 个特征)重新放入我的数据集中。
c) 我 运行 一个回归模型来预测具有 21 个特征的标签值。
想知道步骤b)是否多余(因为特征已经存在于较早的数据集中),如果我使用更强大的模型(随机森林,XGBoost),或者不,以及如何从数学上解释这一点。
有任何意见和建议都将不胜感激!
啊哈,不错!您可能认为您正在使用两个模型,但实际上您是将两个模型合并为一个模型,并使用跳过连接。由于它是一种模型,因此根据没有免费午餐定理,无法事先确定什么是最佳架构。因此,实际上,您必须尝试一下,并且从数学上讲,由于没有免费的午餐定理,因此事先无法知道。
好主意:试一试,看看效果如何。如您所料,这在很大程度上取决于您的数据集和模型选择。很难预测添加这种类型的特征会如何表现,就像任何其他特征工程一样。但请注意,在某些情况下,它甚至不会提高您的表现。请参阅下面的测试,其中性能实际下降,使用 Iris 数据集:
import numpy as np
from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn import metrics
# load data
iris = load_iris()
X = iris.data[:, :3] # only keep three out of the four available features to make it more challenging
y = iris.target
# split train / test
indices = np.random.permutation(len(X))
N_test = 30
X_train, y_train = X[indices[:-N_test]], y[indices[:-N_test]]
X_test, y_test = X[indices[N_test:]], y[indices[N_test:]]
# compute a clustering method (here KMeans) based on available features in X_train
kmeans = KMeans(n_clusters=3, random_state=0).fit(X_train)
new_clustering_feature_train = kmeans.predict(X_train)
new_clustering_feature_test = kmeans.predict(X_test)
# create a new input train/test X with this feature added
X_train_with_clustering_feature = np.column_stack([X_train, new_clustering_feature_train])
X_test_with_clustering_feature = np.column_stack([X_test, new_clustering_feature_test])
现在让我们比较仅在 X_train
或 X_train_with_clustering_feature
上学习的两个模型:
model1 = SVC(kernel='rbf', gamma=0.7, C=1.0).fit(X_train, y_train)
print(metrics.classification_report(model1.predict(X_test), y_test))
precision recall f1-score support
0 1.00 1.00 1.00 45
1 0.95 0.97 0.96 38
2 0.97 0.95 0.96 37
accuracy 0.97 120
macro avg 0.97 0.97 0.97 120
weighted avg 0.98 0.97 0.97 120
和另一个模型:
model2 = SVC(kernel='rbf', gamma=0.7, C=1.0).fit(X_train_with_clustering_feature, y_train)
print(metrics.classification_report(model2.predict(X_test_with_clustering_feature), y_test))
0 1.00 1.00 1.00 45
1 0.87 0.97 0.92 35
2 0.97 0.88 0.92 40
accuracy 0.95 120
macro avg 0.95 0.95 0.95 120
weighted avg 0.95 0.95 0.95 120
只是一台机器learning/data科学问题。
a) 假设我有一个包含 20 个特征的数据集,我决定使用 3 个特征来执行聚类的无监督学习——理想情况下这会产生 3 个聚类 (A, B 和 C)。
b) 然后我将该输出结果(集群 A、B 或 C)作为新特征(即现在共有 21 个特征)重新放入我的数据集中。
c) 我 运行 一个回归模型来预测具有 21 个特征的标签值。
想知道步骤b)是否多余(因为特征已经存在于较早的数据集中),如果我使用更强大的模型(随机森林,XGBoost),或者不,以及如何从数学上解释这一点。
有任何意见和建议都将不胜感激!
啊哈,不错!您可能认为您正在使用两个模型,但实际上您是将两个模型合并为一个模型,并使用跳过连接。由于它是一种模型,因此根据没有免费午餐定理,无法事先确定什么是最佳架构。因此,实际上,您必须尝试一下,并且从数学上讲,由于没有免费的午餐定理,因此事先无法知道。
好主意:试一试,看看效果如何。如您所料,这在很大程度上取决于您的数据集和模型选择。很难预测添加这种类型的特征会如何表现,就像任何其他特征工程一样。但请注意,在某些情况下,它甚至不会提高您的表现。请参阅下面的测试,其中性能实际下降,使用 Iris 数据集:
import numpy as np
from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn import metrics
# load data
iris = load_iris()
X = iris.data[:, :3] # only keep three out of the four available features to make it more challenging
y = iris.target
# split train / test
indices = np.random.permutation(len(X))
N_test = 30
X_train, y_train = X[indices[:-N_test]], y[indices[:-N_test]]
X_test, y_test = X[indices[N_test:]], y[indices[N_test:]]
# compute a clustering method (here KMeans) based on available features in X_train
kmeans = KMeans(n_clusters=3, random_state=0).fit(X_train)
new_clustering_feature_train = kmeans.predict(X_train)
new_clustering_feature_test = kmeans.predict(X_test)
# create a new input train/test X with this feature added
X_train_with_clustering_feature = np.column_stack([X_train, new_clustering_feature_train])
X_test_with_clustering_feature = np.column_stack([X_test, new_clustering_feature_test])
现在让我们比较仅在 X_train
或 X_train_with_clustering_feature
上学习的两个模型:
model1 = SVC(kernel='rbf', gamma=0.7, C=1.0).fit(X_train, y_train)
print(metrics.classification_report(model1.predict(X_test), y_test))
precision recall f1-score support
0 1.00 1.00 1.00 45
1 0.95 0.97 0.96 38
2 0.97 0.95 0.96 37
accuracy 0.97 120
macro avg 0.97 0.97 0.97 120
weighted avg 0.98 0.97 0.97 120
和另一个模型:
model2 = SVC(kernel='rbf', gamma=0.7, C=1.0).fit(X_train_with_clustering_feature, y_train)
print(metrics.classification_report(model2.predict(X_test_with_clustering_feature), y_test))
0 1.00 1.00 1.00 45
1 0.87 0.97 0.92 35
2 0.97 0.88 0.92 40
accuracy 0.95 120
macro avg 0.95 0.95 0.95 120
weighted avg 0.95 0.95 0.95 120