http://blog.csdn.net/w5310335/article/details/48972587

使用GBDT选取特征

2015-03-31

本文介绍如何使用scikit-learn的GBDT工具进行特征选取。

为什麽选取特征


有些特征意义不大,删除后不影响效果,甚至可能提升效果。

关于GBDT(Gradient Boosting Decision Tree)


可以参考:

GBDT(MART)概念简介

GBDT(MART) 迭代决策树入门教程 | 简介

机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

如何在numpy数组中选取若干列或者行?


>>> import numpy as np
>>> tmp_a = np.array([[1,1], [0.4, 4], [1., 0.9]])
>>> tmp_a
array([[ 1. , 1. ],
[ 0.4, 4. ],
[ 1. , 0.9]])
>>> tmp_a[[0,1],:] # 选第0、1行
array([[ 1. , 1. ],
[ 0.4, 4. ]])
>>> tmp_a[np.array([True, False, True]), :] # 选第0、2行
array([[ 1. , 1. ],
[ 1. , 0.9]])
>>> tmp_a[:,[0]] # 选第0列
array([[ 1. ],
[ 0.4],
[ 1. ]])
>>> tmp_a[:, np.array([True, False])] # 选第0列
array([[ 1. ],
[ 0.4],
[ 1. ]])

生成数据集


参考基于贝叶斯的文本分类实战。部分方法在原始数据集的预测效果也在基于贝叶斯的文本分类实战这篇文章里。

训练GBDT


>>> from sklearn.ensemble import GradientBoostingClassifier
>>> gbdt = GradientBoostingClassifier()
>>> gbdt.fit(training_data, training_labels) # 训练。喝杯咖啡吧
GradientBoostingClassifier(init=None, learning_rate=0.1, loss='deviance',
max_depth=3, max_features=None, max_leaf_nodes=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100,
random_state=None, subsample=1.0, verbose=0,
warm_start=False)
>>> gbdt.feature_importances_ # 据此选取重要的特征
array([ 2.08644807e-06, 0.00000000e+00, 8.93452010e-04, ...,
5.12199658e-04, 0.00000000e+00, 0.00000000e+00])
>>> gbdt.feature_importances_.shape
(19630,)

看一下GBDT的分类效果:

>>> gbdt_predict_labels = gbdt.predict(test_data)
>>> sum(gbdt_predict_labels==test_labels) # 比 多项式贝叶斯 差许多
414

新的训练集和测试集(只保留了1636个特征,原先是19630个特征):

>>> new_train_data = training_data[:, feature_importances>0]
>>> new_train_data.shape # 只保留了1636个特征
(1998, 1636)
>>> new_test_data = test_data[:, feature_importances>0]
>>> new_test_data.shape
(509, 1636)

使用多项式贝叶斯处理新数据


>>> from sklearn.naive_bayes import MultinomialNB
>>> bayes = MultinomialNB()
>>> bayes.fit(new_train_data, training_labels)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> bayes_predict_labels = bayes.predict(new_test_data)
>>> sum(bayes_predict_labels == test_labels) # 之前预测正确的样本数量是454
445

使用伯努利贝叶斯处理新数据


>>> from sklearn.naive_bayes import BernoulliNB
>>> bayes2 = BernoulliNB()
>>> bayes2.fit(new_train_data, training_labels)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> bayes_predict_labels = bayes2.predict(new_test_data)
>>> sum(bayes_predict_labels == test_labels) # 之前预测正确的样本数量是387
422

使用Logistic回归处理新数据


对原始特征组成的数据集:

>>> from sklearn.linear_model import LogisticRegression
>>> lr1 = LogisticRegression()
>>> lr1.fit(training_data, training_labels)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr',
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0)
>>> lr1_predict_labels = lr1.predict(test_data)
>>> sum(lr1_predict_labels == test_labels)
446

对削减后的特征组成的数据集:

>>> lr2 = LogisticRegression()
>>> lr2.fit(new_train_data, training_labels)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr',
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0)
>>> lr2_predict_labels = lr2.predict(new_test_data)
>>> sum(lr2_predict_labels == test_labels) # 正确率略微提升
449

(完)

转 :scikit-learn的GBDT工具进行特征选取。的更多相关文章

  1. scikit-learn的GBDT工具进行特征选取。

    http://blog.csdn.net/w5310335/article/details/48972587 使用GBDT选取特征 2015-03-31 本文介绍如何使用scikit-learn的GB ...

  2. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  3. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  4. (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探

    目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...

  5. Scikit Learn

    Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.

  6. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  7. 特征选取1-from sklearn.feature_selection import SelectKBest

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  8. [模式识别].(希腊)西奥多里蒂斯<第四版>笔记5之__特征选取

    1,引言 有关模式识别的一个主要问题是维数灾难.我们将在第7章看到维数非常easy变得非常大. 减少维数的必要性有几方面的原因.计算复杂度是一个方面.还有一个有关分类器的泛化性能. 因此,本章的主要任 ...

  9. 吴裕雄 python 机器学习——数据预处理过滤式特征选取SelectPercentile模型

    from sklearn.feature_selection import SelectPercentile,f_classif #数据预处理过滤式特征选取SelectPercentile模型 def ...

随机推荐

  1. OpenVPN使用easy-rsa3吊销证书

    cd /etc/easy-rsa ./easyrsa revoke targetkey(证书名) ./easyrsa gen-crl 其中gen-crl会生成一份吊销证书的名单,放在pki/crl.p ...

  2. 上传APP加入视频预览--精简点名

    上传APP加入视频预览--精简点名 在为精简点名APP制作视频预览时的坑: 1.视频预览不能太长.也不能太短15-30s就好.我录制的是18s 2.视频的帧数不能太大.也就是说你在录制视频的时候.要慢 ...

  3. bitnami-redmine邮件告警配置

    配置 bitnami-redmine的配置文件与单纯的redmine配置文件可能并不相同,在这里我们需要打开一下配置文件: /opt/bitnami/apps/redmine/htdocs/confi ...

  4. Snmp学习总结(五)——WindowsServer2008安装和配置SNMP

    一.安装SNMP 在Windows Server 2008以及Windows Server 2008 R2中,SNMP是以一个服务器功能的形式存在的,SNMP的安装步骤如下所示: 1.打开[开始]→[ ...

  5. future封装了callable,thread封装future。

    三.使用Callable,Future返回结果 总结:future封装了callable,thread封装future.将callable的返回结果封装在future中,thread封装future, ...

  6. 咏南中间件开始支持redis client接口调用

    咏南中间件开始支持redis client接口调用 咏南中间件封装了redis client接口,可以支持REDIS了. 如下图,将数据集写入REDIS缓存,和从REDIS缓存获取数据: proced ...

  7. iOS6新特征:UICollectionView介绍-非常棒 -转

    传送门:http://www.devdiv.com/forum.php?mod=viewthread&tid=128378

  8. frame与bounds的区别比较

    翻译文档上的
bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块.

很明显一个是自己为原点的坐标 ...

  9. IOS开发常用宏定义

    //release屏蔽NSLog//放在.pch文件里#ifdef DEBUG #else#define NSLog(...) {};#endif //G.C.D#define BACK(block) ...

  10. 基于QT和OpenCV的人脸检測识别系统(1)

    人脸识别分为两大步骤 1.人脸检測 这个是首要实现的.你得实现人脸显示的时候把人脸框出来,当然算法非常多,另一些人眼检測鼻子检測什么的 主要用的是这个 const char *faceCascadeF ...