ColumnSelector:用于在管道中选择特定列的 Scikit-learn 实用函数

用于 scikit-learn 管道的列选择器类的实现。

from mlxtend.feature_selection import ColumnSelector

概览

ColumnSelector 可用于“手动”特征选择,例如作为 scikit-learn 管道通过网格搜索的一部分。

参考

-

示例 1 - 在特征子集上拟合评估器

加载一个简单的基准数据集

from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target

ColumnSelector 是一个简单的转换器类,用于从数据集中选择特定列(特征)。例如,使用 transform 方法会返回一个只包含两个特征的缩小数据集(此处通过索引 0 和 1 分别表示前两个特征)

from mlxtend.feature_selection import ColumnSelector

col_selector = ColumnSelector(cols=(0, 1))
# col_selector.fit(X) # optional, does not do anything
col_selector.transform(X).shape
(150, 2)

ColumnSelector 同时适用于 numpy 数组和 pandas 数据框

import pandas as pd

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df.head()
花萼长度 (cm) 花萼宽度 (cm) 花瓣长度 (cm) 花瓣宽度 (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
col_selector = ColumnSelector(cols=("sepal length (cm)", "sepal width (cm)"))
col_selector.transform(iris_df).shape
(150, 2)

同样,我们可以将 ColumnSelector 作为 scikit-learn Pipeline 的一部分使用

from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline


pipe = make_pipeline(StandardScaler(),
                     ColumnSelector(cols=(0, 1)),
                     KNeighborsClassifier())

pipe.fit(X, y)
pipe.score(X, y)
0.84

示例 2 - 通过 GridSearch 进行特征选择

示例 1 展示了 ColumnSelector 的简单用法示例;然而,从数据集中选择列非常简单,不需要特定的转换器类,因为我们可以通过以下方式达到相同的结果

classifier.fit(X[:, :2], y)
classifier.score(X[:, :2], y)

然而,ColumnSelector 作为网格搜索的一部分进行特征选择时变得非常有用,如本例所示。

加载一个简单的基准数据集

from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target

创建所有可能的组合

from itertools import combinations

all_comb = []
for size in range(1, 5):
    all_comb += list(combinations(range(X.shape[1]), r=size))
print(all_comb)
[(0,), (1,), (2,), (3,), (0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3), (0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3), (0, 1, 2, 3)]

通过网格搜索进行特征和模型选择

from mlxtend.feature_selection import ColumnSelector
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import make_pipeline

pipe = make_pipeline(StandardScaler(),
                     ColumnSelector(),
                     KNeighborsClassifier())

param_grid = {'columnselector__cols': all_comb,
              'kneighborsclassifier__n_neighbors': list(range(1, 11))}

grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)
grid.fit(X, y)
print('Best parameters:', grid.best_params_)
print('Best performance:', grid.best_score_)
Best parameters: {'columnselector__cols': (2, 3), 'kneighborsclassifier__n_neighbors': 1}
Best performance: 0.98

示例 3 -- 在 scikit-learn 管道中对特征子集进行缩放

以下示例说明了如何在 Pipeline 中将 ColumnSelector 与 scikit-learn 的 FeatureUnion 结合使用,以便仅对数据集中的某些特征(在本玩具示例中:仅第一个和第二个特征)进行缩放。

from mlxtend.feature_selection import ColumnSelector
from sklearn.pipeline import make_pipeline
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from mlxtend.data import iris_data


X, y = iris_data()

scale_pipe = make_pipeline(ColumnSelector(cols=(0, 1)),
                           MinMaxScaler())

pipeline = Pipeline([
    ('feats', FeatureUnion([
        ('col_1-2', scale_pipe),
        ('col_3-4', ColumnSelector(cols=(2, 3)))
    ])),
    ('clf', KNeighborsClassifier())
])


pipeline.fit(X, y)
Pipeline(memory=None,
     steps=[('feats', FeatureUnion(n_jobs=None,
       transformer_list=[('col_1-2', Pipeline(memory=None,
     steps=[('columnselector', ColumnSelector(cols=(0, 1), drop_axis=False)), ('minmaxscaler', MinMaxScaler(copy=True, feature_range=(0, 1)))])), ('col_3-4', ColumnSelector(cols=(2, 3), drop_axis=Fa...ki',
           metric_params=None, n_jobs=None, n_neighbors=5, p=2,
           weights='uniform'))])

API

ColumnSelector(cols=None, drop_axis=False)

用于从数据集中选择特定列的对象。

参数

  • cols : array-like (默认: None)

    指定要选择的特征索引列表。例如,[1, 4, 5] 用于选择第 2、第 5 和第 6 列特征。如果为 None,则返回数组中的所有列。

  • drop_axis : bool (默认=False)

    如果为 True 且只选择一列时,删除最后一个轴。这很有用,例如当 ColumnSelector 用于仅选择一列且结果数组需要馈送到例如 scikit-learn 列选择器时。例如,代替返回形状为 (n_samples, 1) 的数组,drop_axis=True 将返回形状为 (n_samples,) 的数组。

示例

有关用法示例,请参阅 https://mlxtend.cn/mlxtend/user_guide/feature_selection/ColumnSelector/

方法


fit(X, y=None)

模拟方法。不做任何事。

参数

  • X : {array-like, sparse matrix}, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

  • y : array-like, shape = [n_samples] (默认: None)

返回

self


fit_transform(X, y=None)

返回输入数组的一个切片。

参数

  • X : {array-like, sparse matrix}, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

  • y : array-like, shape = [n_samples] (默认: None)

返回

  • X_slice : shape = [n_samples, k_features]

    特征空间的子集,其中 k_features <= n_features


get_params(deep=True)

获取此评估器的参数。

参数

  • deep : boolean, optional

    如果为 True,将返回此评估器及其包含的子对象(它们是评估器)的参数。

返回

  • params : mapping of string to any

    参数名称与其对应值的映射。


set_params(params)

设置此评估器的参数。

此方法适用于简单评估器以及嵌套对象(例如管道)。后者具有 __ 形式的参数,以便可以更新嵌套对象的每个组件。

返回

self


transform(X, y=None)

返回输入数组的一个切片。

参数

  • X : {array-like, sparse matrix}, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

  • y : array-like, shape = [n_samples] (默认: None)

返回

  • X_slice : shape = [n_samples, k_features]

    特征空间的子集,其中 k_features <= n_features