利用scikit-learn做特征选择

特征选择

特征选择是一个过程,自动选择数据中对预测变量输出贡献最大的特征。

数据中不相关的特征会降低许多模型的精度,特别是线性算法和逻辑回归等线性算法。

在对数据建模之前执行特征选择的三个好处是:
1. 减少过度配合:减少冗余数据意味着根据噪音作出决定的机会减少。
2. 提高准确性:更少的误导数据意味着建模精度提高。
3. 减少训练时间:更少的数据意味着算法训练更快。
下面介绍Python中用于机器学习特征选择的4个函数模型:

1.单变量选择

可以使用统计测试来选择与输出变量具有最强关系的那些要素。
scikit-learn库提供了SelectKBest类,可以使用一系列不同的统计测试来选择特定数量的特征。
下面的例子使用非负特征的卡方(chi ^ 2)统计检验来从皮马印第安人糖尿病数据集发病中选择4个最佳特征。

# Feature Extraction with Univariate Statistical Tests (Chi-squared for classification)
import pandas
import numpy
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# load data
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# feature extraction
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X, Y)
# summarize scores
numpy.set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
# summarize selected features
print(features[0:5,:])

可以看到每个属性的分数和所选择的4个属性(那些得分最高):PLAS,测试,质量和年龄。

[  111.52   1411.887    17.605    53.108  2175.565   127.669     5.393       181.304]
[[ 148.     0.    33.6   50. ]
 [  85.     0.    26.6   31. ]
 [ 183.     0.    23.3   32. ]
 [  89.    94.    28.1   21. ]
 [ 137.   168.    43.1   33. ]]

2.递归特征消除

递归特征消除(RFE)通过递归地移除属性并建立保留的那些属性的模型来工作。
它使用模型准确性来确定哪些属性(以及属性组合)对预测目标属性贡献最大。
下面的例子使用了逻辑回归算法的RFE来选择前3个特征。

# Feature Extraction with RFE
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# load data
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# feature extraction
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Num Features: %d") % fit.n_features_
print("Selected Features: %s") % fit.support_
print("Feature Ranking: %s") % fit.ranking_

可以看到,RFE选择了前三名的功能,如preg,mass 和pedi。
这些在support_数组中标记为True,并在ranking_数组中标记为选择“1” 。

Num Features: 3
Selected Features: [ True False False False False True True False]
Feature Ranking: [1 2 3 5 6 1 1 4]

3.主成分分析

主成分分析(或PCA)使用线性代数将数据集转换为压缩形式。

通常这被称为数据降维技术。PCA的一个属性n_components用来选择转换结果中维数或主成分的数量。
在下面的例子中,使用PCA并选择3个n_components。

# Feature Extraction with PCA
import numpy
from pandas import read_csv
from sklearn.decomposition import PCA
# load data
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# feature extraction
pca = PCA(n_components=3)
fit = pca.fit(X)
# summarize components
print("Explained Variance: %s") % fit.explained_variance_ratio_
print(fit.components_)

可以看到转换的数据集(3个主要成分)与源数据几乎完全不同,因为在主成分的转化过程中已经把数据转化为各因素的线性组合F,并取贡献率前三个的主要组合。

Explained Variance: [ 0.88854663  0.06159078  0.02579012]
[[ -2.02176587e-03   9.78115765e-02   1.60930503e-02   6.07566861e-02
    9.93110844e-01   1.40108085e-02   5.37167919e-04  -3.56474430e-03]
 [  2.26488861e-02   9.72210040e-01   1.41909330e-01  -5.78614699e-02
   -9.46266913e-02   4.69729766e-02   8.16804621e-04   1.40168181e-01]
 [ -2.24649003e-02   1.43428710e-01  -9.22467192e-01  -3.07013055e-01
    2.09773019e-02  -1.32444542e-01  -6.39983017e-04  -1.25454310e-01]]

4.特征重要性

像随机森林(Random Forest)和附加树(Extra Trees)这样的决策树可以用来估计特征的重要性。
在下面的例子中,我们构建了Pima印第安人糖尿病数据集的ExtraTreesClassifier分类器。

# Feature Importance with Extra Trees Classifier
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
# load data
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# feature extraction
model = ExtraTreesClassifier()
model.fit(X, Y)
print(model.feature_importances_)

可以看到,我们给予每个属性的重要性分数,其中越大的分数越重要的属性。分数表明了 plas, age and mass的重要性。

[ 0.11070069  0.2213717   0.08824115  0.08068703  0.07281761  0.14548537 0.12654214  0.15415431]

总结

使用scikit-learn在Python中准备机器学习数据的特征选择,包括4种不同的自动特征选择技术:
1. 单变量选择
2. 递归特征消除
3. 主成分分析
4. 特征重要性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值