【发布时间】:2021-06-08 15:23:26
【问题描述】:
假设我想通过交叉验证和使用pipeline 类来比较包含 n>2 个特征的特定(监督)数据集的不同降维方法。
例如,如果我想试验 PCA 和 LDA,我可以这样做:
from sklearn.cross_validation import cross_val_score, KFold
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import StandardScaler
from sklearn.lda import LDA
from sklearn.decomposition import PCA
clf_all = Pipeline(steps=[
('scaler', StandardScaler()),
('classification', GaussianNB())
])
clf_pca = Pipeline(steps=[
('scaler', StandardScaler()),
('reduce_dim', PCA(n_components=2)),
('classification', GaussianNB())
])
clf_lda = Pipeline(steps=[
('scaler', StandardScaler()),
('reduce_dim', LDA(n_components=2)),
('classification', GaussianNB())
])
# Constructing the k-fold cross validation iterator (k=10)
cv = KFold(n=X_train.shape[0], # total number of samples
n_folds=10, # number of folds the dataset is divided into
shuffle=True,
random_state=123)
scores = [
cross_val_score(clf, X_train, y_train, cv=cv, scoring='accuracy')
for clf in [clf_all, clf_pca, clf_lda]
]
但是现在,让我们说——基于一些“领域知识”——我假设特征 3 和 4 可能是“好的特征”(数组 X_train 的第三和第四列)和我想将它们与其他方法进行比较。
如何在pipeline 中包含这样的手动功能选择?
例如
def select_3_and_4(X_train):
return X_train[:,2:4]
clf_all = Pipeline(steps=[
('scaler', StandardScaler()),
('feature_select', select_3_and_4),
('classification', GaussianNB())
])
显然行不通。
所以我假设我必须创建一个具有transform 虚拟方法和fit 方法的特征选择类,该方法返回numpy 数组的两列?还是有更好的办法?
【问题讨论】:
-
我知道这是一个老帖子,但是对于任何看到这个的人来说,他们应该注意到 LDA 是一个分类器,而不是一个转换器,所以它在这个例子中的使用是不合适的。跨度>
标签: python scikit-learn