携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
其算法本质是回归模型的反复构建。
Step1.数据标准化
Step2,:利用线性、lasso、岭回归或者向量机回归等等
Step3:根据回归系数大小,选出最好的特征,然后取出,保存下来。
Step4:在剩余特征中重复上述算法。
Step5:多次重复,直到遍历所有特征。特征逐步消失的顺序就是其重要性排序。
RFECV :通过交叉验证的方式进行RFE (sci-kitlearn 已经实现)
SS 算法(稳定性选择)( 通过随机lasso (RandomizedLasso )和随机逻辑回归(RandomizedLogisticRegression )来实现) :
类似于RFE的算法。但运行的范围不同,RFE在整个数据集中进行特征选择算法。SS算法要在不同的子数据集(选取部分行组成子集)和不同的特征子集(选取部分列组成子集)上运行特征选择算法,即回归算法(也可以是其它算法)。然后把在每个特征子集和数据子集上的运行结果汇总。然后计算特征被选择的频率,即特征被选择为重要特征次数除以他所在子集被测试次数(更确切地说特征本身被测试次数)。理想情况下,重要特征的得分会接近100%。稍微弱一点的特征得分会是非0的数,而最无用的特征得分将会接近于0。
例子:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
boston = load_boston()
#波士顿房价数据集
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
lr = LinearRegression()
rfe = RFE(lr, n_features_to_select=1)
#创建rfe模型
rfe.fit(X,Y)
#训练rfe模型
rfe.support_,rfe.ranking_
array([False, False, False, False, True, False, False, False, False,
False, False, False, False], dtype=bool),
array([ 8, 10, 9, 3, 1, 2, 13, 5, 7, 11, 4, 12, 6]))
sorted(zip(list(rfe.ranking_),list(names)))
#然后用岭回归模型运行一次,看一下结果是否有大的出入
from sklearn.linear_model import (LinearRegression, Ridge,
Lasso, RandomizedLasso)
rd=Ridge()
rfe = RFE(rd, n_features_to_select=1)
rfe.fit(X,Y)
Out[46]:
RFE(estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001),
n_features_to_select=1, step=1, verbose=0)
sorted(zip(list(rfe.ranking_),list(names)))
#我们发现,重要特征排序差不多一样
#下面我们应用SS算法来实现特征选取
from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rlasso = RandomizedLasso('bic')
rlasso.fit(X, Y)
sorted(zip(list(map(lambda x:'%.2f'% x,rlasso.scores_)),list(names)))