检查 scikit-learn 管道中的特征重要性
Inspection of the feature importance in scikit-learn pipelines
我使用 scikit-learn 定义了以下管道:
model_lg = Pipeline([("preprocessing", StandardScaler()), ("classifier", LogisticRegression())])
model_dt = Pipeline([("preprocessing", StandardScaler()), ("classifier", DecisionTreeClassifier())])
model_gb = Pipeline([("preprocessing", StandardScaler()), ("classifier", HistGradientBoostingClassifier())])
然后我使用交叉验证来评估每个模型的性能:
cv_results_lg = cross_validate(model_lg, data, target, cv=5, return_train_score=True, return_estimator=True)
cv_results_dt = cross_validate(model_dt, data, target, cv=5, return_train_score=True, return_estimator=True)
cv_results_gb = cross_validate(model_gb, data, target, cv=5, return_train_score=True, return_estimator=True)
当我尝试使用 coef_
方法检查每个模型的特征重要性时,它给我一个归因错误:
model_lg.steps[1][1].coef_
AttributeError: 'LogisticRegression' object has no attribute 'coef_'
model_dt.steps[1][1].coef_
AttributeError: 'DecisionTreeClassifier' object has no attribute 'coef_'
model_gb.steps[1][1].coef_
AttributeError: 'HistGradientBoostingClassifier' object has no attribute 'coef_'
我想知道如何解决这个错误?或者是否有任何其他方法来检查每个模型中的特征重要性?
Imo,重点如下。一方面,管道实例 model_lg
、model_dt
等未 明确安装 (您不是直接在它们上调用方法 .fit()
),这会阻止您尝试访问实例本身的 coef_
属性。
另一方面,通过调用带有参数 return_estimator=True
的 .cross_validate()
(仅在 cross-validation 方法中使用 .cross_validate()
是可能的),您可以获得 拟合估计器返回每个 cv 拆分,但您应该通过词典 cv_results_lg
、cv_results_dt
等(在 'estimator'
键上)访问它们。 Here's the reference in the code 这是一个例子:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_validate
X, y = load_iris(return_X_y=True)
model_lg = Pipeline([("preprocessing", StandardScaler()), ("classifier", LogisticRegression())])
cv_results_lg = cross_validate(model_lg, X, y, cv=5, return_train_score=True, return_estimator=True)
这些将是 - 例如 - 在第一次折叠时计算的结果。
cv_results_lg['estimator'][0].named_steps['classifier'].coef_
有关相关主题的有用见解可在以下位置找到:
在某些算法中进行循环并打印精度
我使用 scikit-learn 定义了以下管道:
model_lg = Pipeline([("preprocessing", StandardScaler()), ("classifier", LogisticRegression())])
model_dt = Pipeline([("preprocessing", StandardScaler()), ("classifier", DecisionTreeClassifier())])
model_gb = Pipeline([("preprocessing", StandardScaler()), ("classifier", HistGradientBoostingClassifier())])
然后我使用交叉验证来评估每个模型的性能:
cv_results_lg = cross_validate(model_lg, data, target, cv=5, return_train_score=True, return_estimator=True)
cv_results_dt = cross_validate(model_dt, data, target, cv=5, return_train_score=True, return_estimator=True)
cv_results_gb = cross_validate(model_gb, data, target, cv=5, return_train_score=True, return_estimator=True)
当我尝试使用 coef_
方法检查每个模型的特征重要性时,它给我一个归因错误:
model_lg.steps[1][1].coef_
AttributeError: 'LogisticRegression' object has no attribute 'coef_'
model_dt.steps[1][1].coef_
AttributeError: 'DecisionTreeClassifier' object has no attribute 'coef_'
model_gb.steps[1][1].coef_
AttributeError: 'HistGradientBoostingClassifier' object has no attribute 'coef_'
我想知道如何解决这个错误?或者是否有任何其他方法来检查每个模型中的特征重要性?
Imo,重点如下。一方面,管道实例 model_lg
、model_dt
等未 明确安装 (您不是直接在它们上调用方法 .fit()
),这会阻止您尝试访问实例本身的 coef_
属性。
另一方面,通过调用带有参数 return_estimator=True
的 .cross_validate()
(仅在 cross-validation 方法中使用 .cross_validate()
是可能的),您可以获得 拟合估计器返回每个 cv 拆分,但您应该通过词典 cv_results_lg
、cv_results_dt
等(在 'estimator'
键上)访问它们。 Here's the reference in the code 这是一个例子:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_validate
X, y = load_iris(return_X_y=True)
model_lg = Pipeline([("preprocessing", StandardScaler()), ("classifier", LogisticRegression())])
cv_results_lg = cross_validate(model_lg, X, y, cv=5, return_train_score=True, return_estimator=True)
这些将是 - 例如 - 在第一次折叠时计算的结果。
cv_results_lg['estimator'][0].named_steps['classifier'].coef_
有关相关主题的有用见解可在以下位置找到:
在某些算法中进行循环并打印精度