LOFO
一、LOFO(目前适用于所有模型)
LOFO是一种特征重要性绘制方案,和其他特征重要性方法(线性相关回归模型的截距项、随机森林的特征重要性、XGBoost和LightGBM的特征重要性-plot_importance,线性数据的相关性等)相比,其特点简要概括为:
- 可以较好的泛华到未知测试集
- 对于带来负面效果的特征会给予一个负的值
- 对特征进行分组,特别适用于高维特征,如TFIDF或ONE-HOT特征
- 可以自动对高度相关的特征进行分组,以防止低估其重要性
LOFO(Leave one Feature Out) 的特征重要性过程:
- 迭代的从特征集合中删除一个特征,并基于选择的度量,使用选择的验证方案评估模型的性能来计算一组集合的特征重要性。
步骤:
-
- 输入所有特征,LOFO基于所有特征评估包含全部特征的模型效果;
- 一次迭代删除一个特征,重新训练模型,并在验证集上评估其效果;
- 记录每个特征重要性的平均值和标准偏差。
注意:如果我们不传入任何模型,LOFO默认运行的模型是LightGBM.
二、FastLOFO(目前适用于所有模型)
因为枚举的缘故,LOFO会相对耗费时间,若要快速得到特征重要性,可以使用FastLOFO.
- Fast LOFO 会使用已经训练好的模型,以及一个验证集合,对每个特征值进行随机扰动,然后使用训练好的模型对其进行预测,FLOFO的特征重要性就是在验证集上模型的预测结果与之前不扰动结果的差值。
三、代码
# pip install lofo_importance
from lofo import LOFOImportance
from lofo import FLOFOImportance
from lofo import plot_importance
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error as MSE
from sklearn.metrics import make_scorer
# train_data label test_data
clf = LinearRegerssion()
clf = clf.fit(train_data, label) # 这里随便找了个数据集跑了下,能跑通即可
# data 为完整数据集, 后面标出特征列和标签列即可
LOFO = FLOFOImportance(clf, data, [特征列],[标签列] , scoring=make_scorer(MSE)) # cv=cv
# get the mean and standard deviation of the importances in pandas format
importances = LOFO.get_importance()
importances
plot_importance(LOFO.get_importance(), figsize=(8, 8), kind='box')
plot_importance(LOFO.get_importance(), figsize=(8, 8))