使聚类输出适合机器学习模型

时间:2020-02-27 09:02:41

标签: machine-learning data-science feature-engineering

只是一个机器学习/数据科学问题。

a)假设我有一个包含20个特征的数据集,我决定使用3个特征进行聚类的无监督学习-理想情况下,这会产生3个聚类(A,B和C)。

b)然后,我将该输出结果(群集A,B或C)作为新功能(即现在共有21个功能)放回到我的数据集中。

c)我运行回归模型来预测具有21个特征的标签值。

想知道步骤 b)是否多余(因为早期数据集中已经存在这些功能),是否使用更强大的模型(Random forest,XGBoost)以及如何解释这在数学上。

任何意见和建议都很棒!

2 个答案:

答案 0 :(得分:1)

哈哈,真好!您可能会认为您正在使用两个模型,但实际上您是将两个模型合并为一个,并具有跳过连接。因为它是一个模型,所以根据“免费午餐定理”,无法事先知道什么是最佳架构。因此,实际上,您必须尝试一下,并且由于没有免费午餐定理,因此在数学上还没有事先知道它。

答案 1 :(得分:1)

好主意:试一试,看看效果如何。正如您所猜测的,这很大程度上取决于您的数据集和模型选择。就像任何其他要素工程一样,很难预测添加这种要素的行为。但请注意,在某些情况下,它甚至无法改善性能。在下面使用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_trainX_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
相关问题