有没有办法从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 框架之外进行这样的手动功能选择,但我遇到过将手动功能选择作为管道一部分的情况。
例如,如果一个对象将数组传递给分类器和某个其他对象(如显示函数),您可能只想将某些字段传递给分类器。通过将分类器更改为包含上述转换和原始分类器的管道,可以最容易地完成此操作。
希望对您有所帮助!