DC学院学习笔记(二十):用特征选择方法优化模型-阿里云开发者社区

开发者社区> 人工智能> 正文

DC学院学习笔记(二十):用特征选择方法优化模型

简介: 特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )

特征选择的定义:

特征选择( 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”。

公式image
Python实现

from scipy.stats.stats import pearsonr
pearsonr(x,y)

迭代特征选择

解决的问题:假设我们已经确定了要使用哪个算法后,我们怎么知道哪个X的子集合作为特征训练模型效果最好。

解决方案

image

迭代特征选择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)
select PetalWidthCm acc: 0.853333333333
select SepalWidthCm acc: 0.94
select PetalLengthCm acc: 0.953333333333
select SepalLengthCm acc: 0.96
best feature set:  ['PetalWidthCm', 'SepalWidthCm', 'PetalLengthCm', 'SepalLengthCm'] acc:  0.96

ok,跟之前得到的一样,就是三个特征都选择了,效果最好。

最后,来认识一下什么叫特征工程

特征工程

有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。

引用知乎的一张图:https://www.zhihu.com/question/29316149

image

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章