elk*_*000 8 random-forest scikit-learn
我在Scikit-Learn中构建了一个管道,其中包括两个步骤:一个构建要素,第二个是RandomForestClassifier.
虽然我可以保存该管道,但是查看各个步骤以及步骤中设置的各种参数,我希望能够从结果模型中检查要素重要性.
那可能吗?
elk*_*000 12
啊,是的.
您的列表标识了要检查估算器的步骤:
例如:
pipeline.steps[1]
Run Code Online (Sandbox Code Playgroud)
哪个回报:
('predictor',
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features='auto', max_leaf_nodes=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=50, n_jobs=2,
oob_score=False, random_state=None, verbose=0,
warm_start=False))
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接访问模型步骤:
pipeline.steps [1] [1] .feature_importances_
我写了一篇关于这样做的文章,您可以在这里找到。
一般来说,对于管道,您可以访问该named_steps参数。这将为您提供管道中的每个变压器。例如对于这个管道:
model = Pipeline(
[
("vectorizer", CountVectorizer()),
("transformer", TfidfTransformer()),
("classifier", classifier),
])
Run Code Online (Sandbox Code Playgroud)
我们可以通过执行以下操作来访问各个功能步骤。model.named_steps["transformer"].get_feature_names()这将从 中返回功能名称列表TfidfTransformer。这一切都很好,但并没有真正涵盖很多用例,因为我们通常想要组合一些功能。以这个模型为例:
model = Pipeline([
("union", FeatureUnion(transformer_list=[
("h1", TfidfVectorizer(vocabulary={"worst": 0})),
("h2", TfidfVectorizer(vocabulary={"best": 0})),
("h3", TfidfVectorizer(vocabulary={"awful": 0})),
("tfidf_cls", Pipeline([
("vectorizer", CountVectorizer()),
("transformer", TfidfTransformer())
]
))
])
),
("classifier", classifier)])
Run Code Online (Sandbox Code Playgroud)
在这里,我们使用功能联合和子管道组合了一些功能。要访问这些功能,我们需要按顺序显式调用每个命名步骤。例如,从内部管道获取 TF-IDF 特征,我们必须这样做:
model.named_steps["union"].tranformer_list[3][1].named_steps["transformer"].get_feature_names()
Run Code Online (Sandbox Code Playgroud)
这有点令人头疼,但这是可行的。通常我所做的是使用以下代码片段的变体来获取它。下面的代码只是将管道/功能联合集视为一棵树,并在运行时组合功能名称来执行 DFS。
from sklearn.pipeline import FeatureUnion, Pipeline
def get_feature_names(model, names: List[str], name: str) -> List[str]:
"""Thie method extracts the feature names in order from a Sklearn Pipeline
This method only works with composed Pipelines and FeatureUnions. It will
pull out all names using DFS from a model.
Args:
model: The model we are interested in
names: The list of names of final featurizaiton steps
name: The current name of the step we want to evaluate.
Returns:
feature_names: The list of feature names extracted from the pipeline.
"""
# Check if the name is one of our feature steps. This is the base case.
if name in names:
# If it has the named_steps atribute it's a pipeline and we need to access the features
if hasattr(model, "named_steps"):
return extract_feature_names(model.named_steps[name], name)
# Otherwise get the feature directly
else:
return extract_feature_names(model, name)
elif type(model) is Pipeline:
feature_names = []
for name in model.named_steps.keys():
feature_names += get_feature_names(model.named_steps[name], names, name)
return feature_names
elif type(model) is FeatureUnion:
feature_names= []
for name, new_model in model.transformer_list:
feature_names += get_feature_names(new_model, names, name)
return feature_names
# If it is none of the above do not add it.
else:
return []
Run Code Online (Sandbox Code Playgroud)
您还需要这个方法。它对各个转换(例如 TfidfVectorizer)进行操作来获取名称。在 SciKit-Learn 中,没有通用的get_feature_names,所以你必须针对每种不同的情况捏造它。这是我尝试为大多数用例做一些合理的事情。
def extract_feature_names(model, name) -> List[str]:
"""Extracts the feature names from arbitrary sklearn models
Args:
model: The Sklearn model, transformer, clustering algorithm, etc. which we want to get named features for.
name: The name of the current step in the pipeline we are at.
Returns:
The list of feature names. If the model does not have named features it constructs feature names
by appending an index to the provided name.
"""
if hasattr(model, "get_feature_names"):
return model.get_feature_names()
elif hasattr(model, "n_clusters"):
return [f"{name}_{x}" for x in range(model.n_clusters)]
elif hasattr(model, "n_components"):
return [f"{name}_{x}" for x in range(model.n_components)]
elif hasattr(model, "components_"):
n_components = model.components_.shape[0]
return [f"{name}_{x}" for x in range(n_components)]
elif hasattr(model, "classes_"):
return classes_
else:
return [name]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6459 次 |
| 最近记录: |