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