当前位置: 首页 > news >正文

掌握python机器学习-读书笔记4(特征选择)

为什么80%的码农都做不了架构师?>>>   hot3.png

8 机器学习中的特征选择

8.1 特征选择

特征选择是机器学习实践中的一步, 帮你在所有特征中选择对结果贡献最多的特征。 显然, 使用不相关数据会减少模型的精确性, 尤其是线性算法:线性回归, 逻辑回归。为什么,因为线性算法一般使用梯度下降来寻找最优值, 那么如果特征无关, 方向就有可能误导。- 我的理解。

以下是三个好处:

  • 减少过拟合。 这个话题其实比较大。 要理解什么是过拟合, 就是模型过于贴近训练集, 导致了泛化能力很差。 吴恩达课上有一个图可以说明过拟合和欠拟合的区分, 这部分可能后续继续详细阐述。
  • 提高精确性。 更少的无效数据意味着模型精确性的提升。
  • 减少训练时间。 数据少了自然运算时间短了。

8.2 单变量选择

scikit-learn提供了SelectKBest类可以用来根据一些统计的测试来选择出一些数量的最有效的特征。 以下例子就是用了chi-square test 卡方检验来进行非相关性分析,选出了4种最相关的特征。

首先, 这个是为了分类变量。输入是这个特征和分类结果。 原理略, 卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。

对于分类的检验算法, 有 : chi2, f_classif, mutual_info_classif 对于回归呢, 有: f_regression, mutual_info_regression

# Feature Extraction with Univariate Statistical Tests (Chi-squared for classification)
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# load data
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, 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
set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
# summarize selected features
print(features[0:5,:])
[  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. ]]

8.3 递归特征消除法 RFE

递归特征消除呢就是说每次把对结果最没有用的这个特征去掉。 然后如此继续。 最终得到自己想留下的特征数量。 这里有一个问题, 采取何种算法, 如何的标准来判断这个重要性? 为什么用逻辑回归, 也有SVC 支持向量回归? 这样做的好处是什么呢, 就是为了消除一下, 那么消除好还是不消除好呢。

递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。

RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。

# Feature Extraction with RFE
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# load data
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, 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_
Num Features: 3
Selected Features: [ True False False False False  True  True False]
Feature Ranking: [1 2 3 5 6 1 1 4]

8.4 PCA 主成因分析

这个方法在机器学习实战中介绍过, 主要用来降维。 经过PCA, 以前的8个特征会转化成另外的8个特征, 而每种特征之间是正交关系, 这就意味着他们提供的信息是不相关的, 也就是没有相关性, 可以理解成都是干货。 :)

其实通过实践你可以发现, 后续的一些特征值都是0了, 其实没有那么多维度的信息。 所以后面那些自然可以省略了。

# Feature Extraction with PCA
from pandas import read_csv
from sklearn.decomposition import PCA
# load data
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, 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_)
Explained Variance: [ 0.889  0.062  0.026]
[[ -2.022e-03   9.781e-02   1.609e-02   6.076e-02   9.931e-01   1.401e-02
    5.372e-04  -3.565e-03]
 [ -2.265e-02  -9.722e-01  -1.419e-01   5.786e-02   9.463e-02  -4.697e-02
   -8.168e-04  -1.402e-01]
 [ -2.246e-02   1.434e-01  -9.225e-01  -3.070e-01   2.098e-02  -1.324e-01
   -6.400e-04  -1.255e-01]]

8.5 特征重要性分析

对于特征重要性的评判, bagging 相关的算法可以帮忙计算。 字面翻译就是打包的一些算法, 比如随机森林, 这个是用大量的一阶的树桩, 然后根据投票选举的方式得到预测的结果。 比如Extra Trees。

在tree bagging基础上,每一个model训练的时候对所选取的data split随机选取一部分特征子集(random subset of the features)来训练。这样做的目的也是为了让学到的tree不要太相似。 进一步扩展RF算法,是一种叫extremely randomized trees,(ExtraTrees)的算法:在RF采取bagging和random subspace的基础上,进一步在每一棵树train决策树的时候,选取的split value采用随机生成. 这些算法可以帮助我们来判断特征的重要性。

那么问题来了, 他是如何来帮助我们得到特征的重要性呢。 首先它肯定可以做分类。 然后呢, 根据哪些参数可以决定结果的权重可以得到点信息, 这个还是不很理解, 需要看它的实现才行, 放到TODO 吧。

顺便说一下, 随机森林还能帮我们做缺失值的补值, 当然这个缺失值话题还是很大的, 有平均值, 补零,随机森林等等。

# Feature Importance with Extra Trees Classifier
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
# load data
filename = 'pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# feature extraction
model = ExtraTreesClassifier()
model.fit(X, Y)
print(model.feature_importances_)
[ 0.102  0.247  0.104  0.083  0.074  0.128  0.126  0.135]

8.6 小结

其实这些很多是相通的, 都是特征选择的一些方式, 那么具体问题具体分析。 PCA可能略有不同。 但是这几种办法还是很有帮助的。

参考 1 http://scikit-learn.org/stable/modules/feature_selection.html 2 卡方检验 https://baike.baidu.com/item/%E5%8D%A1%E6%96%B9%E6%A3%80%E9%AA%8C/2591853?fr=aladdin&fromid=8048908&fromtitle=chi-square+test 3 http://m.blog.csdn.net/liujianfei526/article/details/51761616 4 http://blog.csdn.net/xbinworld/article/details/50450650

转载于:https://my.oschina.net/sizhe/blog/1588135

相关文章:

  • JAVA中Get和Post请求的区别
  • Flask使用Flask-SQLAlchemy操作MySQL数据库
  • Windows Azure 网站上的 WebSocket 简介
  • 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(三)命令行工具集
  • 浅谈硬盘构造及IOPS的计算
  • 把用户加入sudo
  • 点滴积累【JS】---JS小功能(button选择颜色)
  • Nginx、LVS及HAProxy负载均衡软件的优缺点详解
  • 面向对象实验四(输入输出流)
  • 苹果屏幕分辨力和像素
  • db2还原离线备份文件报错SQL2071N 提示“访问共享库出现错误”解决
  • 动手实现Handler v1.3
  • pam_access.so
  • Http中header与body的区别
  • windows 下安装jdk
  • ES6指北【2】—— 箭头函数
  • [Vue CLI 3] 配置解析之 css.extract
  • 4个实用的微服务测试策略
  • echarts花样作死的坑
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript-Array类型
  • mysql 数据库四种事务隔离级别
  • MySQL几个简单SQL的优化
  • python学习笔记 - ThreadLocal
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Twitter赢在开放,三年创造奇迹
  • 关于List、List?、ListObject的区别
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一文看透浏览器架构
  • 正则学习笔记
  • Java总结 - String - 这篇请使劲喷我
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​力扣解法汇总946-验证栈序列
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # include “ “ 和 # include < >两者的区别
  • #etcd#安装时出错
  • $.ajax,axios,fetch三种ajax请求的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)uboot源码分析
  • (转)linux下的时间函数使用
  • (转)大型网站架构演变和知识体系
  • (转)甲方乙方——赵民谈找工作
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 指南:抽象化实现的基类
  • .net中生成excel后调整宽度
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Builder用法