正如标题所述,我正在尝试获取 OLS 模型中特征的排列重要性,但得到的是:
TypeError:估计器应该是实现“fit”方法的估计器,
这是我的代码:
import pandas as pd
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
import statsmodels.api as sm
df = pd.read_csv(r'my_file')
X = df.drop(my dependent variable)
y = df[my dependent variable)
X_train, X_test, y_train, y_test = train_test_split(X, y)
model - sm.OLS(y_train, X_train).fit()
print(model.summary())
score = permuation_importance(model, X_train, y_train, scoring='neg_root_mean_squared_error')
importance = score.importances_mean
for i,v in enumerate(importance):
print('Feature: %0d, Score: %.5f' % (i,v))
我有一种感觉,因为我使用的模型不是来自 sklearn,所以想知道是否有办法从我的 OLS 模型中获取特征指标?谢谢!!
您得到的错误是因为您将回归结果而不是拟合模型传递给
permutation_importance
方法。要消除此错误,请执行以下操作:
model = sm.OLS(y_train, X_train)
results = model.fit()
print(results.summary())
score = permuation_importance(model, X_test, y_test, scoring='neg_root_mean_squared_error')
这里,
model
是statsmodels.regression.linear_model.OLS
类型,它实现了.fit()
方法。但是,results
是 statsmodels.regression.linear_model.RegressionResultsWrapper
类型,它不实现 .fit()
。传递给 permutation_importance
方法的第一个参数必须是定义 .fit()
方法的类型。
话虽这么说,仅仅因为您传递给它的模型实现了
.fit()
,并不一定意味着该模型将受到sklearn的支持。我建议执行以下任一操作:
使用 sklearn 的
LinearRegression
,而不是 statsmodel 的 OLS
。 sklearn 的 permutation_importance
方法绝对支持前者。请参阅https://scikit-learn.org/stable/modules/ generated/sklearn.linear_model.LinearRegression.html
假设您的数据已适当缩放,您可以使用模型系数作为特征重要性的度量。
feature_importances = abs(results.params)
print(feature_importances.sort_values(ascending=False))