机器学习 | Scikit Learn中的特征聚集

数据科学是一个广泛的领域,数据科学家通常面临着许多障碍,以便从呈现给他们的数据中获得信息性见解,其中一个障碍被称为“洞察力的诅咒”。随着数据集中数据特征数量的增加,数据集建模的复杂性呈指数级增加,并且捕获数据中有意义的模式变得更加困难。在本文中,我们将深入研究特征聚集过程,这是一种特征约简方法,有助于以更好的方式实现数据。

特征聚集

在机器学习中,降维是通过特征聚集来实现的。通过组合相关特征,它试图提取相关细节,同时降低数据集的总维度。它通过将相关特征分组到聚类中来提高计算效率和可解释性。由于该算法对特征之间的成对关联进行了分层合并,因此产生的复合特征较少。在此过程中,原始数据中最具启发性的元素被保留下来,这有助于分组和分类等任务。通过专注于相关的特征组,特征聚集在处理高维数据集时特别有用,可以提高生产力,甚至可能提高模型性能。

特征聚集的主要目标是对相似的相关特征进行分组,并将其聚类,在这里我们将讨论特征聚集如何在幕后工作:

  • 每个特征最初被认为是一个单独的聚类,如果存在“n”个特征,则将形成“n”个聚类。
  • 在上述步骤之后,每个特征聚类之间的距离由我们在初始化特征聚集时提到的亲和度参数来测量。
  • 在这个步骤中,发生聚类的分组,根据距离将最接近的聚类合并在一起成为单个聚类,并且重复这个步骤,直到只剩下“n_clusters”数量的聚类。
  • 在每次合并之后,成对距离用形成的新聚类和现有聚类更新。
  • 重复这些步骤,直到达到所需的聚类数。
  • 一旦到达剩余的“n_clusters”阶段,每个聚类就由一个特征表示。“pooling”参数的值决定了新特征的表示方式,例如,如果我们将pooling参数的值设置为“mean”,它将表示平均值。
  • 最后通过特征聚集形成新的特征来替换原有的特征,从而实现对原有特征的转换。

特征聚集的参数

在这里,我们将讨论一些最重要的特征聚集参数,这些参数可以帮助我们彻底理解这个主题,并帮助我们生成更好的特征组合。

  • n_clusters:这个参数定义了在特征聚集完成后必须形成的聚类数量,'n_clusters’的值告诉我们将在模型训练和测试中使用的最终特征。它有助于消除在模型性能中无用的额外功能,并将它们组合到最接近的集群中。'n_clusters’可以有任何数值,但我们必须小心选择这个参数的值,因为如果选择不正确,它也可能会降低我们的模型性能。
  • affinity:这个参数定义了如何记录聚类之间的距离,通过改变这个“affinity”参数的值,可以观察到聚类结构的变化。它可以具有不同的值,包括“l1”、“l2”、“曼哈顿”、“欧几里德”等。
  • linkage:此参数指定在特征聚集过程中用于计算聚类之间距离的方法。它可以有不同的值,包括“ward”-该值最小化聚类之间的方差,“complete”-该值计算两个聚类中所有数据点之间的最大值,“average”-该值计算两个聚类之间距离的平均值,“single”-该方法计算两个聚类之间数据点之间的最小值。
  • pooling_func:该参数将聚集特征的值组合成最终的聚类特征,在特征聚集中,当相关的相似特征被捆绑在一起时,数据集的特征以某种方式减少,这些特征的不同值根据’pooling_func’参数进行排列。它可以有不同的值,如“平均值”,“中位数”等。该参数采用不同的相关特征,并将它们组合起来,返回一个组合值数组。

特征聚集的实现案例

现在,我们将在Iris数据集上应用特征聚集来减少总特征,该数据集由四个特征组成,即以cm为单位的萼片长度,以cm为单位的萼片宽度,以cm为单位的花瓣长度,以cm为单位的花瓣宽度,并且从这些特征中,我们必须减少等于上述’n_clusters’值的总特征。我们将通过’sklearn’应用特征聚集,并将特征总数从四个减少到两个。

导入库

import pandas as pd
from sklearn.cluster import FeatureAgglomeration
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

加载数据集

# Loading the iris dataset
data = pd.read_csv("Iris.csv", index_col=0)

标签映射和特征分离

# Mapping string labels to numerical values
species_mapping = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
data['Species'] = data['Species'].map(species_mapping)


# Separating features
X = data.drop("Species", axis=1)

为了将Iris species的字符串标签转换为数值,该函数构建了一个映射字典(species_mapping)。接下来,它使用此映射到数据集的“Species”列,用相关数值(0表示“Iris-setosa”,1表示“Iris-versicolor”,2表示“Iris-virginica”)替换字符串标签。最后,将结果分配给变量X,并通过从数据框中删除“Species”列来分离特征。

标准化

# Standardizing the dataset
scaler = StandardScaler()
# This line transforms the dataset and stores the new dataset
X_scaled = scaler.fit_transform(X)

数据集将通过使用scikit-learn中的StandardScaler对象(scaler)进行标准化,该对象使用此代码初始化。接下来,使用fit_transform方法对特征矩阵X进行变换,以具有零均值和单位方差。X_scaled是包含标准化数据集的变量。确保所有特征具有相似的大小对于许多机器学习算法来说是必不可少的,而这个过程就是这样实现的。

特征聚集

n_clusters = 2 # Number of clusters (desired number of output features)

# Creating a FeatureAgglomeration model with n_clusters equals 2
agglomeration = FeatureAgglomeration(n_clusters=n_clusters)

通过此代码将变量n_clusters设置为2,指示所需的聚类数或输出特征。之后,它从scikit-learn中构建了一个名为agglomeration的具有所需集群数量的Agglomeration模型。特征聚集是一种降维策略,它保留了数据中的重要信息,同时通过将相关特征分组在一起来降低特征的总数。

创建数据管道并拟合数据

# Creating a pipeline with scaling and feature agglomeration
pipeline = make_pipeline(scaler, agglomeration)

# Fitting and transforming the data
X_transformed = pipeline.fit_transform(X)

使用make_pipeline函数将前面描述的缩放器和聚集阶段合并到一个称为pipeline的管道中。然后,该过程用于拟合和变换数据集X,产生变换后的数据集X_transformed。管道有助于有效地计划、安排和执行一系列建模和数据处理操作。

比较原始数据和转换数据

# Comparing the shapes of original vs transformed data
print("Original shape:", X.shape)
print("Transformed shape:", X_transformed.shape)

# printing the first rows of the transformed dataset
print("\nHere's the first five rows of transformed Dataframe:\n")
print(X_transformed[:5, :])

输出

Original shape: (150, 4)
Transformed shape: (150, 2)
Here's the first five rows of transformed Dataframe:
[[-1.18497677  1.03205722]
 [-1.26575535 -0.1249576 ]
 [-1.36548916  0.33784833]
 [-1.36796798  0.10644536]
 [-1.22536606  1.26346019]]

绘制原始数据

# Plotting the original data
plt.figure(figsize=(10,5 ))
# Plotting the first two columns of the original data
plt.subplot(1, 2, 2)
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=data['Species'], cmap='viridis')
plt.title('Original Data (First Two Features)')
plt.xlabel('Original Feature 1')
plt.ylabel('Original Feature 2')

plt.tight_layout()
plt.show()

在这里插入图片描述
原始数据的前两列显示为右侧子图中的散点图。使用“viridis”颜色图,根据“Species”列中的物种标签对点进行着色。叙述揭示了原始特征是如何分布和相互关联的。

绘制转换数据

# Plotting the transformed data
plt.figure(figsize=(10, 5))

# Plotting the first two columns of the transformed data
plt.subplot(1, 2, 1)
plt.scatter(X_transformed[:, 0], X_transformed[:, 1],
			c=data['Species'], cmap='viridis')
plt.title('Transformed Data (First Two Features)')
plt.xlabel('Transformed Feature 1')
plt.ylabel('Transformed Feature 2')
plt.tight_layout()
plt.show()

在这里插入图片描述
修改后的数据集通过此代码可视化。在左侧的子图中可以看到修改后数据的前两列的散点图。使用"viridis"颜色图,根据"Species"列中的物种标签对点进行着色。此图形显示了由于特征聚集而改变的特征的分布和关联如何发生变化。

特征聚集的优点和缺点

优点

  • 作为特征聚集的主要目标,它有助于减少数据集中将相似特征分组在一起的额外特征的数量,从而降低数据探索的复杂性。
  • 相似函数的拟合可以减少数据中的噪声,并有助于更好地理解数据中的关系。
  • 减少额外的特征也可以提高模型性能。

缺点

  • 特征聚集可以减少原始数据的描述信息。
  • 如果不明智地选择特征聚集的参数,可能会导致关于数据的信息细节的丢失。
  • 在某些情况下,与先前存在的原始数据相比,特征聚集可能不会提供显著的益处。
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值