查看原文
其他

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

文文 Python爱好者社区 2019-04-07

作者:文文

个人公众号:小小挖掘机(ID:wAIsjwj)


前文传送门:

数据城堡参赛代码实战篇(一)---手把手教你使用pandas

数据城堡参赛代码实战篇(二)---使用pandas进行数据去重

数据城堡参赛代码实战篇(三)---我们来探究一个深奥的问题!

数据城堡参赛代码实战篇(四)---使用pandas合并数据表


关注Python爱好者社区,回复"数据代码",即可获得本文数据代码。


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

1 决策树分类器

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


女儿:多大年纪了?

母亲:26。

女儿:长的帅不帅?

母亲:挺帅的。

女儿:收入高不?

母亲:不算很高,中等情况。

女儿:是公务员不?

母亲:是,在税务局上班呢。

女儿:那好,我去见见。


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



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


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


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


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


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


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

#导入 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使用随机森林的方法如下:

#导入 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使用朴素贝叶斯分类(以多项式分类器为例)的方法如下:

#导入 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)

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

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分类器:

#导入 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的方法如下:

#导入 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其他方面的应用,敬请期待!


关注Python爱好者社区,回复"数据代码",即可获得本文数据代码。

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存