我想使用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) 我正在尝试在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) 我有一组要建模的特征,其中一个实际上是在 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)