feature_selection.SelectFromModel 糖尿病数据集例子

class sklearn.feature_selection.SelectFromModel(estimator, *, threshold=None, prefit=False, norm_order=1, max_features=None)

官网解释
属性:
estimator object:用来构建transformer的基本估计器。既可以是拟合的(如果prefit设置为True),也可以是不拟合的估计器。这个估计器拟合之后必须具有 feature_importances_或coef_属性

threshold :string, float, optional default None
用于特征选择的阈值。保留重要性更高或相等的特征,而其他特征则被丢弃。如果为
“median”(或“mean”),则该threshold值为要素重要性的中位数(或均值)。也可以使用缩放因子(例如,“ 1.25 *平均值”)。如果为None(无**),并且估计器的参数惩罚显式或隐式设置为L1(例如Lasso),则使用的阈值为1e-5。否则,默认使用“mean”。

prefit : bool, default False
预设模型是否直接传递给构造函数。如果为True,transform必须直接调用并且SelectFromModel不能使用cross_val_score, GridSearchCV和与此估计类似的实用程序。否则,使用训练模型fit,然后transform进行特征选择。

方法:
fit(X[, y]): 拟合SelectFromModel元转换器。
transform(X): 将X缩小为选定的特征。
fit_transform(X[, y]): 拟合数据,然后对其进行转换。就是fit()+transform()

下面的例子:官网文档

# 简单熟悉一下SelectFromModel
# 从糖尿病数据集中选择两个最有趣的特征。
# SelectFromModel类位于sklearn下的feature_selection模块

from sklearn.datasets import load_diabetes
from sklearn.linear_model import LassoCV
from sklearn.feature_selection import SelectFromModel
import numpy as np
from matplotlib import pyplot as plt

# 加载数据集
diabetes_data = load_diabetes()
X = diabetes_data.data  # 442x10
y = diabetes_data.target
print(diabetes_data.feature_names)
# 先用LassoCV回归,求出系数,然后排序
lassocv = LassoCV()
lassocv.fit(X, y)  # 训练/拟合
weights_abs = np.abs(lassocv.coef_)  # 回归系数,重要性一定要取绝对值!
third_index = weights_abs.argsort()[-3]  # 取出第三大的系数的index,argsort是从小到大排
third_max = weights_abs[third_index]  # 取出第三大的权重
threshold = third_max + 0.01  # 设置SelectFromModel的阈值
# 查看最重要的两个特征是什么https://scikit-learn.org.cn/view/199.html
feature_names2 = np.array(diabetes_data.feature_names)[weights_abs.argsort()[-2:]]
print("LassoCV求出的最重要的两个特征:", end='')
print(feature_names2)  # list不能用ndarray做索引,所以将list转换成ndarray
# 注意:上面这个取法,是第二个比第一个还要重要,因为argsort是从小到大排
# 下面进行特征选择
sfm = SelectFromModel(estimator=lassocv, threshold=threshold)
sfm.fit(X, y)
X_transform = sfm.transform(X)
print(X_transform.shape)

# 使用这两个特征画图
ax = plt.gca()
ax.scatter(X_transform[:, 0], X_transform[:, 1], color='r', s=7)
ax.set_xlabel(feature_names2[1])
ax.set_ylabel(feature_names2[0])
plt.title(" Features from diabets using SelectFromModel with "
          "threshold %0.3f." % sfm.threshold)
plt.show()

## 疑问:既然LassoCV单独就能完成特征选择的任务,为啥还需要SelectFromModel??
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值