数据分析师(入门) DC学院
本节课程的内容是特征选择,主要介绍的是如何从训练集合中挑选最合适的子集作为训练模型时所用的特征,使最终学习得到的模型的预测准确率最高,在了解过其基本的原理之后,就可以开始相应的实践操作
特征选择的定义:
特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。
特征选择的方法:
数据驱动:分析手上已有的训练数据,得出哪些x里面的特征对预测y最重要的。主要的三大种类方法如下:
- 相关性:考察在我们已有的数据里面的特征x与预测值y的相关度
- 迭代删除(增加):确定要使用哪个算法后,选择最合适的训练子集,从而使得模型的效果最好
- 基于模型:通过随机森林等可以直接得出每个训练特征的重要性的模型;或者是在进行预测时加入的一些正则化调整,引起的对特征的筛选,从而挑选出最重要的特征
领域专家:通过相关领域的专家知识、经验来挑选特征
相关性系数:皮尔逊系数
定义:
在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 文章中常用r或Pearson’s r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔森相关系数r”。
公式:
Python实现:
from scipy.stats.stats import pearsonr
pearsonr(x,y)
迭代特征选择
解决的问题:假设我们已经确定了要使用哪个算法后,我们怎么知道哪个X的子集合作为特征训练模型效果最好。
解决方案:
- 暴力解法:把所有可能的特征组合都试一遍,用交叉检验来看哪个特征子集预测效果最好
递增:
初始化:X’ = 空集,X”=X
For in X”:
X’ + 作为特征集合训练
选所有 中训练得到模型最好的x’
X’ = X’ + x’
X” = X” - x’
蓝色部分迭代直到新加入任何特征模型性能都无提升
递减:
初始化:X’ = X
For in X’:
X’ - 作为特征集合训练
选所有 中训练得到模型最好的x’
X’ = X’ - x’
蓝色部分迭代直到去除任何特征模型性能都会下降
迭代特征选择python实现:
import pandas
import numpy as np
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
iris =pandas.read_csv( 'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header= None)
iris.columns=[ 'SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species']
le = LabelEncoder()
le.fit(iris[ 'Species'])
lm = linear_model.LogisticRegression()
features = [ 'PetalLengthCm', 'PetalWidthCm', 'SepalLengthCm', 'SepalWidthCm']
y = le.transform(iris[ 'Species'])
selected_features = []
rest_features = features[:]
best_acc = 0
while len(rest_features)> 0:
temp_best_i = ''
temp_best_acc = 0
for feature_i in rest_features:
temp_features = selected_features + [feature_i,]
X = iris[temp_features]
scores = cross_val_score(lm,X,y,cv= 5 , scoring= 'accuracy')
acc = np.mean(scores)
if acc > temp_best_acc:
temp_best_acc = acc
temp_best_i = feature_i
print( "select",temp_best_i, "acc:",temp_best_acc)
if temp_best_acc > best_acc:
best_acc = temp_best_acc
selected_features += [temp_best_i,]
rest_features.remove(temp_best_i)
else:
break
print( "best feature set: ",selected_features, "acc: ",best_acc)
补充知识
参数文档
scipy
- scipy.stats.pearsonr,文档是对scipy.stats.pearsonr函数参数说明
sklearn.preprocessing.LabelEncoder
- sklearn.preprocessing import LabelEncoder文档是sklearn.preprocessing.LabelEncoder的参数说明
- LabelEncoder的简单应用,文档是sklearn LabelEncoder的简单应用
迭代特征选择优缺点解释
暴力解法
迭代删除(增加)
- 迭代删除(增加)的优点:
- 迭代删除(增加)的缺点:
扩展阅读
特征工程
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
阅读特征工程到底是什么?,了解特征工程的含义