肿瘤预测案例中应用自动特征选择
描述
当特征数量比较多时,模型容易变得更复杂,过拟合的可能性也会增加。这时除了进行降维处理外,还可以通过自动化特征选择选出最重要的部分特征,抛弃对结果影响不大的特征,从而得到泛化能力更好、更简洁的模型。如何选择最重要的那些特征?有三种基本策略:单变量统计(univariate statistics)、基于模型的选择(model-based selection)和迭代选择(iterative selection)。
本任务的实践内容包括:
1、应用单变量统计选择器(SelectKBset、SelectPercentile)
2、应用基于模型的特征选择器(SelectFromModel)
3、应用“递归特征消除”选择器(RFE)
源码下载
环境
-
操作系统:Windows 10、Ubuntu18.04
-
工具软件:Anaconda3 2019、Python3.7
-
硬件环境:无特殊要求
-
依赖库列表
scikit-learn 0.24.2 matplotlib 3.3.4 numpy 1.19.5
分析
本任务使用乳腺癌(breast_cancer)数据集,该数据集包括569个样本,30个特征。为了说明特征选择的效果,我们再向数据集中增加50个无意义的噪音特征,要求应用多种特征选择策略选择特征,对比逻辑回归分类模型的预测准确性。
本任务涉及以下环节:
A)加载数据,增加噪音特征
B)使用SelectKBest特征选择器,建立逻辑回归模型,对比性能变化情况
C)将特征选择结果可视化
D)使用SelectPercentile特征选择器
E)使用SelectFromModel特征选择器
F)使用RFE(递归特征消除)选择器
实施
1、加载数据,增加噪音特征
原数据集有30个特征,为了说明自动特征选择的效果,增加50个无意义的噪音特征。
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectPercentile, SelectKBest # 引入特征选择器
import numpy as np
import matplotlib.pyplot as plt
cancer = load_breast_cancer() # 加载肿瘤数据集
print('原数据特征个数:', cancer.data.shape[1]) # 原有30个特征
# 添加50列无意义的噪音特征
rng = np.random.RandomState(42)
noise = rng.normal(size=(len(cancer.data), 50))
data= np.hstack([cancer.data, noise])
print('增加噪音特征后的特征个数:', data.shape[1]) # 现有80个特征
结果如下:
原数据特征个数: 30
增加噪音特征后的特征个数: 80
特征个数又30个变为80个(后50个为噪音数据)
2、使用SelectKBest特征选择器,建立逻辑回归模型,对比性能变化情况
lr = LogisticRegression() # 创建逻辑回归模型
# 拆分数据集、建模评估
X_train, X_test, y_train, y_test = train_test_split(data, cancer.target, random_state=0)
lr.fit(X_train, y_train)
print('未使用特征选择时的成绩: %0.2f'%lr.score(X_test, y_test))
# 选择20个最优特征、建模评估
select = SelectKBest(k=20).fit(X_train, y_train)
X_train_select = select.transform(X_train)
X_test_select = select.transform(X_test)
print('自动选取的特征个数:', X_train_select.shape[1]) # 选出了20个特征
lr.fit(X_train_select, y_train) # 在选出的特征上建模
print('使用特征选择后的成绩: %0.2f'%lr.score(X_test_select, y_test))
结果如下:
未使用特征选择时的成绩: 0.87
自动选取的特征个数: 20
使用特征选择后的成绩: 0.95
说明:选择器从80个特征中自动选出20个最优特征,模型性能有所提升。
3、将特征选择结果可视化
# 可视化特征选择
selected = select.get_support() # 得到所选特征(输出为True|False数组)
plt.matshow(selected.reshape(1, -1)) # 可视化矩阵
plt.show()
结果如下:
可以看到,自动挑选的特征(黄色部分)都是从原特征(前30个)中选出,选择器剔除了无意义的噪音特征。
4、使用SelectPercentile特征选择器
# 使用SelectPercentile按百分比选择最优特征
select = SelectPercentile(percentile=20).fit(X_train, y_train) # 选择20%最优特征
X_train_select = select.transform(X_train)
print('自动选取的特征个数:', X_train_select.shape[1]) # 选出了16个特征(20%)
X_test_select = select.transform(X_test)
# 可视化特征选择
selected = select.get_support()
plt.matshow(selected.reshape(1, -1)) # 得到所选特征(True|False)
plt.show()
# 使用逻辑回归在选出的特征上建模、评估
lr.fit(X_train_select, y_train)
print('使用特征选择后的成绩: %0.2f'%lr.score(X_test_select, y_test))
结果如下:
5、使用SelectFromModel特征选择器
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
# 使用SelectFromModel选择器,基于决策树模型选择最优特征
select = SelectFromModel(RandomForestClassifier(n_estimators=50, random_state=0))
select.fit(X_train, y_train)
X_train_select = select.transform(X_train)
print('自动选取的特征个数:', X_train_select.shape[1])
X_test_select = select.transform(X_test)
# 可视化特征选择
selected = select.get_support() # 得到所选特征(True|False)
plt.matshow(selected.reshape(1, -1))
plt.show()
# 使用逻辑回归在选出的特征上建模、评估
lr.fit(X_train_select, y_train)
print('使用特征选择后的成绩: %0.2f'%lr.score(X_test_select, y_test))
结果如下:
说明:SelectFromModel(基于模型的特征选择器)首先利用随机森林模型选出最优特征,然后交给任务模型(本例中是逻辑回归)使用。
6、使用RFE迭代特征选择器
from sklearn.feature_selection import RFE
# 使用迭代特征选择器,基于决策树模型选择最优特征
select = RFE(RandomForestClassifier(n_estimators=50, random_state=0), n_features_to_select=30)
select.fit(X_train, y_train)
X_train_select = select.transform(X_train)
print('自动选取的特征个数:', X_train_select.shape[1])
X_test_select = select.transform(X_test)
# 可视化特征选择
selected = select.get_support() # 得到所选特征(True|False)
plt.matshow(selected.reshape(1, -1))
plt.show()
# 使用逻辑回归在选出的特征上建模、评估
lr.fit(X_train_select, y_train)
print('使用特征选择后的成绩: %0.2f'%lr.score(X_test_select, y_test))
结果如下:
说明:迭代特征选择效果较好,但由于使用了多个特征,计算效率不高。