【笔记】【机器学习基础】自动化特征选择

博客介绍了在高维数据集中选择重要特征的三种方法:单变量统计、基于模型的选择和迭代选择。通过单变量统计,如方差分析,快速筛选统计显著的特征;基于模型的选择利用模型如决策树的特征重要性度量;迭代特征选择则逐步添加或删除特征。在示例中,这些方法提高了模型如逻辑回归的性能,证明了有效特征选择的重要性。
摘要由CSDN通过智能技术生成

在添加新特征或处理一般的的高维数据集,最好将特征的数量减少到只包含最有用的那些特征,并删除其余特征,这样会得到泛化能力更好更简单的模型。
如何判断每个特征的作用:
3种监督方法
1、单变量统计
2、基于模型的选择
3、迭代选择

1、单变量统计

计算每个特征和目标值之间的关系是否存在统计显著性,并选择最高置信度的特征。
对于分类问题,也被称为方差分析(ANOVA),关键性质就是它是单变量的,即只单独考虑每个特征
计算速得很快,并且不需要构建模型
sklearn中使用单变量特征选择,选择一项测试,确定p值,选择一种舍弃特征的方法

(1)将分类的特征选择应用于cancer数据集,并添加一些噪声数据提高问题难度

from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectPercentile
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer()

rng = np.random.RandomState(42)
noise = rng.normal(size=(len(cancer.data), 50))

X_w_noise = np.hstack([cancer.data, noise])

X_train, X_test, y_train, y_test = train_test_split(
    X_w_noise, cancer.target, random_state=0, test_size=.5)`在这里插入代码片`

select = SelectPercentile(percentile=50)
select.fit(X_train, y_train)

X_train_selected = select.transform(X_train)

print("X_train.shape: {}".format(X_train.shape))
print("X_train_selected.shape: {}".format(X_train_selected.shape))

特殊数量减少

(2)查看哪些特征被选中(get_support)

mask = select.get_support()
print(mask)

plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("Sample index")
plt.yticks(())

在这里插入图片描述
返回所选特征的布尔遮罩

大多数选择的都是原始特征,并且大多数噪声特征都被删除

(3)比较逻辑回归在所有特征上的性能与仅使用所选特征的性能

from sklearn.linear_model import LogisticRegression

X_test_selected = select.transform(X_test)

lr = LogisticRegression()
lr.fit(X_train, y_train)
print("Score with all features: {:.3f}".format(lr.score(X_test, y_test)))
lr.fit(X_train_selected, y_train)
print("Score with only selected features: {:.3f}".format(
    lr.score(X_test_selected, y_test)))

在例子中,删除噪声数据可以提高性能

2、基于模型的特征选择

使用一个监督机器学习模型来判断每个特征的重要性,并且保留最重要的特征,特征选择模型为每个特征提供某种重要性度量,用这个度量可以对特征进行排序
1、决策树、基于决策树的模型:feature_importances_属性
2、线性模型:稀疏系数
基于模型的特征选择,需要使用SelecteFromModel变换器

(1)使用中位数作为阈值

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
select = SelectFromModel(
    RandomForestClassifier(n_estimators=100, random_state=42),
    threshold="median")

(2)拟合模型

select.fit(X_train, y_train)
X_train_l1 = select.transform(X_train)
print("X_train.shape: {}".format(X_train.shape))
print("X_train_l1.shape: {}".format(X_train_l1.shape))

X_train.shape: (284, 80)
X_train_l1.shape: (284, 40)

(3)查看特征

mask = select.get_support()

plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("Sample index")
plt.yticks(())

在这里插入图片描述
除了两个原始特征,其他原始特征都被选中

(4)查看性能

X_test_l1 = select.transform(X_test)
score = LogisticRegression().fit(X_train_l1, y_train).score(X_test_l1, y_test)
print("Test score: {:.3f}".format(score))

Test score: 0.951

利用更好的特征选择, 性能得到了提高

3、迭代特征选择

构建一系列模型,每个模型使用不同数量的特征

两种基本方法:
1、开始时没有特征,然后逐个添加特征,直到满足某个终止条件
2、从所有特征开始,然后逐个删除特征,直到满足某个终止条件
计算成本更高

特殊方法:递归特征消除RFE

(1)使用随机森林分类器模型的递归特征消除选择的特征

from sklearn.feature_selection import RFE
select = RFE(RandomForestClassifier(n_estimators=100, random_state=42),
             n_features_to_select=40)

select.fit(X_train, y_train)

mask = select.get_support()
plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("Sample index")
plt.yticks(())

在这里插入图片描述
相比之前的结果更好,但还是漏了一个特征

(2)测试使用RFE做特征选择时逻辑回归模型的精度

X_train_rfe = select.transform(X_train)
X_test_rfe = select.transform(X_test)

score = LogisticRegression().fit(X_train_rfe, y_train).score(X_test_rfe, y_test)
print("Test score: {:.3f}".format(score))

Test score: 0.951

(3)利用RFE内使用的模型进行预测

print("Test score: {:.3f}".format(select.score(X_test, y_test)))

Test score: 0.951

只要选择了正确的特征,线性模型的表现与随机森林一样好

如果不确定何时选用哪些特征作为机器学习算法的输入,那么自动化特征选择可能特别有用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值