在有或没有管道的情况下,如何在 k 折交叉验证后提取重要特征?
How to extract important features after k-fold cross validation, with or without a pipeline?
我想构建一个使用交叉验证的分类器,然后从每个折叠中提取重要特征(/系数),以便我可以查看它们的稳定性。目前我正在使用 cross_validate 和管道。我想使用一个管道,这样我就可以在每个折叠中进行特征选择和标准化。我坚持如何从每个折叠中提取特征。如果这是问题所在,我有一个不同的选择来使用下面的管道。
这是我到目前为止的代码(我想尝试 SVM
和逻辑回归)。我已经包含了一个小的 df 作为例子:
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
from sklearn.model_selection import cross_validate
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import pandas as pd
df = pd.DataFrame({'length': [5, 8, 0.2, 10, 25, 3.2],
'width': [60, 102, 80.5, 30, 52, 81],
'group': [1, 0, 0, 0, 1, 1]})
array = df.values
y = array[:,2]
X = array[:,0:2]
select = SelectKBest(mutual_info_classif, k=2)
scl = StandardScaler()
svm = SVC(kernel='linear', probability=True, random_state=42)
logr = LogisticRegression(random_state=42)
pipeline = Pipeline([('select', select), ('scale', scl), ('svm', svm)])
split = KFold(n_splits=2, shuffle=True, random_state=42)
output = cross_validate(pipeline, X, y, cv=split,
scoring = ('accuracy', 'f1', 'roc_auc'),
return_estimator = True,
return_train_score= True)
我想我可以做类似的事情:
pipeline.named_steps['svm'].coef_
但我收到错误消息:
AttributeError: 'SVC' object has no attribute 'dual_coef_'
如果无法使用管道执行此操作,我可以使用 'by hand' 交叉验证来执行此操作吗?例如:
for train_index, test_index in kfold.split(X, y):
kfoldtx = [X[i] for i in train_index]
kfoldty = [y[i] for i in train_index]
但我不确定下一步该怎么做!任何帮助将不胜感激。
您应该使用 cross_validate
的 output
来获取拟合模型的参数。原因是 cross_validate
会克隆管道。因此,你不会发现给定的 pipeline
变量在被馈送到 cross_validate
.
之后被拟合
output
是字典,它有 estimator
作为键之一,它的值是 k_fold
个匹配的 pipeline
对象。
来自 Documentation:
return_estimator : boolean, default False
Whether to return the estimators fitted on each split.
试试这个!
>>> fitted_svc = output['estimator'][0].named_steps['svm'] # choosing the first fold comb
>>> fitted_svc.coef_
array([[1.05826838, 0.41630046]])
我想构建一个使用交叉验证的分类器,然后从每个折叠中提取重要特征(/系数),以便我可以查看它们的稳定性。目前我正在使用 cross_validate 和管道。我想使用一个管道,这样我就可以在每个折叠中进行特征选择和标准化。我坚持如何从每个折叠中提取特征。如果这是问题所在,我有一个不同的选择来使用下面的管道。
这是我到目前为止的代码(我想尝试 SVM
和逻辑回归)。我已经包含了一个小的 df 作为例子:
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
from sklearn.model_selection import cross_validate
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
import pandas as pd
df = pd.DataFrame({'length': [5, 8, 0.2, 10, 25, 3.2],
'width': [60, 102, 80.5, 30, 52, 81],
'group': [1, 0, 0, 0, 1, 1]})
array = df.values
y = array[:,2]
X = array[:,0:2]
select = SelectKBest(mutual_info_classif, k=2)
scl = StandardScaler()
svm = SVC(kernel='linear', probability=True, random_state=42)
logr = LogisticRegression(random_state=42)
pipeline = Pipeline([('select', select), ('scale', scl), ('svm', svm)])
split = KFold(n_splits=2, shuffle=True, random_state=42)
output = cross_validate(pipeline, X, y, cv=split,
scoring = ('accuracy', 'f1', 'roc_auc'),
return_estimator = True,
return_train_score= True)
我想我可以做类似的事情:
pipeline.named_steps['svm'].coef_
但我收到错误消息:
AttributeError: 'SVC' object has no attribute 'dual_coef_'
如果无法使用管道执行此操作,我可以使用 'by hand' 交叉验证来执行此操作吗?例如:
for train_index, test_index in kfold.split(X, y):
kfoldtx = [X[i] for i in train_index]
kfoldty = [y[i] for i in train_index]
但我不确定下一步该怎么做!任何帮助将不胜感激。
您应该使用 cross_validate
的 output
来获取拟合模型的参数。原因是 cross_validate
会克隆管道。因此,你不会发现给定的 pipeline
变量在被馈送到 cross_validate
.
output
是字典,它有 estimator
作为键之一,它的值是 k_fold
个匹配的 pipeline
对象。
来自 Documentation:
return_estimator : boolean, default False
Whether to return the estimators fitted on each split.
试试这个!
>>> fitted_svc = output['estimator'][0].named_steps['svm'] # choosing the first fold comb
>>> fitted_svc.coef_
array([[1.05826838, 0.41630046]])