前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据城堡参赛代码实战篇(五)---使用sklearn解决分类问题

数据城堡参赛代码实战篇(五)---使用sklearn解决分类问题

作者头像
石晓文
发布2018-04-11 15:52:08
1.2K0
发布2018-04-11 15:52:08
举报
文章被收录于专栏:小小挖掘机小小挖掘机

小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,以分组第19名的成绩进入了复赛,很激动有木有!在上一篇文章中,小编带你使用pandas中merge()函数的功能,至此,我们所有的数据都已经处理完毕,已经生成了训练集和测试集。接下来需要做的是选取合适的方法对数据进行训练。本篇,小编文文将带你探讨sklearn库中常用的分类算法。

1 决策树分类器

通俗来说,决策树分类的思想类似于找对象。现想象一个女孩的母亲要给这个女孩介绍男朋友,于是有了下面的对话:

  • 女儿:多大年纪了?
  • 母亲:26。
  • 女儿:长的帅不帅?
  • 母亲:挺帅的。
  • 女儿:收入高不?
  • 母亲:不算很高,中等情况。
  • 女儿:是公务员不?
  • 母亲:是,在税务局上班呢。
  • 女儿:那好,我去见见。

这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,那么这个可以用下图表示女孩的决策逻辑。

上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程。

这幅图基本可以算是一棵决策树,说它“基本可以算”是因为图中的判定条件没有量化,如收入高中低等等,还不能算是严格意义上的决策树,如果将所有条件量化,则就变成真正的决策树了。

有了上面直观的认识,我们可以正式定义决策树了:

决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

更多的关于决策树的细节参照博客(http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html).

那么如何使用sklearn中的决策树呢,代码如下:

代码语言:javascript
复制
#导入
from sklearn.tree import DecisionTreeClassifier
#读取训练集和测试集
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
#构造决策树分类器
dtc=DecisionTreeClassifier()
#训练数据集
dtc.fit(train_x,train_y)
#根据测试集得到预测结果
pred_y=dtc.predict(test_x)

在上面的使用过程中我们是没有指定决策树的参数的,常用的决策树参数有:

max_features:在进行分类时需要考虑的特征数。

max_depth:(默认为"None") 表示树的最大深度。

min_samples_split:(默认为2) 区分一个内部节点需要的最少的样本数。

min_samples_leaf:(默认为1) 一个叶节点所需要的最小样本数:

更多关于决策树参数的细节,请参见博客:http://blog.csdn.net/li980828298/article/details/51172744

2 随机森林

随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。随机森林可以用于分类和回归。 此处我们只介绍其在分类方面的应用。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类,然后看看哪一类被选择最多,就预测这个样本为那一类。简单来讲,随机森林就是一堆决策树的组合,并采用少数服从多数的原则来判定类别。

更多有关随机森林的介绍参考简书中的文章:http://www.jianshu.com/p/c4bcb2505360

通过sklearn使用随机森林的方法如下:

代码语言:javascript
复制
#导入
from sklearn.ensemble import RandomForestClassifier
#读取训练集和测试集
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
#构造随机森林分类器
dtc=RandomForestClassifier()
#训练数据集
dtc.fit(train_x,train_y)
#根据测试集得到预测结果
pred_y=dtc.predict(test_x) 

随机森林中的参数大多与决策树一致,这里我们只介绍其特有的一部分参数:

n_estimators:决策树的个数

n_jobs:并行job个数。

更多关于随机森林参数的细节参加博客:http://blog.csdn.net/u011301133/article/details/52562874

3 朴素贝叶斯分类器

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

有关朴素贝叶斯分类器的详细介绍,参见博客:http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html

通过sklearn使用朴素贝叶斯分类(以多项式分类器为例)的方法如下:

代码语言:javascript
复制
#导入
from sklearn.naive_bayes import MultinomialNB
#读取训练集和测试集
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
#构造朴素贝叶斯分类器
nb=MultinomialNB()
#训练数据集
nb.fit(train_x,train_y)
#根据测试集得到预测结果
pred_y=nb.predict(test_x)

朴素贝叶斯分类除多项式分类器外,还有高斯分类器和伯努利分类器,使用如下:

代码语言:javascript
复制
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB

对于三者的区别,参见博客http://www.cnblogs.com/Scorpio989/p/4760281.html

4 SVC分类器

如果你想快速了解svm的原理,参见一篇生动有趣的公众号的帖子:http://mp.weixin.qq.com/s/TEV0OGRSqiBwhu2nrinYRA

如果你想了解svm背后的数学知识,参见博客:http://www.dataguru.cn/thread-371987-1-1.html

这里我们直接介绍在sklearn中使用SVC分类器:

代码语言:javascript
复制
#导入
from sklearn.svm import SVC
#读取训练集和测试集
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
#构造SVC分类器
svc=SVC()
#训练数据集
svc.fit(train_x,train_y)
#根据测试集得到预测结果
pred_y=svc.predict(test_x)

在上面的使用过程中我们是没有指定SVC分类器的参数的,常用的参数有:

kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’

gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features

C:C-SVC的惩罚参数C默认值是1.0。C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

更多关于SVC参数的介绍,参见博客:http://blog.csdn.net/szlcw1/article/details/52336824

5 梯度提升决策(GBDT)

迭代决策树GBDT(Gradient Boosting Decision Tree)也被称为是MART(Multiple Additive Regression Tree))或者是GBRT(Gradient Boosting Regression Tree),也是一种基于集成思想的决策树模型,但是它和Random Forest有着本质上的区别。不得不提的是,GBDT是目前竞赛中最为常用的一种机器学习算法,因为它不仅可以适用于多种场景,更难能可贵的是,GBDT有着出众的准确率。这也是为什么很多人称GBDT为机器学习领域的“屠龙刀”。

这么牛叉的算法,到底是怎么做到的呢?说到这里,就不得不说一下GBDT中的“GB”(Gradient Boosting)。

在这里引用另外一个网友的解释来说明一下对GBDT中的Gradient Boosting的理解:

以下一段内容引自《GBDT(MART) 迭代决策树入门教程 | 简介》。

“Boosting,迭代,即通过迭代多棵树来共同决策。这怎么实现呢?难道是每棵树独立训练一遍,比如A这个人,第一棵树认为是10岁,第二棵树认为是0岁,第三棵树认为是20岁,我们就取平均值10岁做最终结论?当然不是!且不说这是投票方法并不是GBDT,只要训练集不变,独立训练三次的三棵树必定完全相同,这样做完全没有意义。之前说过,GBDT是把所有树的结论累加起来做最终结论的,所以可以想到每棵树的结论并不是年龄本身,而是年龄的一个累加量。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。这就是Gradient Boosting在GBDT中的意义。”

更多关于GBDT的介绍参见博客:http://www.cnblogs.com/maybe2030/p/4734645.html#_label4

通过sklearn使用GBDT的方法如下:

代码语言:javascript
复制
#导入
from sklearn.ensemble import GradientBoostingClassifier
#读取训练集和测试集
train_x = pd.read_csv('train_x.csv', index_col=0)
train_y = pd.read_csv('train_y.csv', index_col=0, header=None)
test_x = pd.read_csv('test.csv', index_col=0)
#构造GBDT分类器
gbdt=GradientBoostingClassifier()
#训练数据集
gbdt.fit(train_x,train_y)
#根据测试集得到预测结果
pred_y=gbdt.predict(test_x)

在上面的使用过程中我们是没有指定GBDT分类器的参数的,常用的参数有:

n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。

learning_rate: 即每个弱学习器的权重缩减系数,也称作步长。

更多关于GBDT参数的介绍,参见博客:http://www.07net01.com/2016/12/1742073.html

6 总结

本篇小编主要带领大家介绍了sklearn中常用的分类算法,主要有决策树、随机森林、朴素贝叶斯、SVC分类器、GBDT算法。本文重点是介绍如何在sklearn中使用这些算法,并非介绍其原理,使用的时候需要根据实际数据集的不同进行参数的调整,sklearn中也有网格搜索的方法可以选择最优参数。有理解不到位的地方还请各位读者作出指正,如果对原理感兴趣的同学可以阅读文章中涉及的一些链接。好啦,今天的总结就到这里,下一篇,小编将带你体验sklearn其他方面的应用,敬请期待!

想了解更多? 那就赶紧来关注我们

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 决策树分类器
  • 2 随机森林
  • 3 朴素贝叶斯分类器
  • 4 SVC分类器
  • 5 梯度提升决策(GBDT)
  • 6 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档