删除scikit learn中的特定功能



有没有办法从scikit.learn数据集中删除特定特征?例如,我知道可以使用sklearn.feature_selection删除功能,但这些都是自动删除他们认为无用的功能的过程。有没有办法在不进入数据内部的情况下实现自定义功能删除算法?例如,假设我有一个对功能进行评分的函数,这里提供了一个玩具示例:

def score(feature_index):
    return 0 if feature_index == 1 else 1

现在假设我想删除虹膜数据集中得分低于 0.5 的所有特征。我想做这样的事情:

from sklearn import datasets
iris = datasets.load_iris()
#this is the function I want:
iris.filter_features(score, threshold=0.5)

之后,我希望虹膜数据集少一个特征。现在,我可以这样做:

from sklearn import datasets
iris = datasets.load_iris()
for feature_index in range(len(iris.feature_names)):
    if score(feature_index) < 0.5:
        iris.feature_names.pop(feature_index)
        iris.data = np.delete(iris.data, feature_index, 1)

但这看起来...脏。

没有scikit-learn数据集这样的想法。 scikit-learn使用常见的数据结构只是numpy数组(或scipy稀疏矩阵):

>>> from sklearn.datasets import load_iris
>>> iris = load_iris
>>> type(iris.data)
<class 'numpy.ndarray'>

您可以使用常规的 numpy 数组索引来生成新版本的数据。例如,要删除带有布尔掩码的第二个特征:

>>> import numpy as np
>>> X = iris.data
>>> mask = np.array([True, False, True, True])
>>> X_masked = X[:, mask]

请注意,第一个位置的:符号表示"所有行"。

要检查,您可以打印每个数组的前 5 行:

>>> print(X[:5])
[[ 5.1  3.5  1.4  0.2]
 [ 4.9  3.   1.4  0.2]
 [ 4.7  3.2  1.3  0.2]
 [ 4.6  3.1  1.5  0.2]
 [ 5.   3.6  1.4  0.2]]
>>> print(X_masked[:5])
[[ 5.1  1.4  0.2]
 [ 4.9  1.4  0.2]
 [ 4.7  1.3  0.2]
 [ 4.6  1.5  0.2]
 [ 5.   1.4  0.2]]

您还可以使用基于整数的花式索引来获得相同的结果:

>>> index = np.array([0, 2, 3])
>>> X_indexed = X[:, index]
>>> print(X_indexed[:5])
[[ 5.1  1.4  0.2]
 [ 4.9  1.4  0.2]
 [ 4.7  1.3  0.2]
 [ 4.6  1.5  0.2]
 [ 5.   1.4  0.2]]

要了解有关基本 numpy 操作的更多信息,请查看教程

,例如:

http://scipy-lectures.github.io/

虽然 sklearn 中没有内置的类来执行此操作,但您可以使用标准拟合和变换方法轻松创建一个:

from sklearn.base import TransformerMixin
class ManualFeatureSelector(TransformerMixin):
    """
    Transformer for manual selection of features using sklearn style 
    transform 
    method.  
    """
    def __init__(self, features):
        self.features = features
        pass
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[:,self.features]

一般来说,最好在 sklearn 框架之外进行这样的手动功能选择,但我遇到过将手动功能选择作为管道一部分的情况。

例如,如果一个对象将数组传递给分类器和某个其他对象(如显示函数),您可能只想将某些字段传递给分类器。通过将分类器更改为包含上述转换和原始分类器的管道,可以最容易地完成此操作。

希望对您有所帮助!

相关内容

最新更新