小编们最近参加了数据城堡举办的“大学生助学金精准资助预测”比赛,以分组第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其他方面的应用,敬请期待!
想了解更多? 那就赶紧来关注我们