Python,sklearn:MinMaxScaler和SVC的管道操作顺序

Python,sklearn:MinMaxScaler和SVC的管道操作顺序,python,machine-learning,scikit-learn,svm,pipeline,Python,Machine Learning,Scikit Learn,Svm,Pipeline,我有一个数据集,我想运行sklearn SVM的SVC模型。某些特征值的大小在[0,1e+7]范围内。我曾尝试使用SVCw/o预处理,我要么得到了不可接受的长计算时间,要么得到了0个真正的积极预测。因此,我试图实现一个预处理步骤,特别是MinMaxScaler 到目前为止,我的代码是: selection_KBest = SelectKBest() selection_PCA = PCA() combined_features = FeatureUnion([("pca", selection_

我有一个数据集,我想运行sklearn SVM的
SVC
模型。某些特征值的大小在[0,1e+7]范围内。我曾尝试使用
SVC
w/o预处理,我要么得到了不可接受的长计算时间,要么得到了0个真正的积极预测。因此,我试图实现一个预处理步骤,特别是
MinMaxScaler

到目前为止,我的代码是:

selection_KBest = SelectKBest()
selection_PCA = PCA()
combined_features = FeatureUnion([("pca", selection_PCA), 
                                  ("univ_select", selection_KBest)])
param_grid = dict(features__pca__n_components = range(feature_min,feature_max),
                  features__univ_select__k = range(feature_min,feature_max))
svm = SVC()            
pipeline = Pipeline([("features", combined_features), 
                     ("scale", MinMaxScaler(feature_range=(0, 1))),
                     ("svm", svm)])
param_grid["svm__C"] = [0.1, 1, 10]
cv = StratifiedShuffleSplit(y = labels_train, 
                            n_iter = 10, 
                            test_size = 0.1, 
                            random_state = 42)
grid_search = GridSearchCV(pipeline,
                           param_grid = param_grid, 
                           verbose = 1,
                           cv = cv)
grid_search.fit(features_train, labels_train)
"(grid_search.best_estimator_): ", (grid_search.best_estimator_)
我的问题具体到以下几行:

pipeline = Pipeline([("features", combined_features), 
                     ("scale", MinMaxScaler(feature_range=(0, 1))),
                     ("svm", svm)])
我想知道我的程序的最佳逻辑是什么,以及
管道中
功能
比例
支持向量机
的顺序。具体来说,我无法决定是否应该将
功能
比例
从现在的状态切换到现在的状态

注1:我想使用
网格搜索。最佳估计器
作为我的分类器模型进行预测

注2:我关心的是制定
管道的正确方法
,以便在预测步骤时,从训练步骤中选择特征并进行缩放

注3:我注意到
svm
没有出现在我的
网格搜索中。最佳估计值\uu
结果。这是否意味着它没有被正确调用

以下是一些表明顺序可能很重要的结果:

pipeline=pipeline([(“scale”,MinMaxScaler(功能范围=(0,1)),
(“特征”,组合特征),
(“svm”,svm)]:
管道(步骤=[('scale',MinMaxScaler(copy=True,feature_range=(0,1)))
('features',FeatureUnion(n_jobs=1,transformer_list=[('pca',pca(copy=True,
n_components=11,whiten=False)),('univ_select',SelectKBest(k=2,
分数_func=)],
变压器重量=…f',最大值=-1,概率=假,
随机(状态=无,收缩=真,tol=0.001,详细=假)))
准确度:0.86247精密度:0.38947召回率:0.05550
F1:0.09716 F2:0.06699总预测数:15000
真阳性:111假阳性:174
假阴性:1889真阴性:12826
管道=管道([(“特征”,组合特征),
(“缩放”,MinMaxScaler(特征值范围=(0,1)),
(“svm”,svm)]:
管道(步骤=[('features',FeatureUnion(n_jobs=1,
变压器列表=[('pca',pca(复制=真,n_分量=1,白度=假)),
('univ_select',SelectKBest(k=1,score_func=)],
转换器(权重=无)),(“缩放”,最小最大缩放(复制=真,特征范围=
(0,…f',max_iter=-1,概率=False,随机状态=None,
收缩=真,tol=0.001,详细=假])
准确度:0.86680精密度:0.50463召回率:0.05450
F1:0.09838 F2:0.06633总预测数:15000
真阳性:109假阳性:107
假阴性:1891真阴性:12893

编辑16041310: 注3:已解决。使用
grid\u search.best\u estimator\u.steps
获取完整步骤



GridsearchCV中有一个参数
refit
(默认为
True
),这意味着将根据完整的数据集重新调整最佳估计器;然后您将使用
最佳估计器
访问此估计器,或者仅使用
GridsearchCV
对象上的
fit
方法

best\u estimator\u
将是完整的管道,如果您在其上调用
predict
,您将获得与培训阶段相同的预处理步骤

如果你想打印出所有的步骤,你可以这样做

print(grid_search.best_estimator_.steps)


SVM在那里,但似乎被输出中的
..
隐藏了起来。
max_iter=1,probability=False
SVC
的参数。谢谢你的提示,@joeln。你知道如何获得完整的非真实打印输出吗?目前没有办法获得完整的非真实打印输出,我意识到:这很难-在
BaseEstimator.中编码。当然,你可以单独报告每个步骤…下面@maxymoo的答案帮助揭示了完整的打印输出,即“网格搜索.最佳估计量.步骤”(不真实)与“网格搜索.最佳估计量”(截断)。这只是因为每个步骤的长度小于500个字符。谢谢@maxymoo。但是,我仍然不确定我的主要困境:在
管道中,
功能
比例
支持向量机
的顺序的最佳逻辑是什么?我想说,通过尝试这两种方法并比较准确度…从你的结果来看,这似乎不是很重要…0.4%的准确度不是很重要。但是,你最好选择准确度更高的那一个。我同意,在这种情况下,准确度上的微小差异比其他选择更好,这是令人安慰的。但是,如果有很大的差异,那么管道的顺序就很重要了,因此正确的管道顺序执行和理解将是至关重要的!这就是提出这个问题的意义所在。
print(grid_search.best_estimator_.steps)
for step in grid_search.best_estimator_.steps:
    print(type(step))
    print(step.get_params())