小编Dav*_*idS的帖子

使用scikit-learn进行递归特征消除和网格搜索

我想使用scikit-learn通过嵌套网格搜索和每个要素子集的交叉验证来执行递归特征消除.从RFECV文档中可以看出,使用estimator_params参数支持这种类型的操作:

estimator_params : dict

    Parameters for the external estimator. Useful for doing grid searches.
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将超参数网格传递给RFECV对象时

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=5, estimator_params={'C': [0.1, 10, 100, 1000]})
selector = selector.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

我得到一个错误

  File "U:/My Documents/Code/ModelFeatures/bin/model_rcc_gene_features.py", line 130, in <module>
    selector = selector.fit(X, y)
  File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", line 336, in fit
    ranking_ = rfe.fit(X_train, y_train).ranking_
  File "C:\Python27\lib\site-packages\sklearn\feature_selection\rfe.py", …
Run Code Online (Sandbox Code Playgroud)

feature-selection scikit-learn

13
推荐指数
2
解决办法
5447
查看次数

使用scikit-learn中的rbf内核对SVM使用递归特征消除的ValueError

我正在尝试在scikit-learn中使用递归功能消除(RFE)功能,但不断收到错误ValueError: coef_ is only available when using a linear kernel.我正在尝试使用rbf内核为支持向量分类器(SVC)执行功能选择.来自网站的这个例子执行得很好:

print(__doc__)

from sklearn.svm import SVC
from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn.datasets import make_classification
from sklearn.metrics import zero_one_loss

# Build a classification task using 3 informative features
X, y = make_classification(n_samples=1000, n_features=25, n_informative=3,
                       n_redundant=2, n_repeated=0, n_classes=8,
                       n_clusters_per_class=1, random_state=0)

# Create the RFE object and compute a cross-validated score.
svc = SVC(kernel="linear")
rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),
          scoring='accuracy')
rfecv.fit(X, y)

print("Optimal number of features : …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn rfe

3
推荐指数
1
解决办法
2661
查看次数

仅在 scikit-learn 中对特征子集使用 PCA 的管道

我有一组要建模的特征,其中一个实际上是在 100 个不同点采样的直方图。因此这个直方图特征实际上是 100 个不同的特征。我想通过对直方图特征执行 PCA 来降低建模问题的维度,但是我不想在 PCA 中包含其他特征以保持模型的可解释性。

理想情况下,我想与 PCA 形成一个管道来转换直方图特征和 SVC 以执行拟合,我将其提供给 GridSearchCV 以确定 SVC 超参数。在这个设置中是否有可能让 PCA 只转换我的特征的一个子集(直方图箱)?最简单的方法是编辑 PCA 对象以接受特征掩码,但我当然更愿意使用现有功能。

编辑

在实施@eickenberg 的回答后,我意识到我还需要一个用于新 PCA 类的 inverse_transform 方法。此方法使用列的原始顺序重新创建初始特征集。下面为有兴趣的其他人提供:

def inverse_transform(self, X):
    if self.mask is not None:
        # Inverse transform appropriate data
        inv_mask = np.arange(len(X[0])) >= sum(~self.mask)
        inv_transformed = self.pca.inverse_transform(X[:, inv_mask])

        # Place inverse transformed columns back in their original order
        inv_transformed_reorder = np.zeros([len(X), len(self.mask)])
        inv_transformed_reorder[:, self.mask] = inv_transformed
        inv_transformed_reorder[:, ~self.mask] = X[:, ~inv_mask]
        return inv_transformed_reorder
    else:
        return self.pca.inverse_transform(X)
Run Code Online (Sandbox Code Playgroud)

python scikit-learn

3
推荐指数
1
解决办法
1937
查看次数

标签 统计

scikit-learn ×3

python ×2

feature-selection ×1

rfe ×1