机器学习-sklearn练习-2

机器学习-sklearn练习-2

决策树

API

class sklearn.tree.DecisionTreeClassifier
(criterion=’gini’,
 splitter=’best’,
 max_depth=None, 
 min_samples_split=2,
 min_samples_leaf=1, 
 min_weight_fraction_leaf=0.0, 
 max_features=None, 
 random_state=None, 
 max_leaf_nodes=None, 
 min_impurity_decrease=0.0, 
 min_impurity_split=None, 
 class_weight=None, 
 presort=False)

criterion:
特征选择标准,【entropy, gini】。默认gini,即CART算法。

splitter:
特征划分标准,【best, random】。best在特征的所有划分点中找出最优的划分点,random随机的在部分划分点中找局部最优的划分点。默认的‘best’适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐‘random’。

max_depth:
决策树最大深度,【int, None】。默认值是‘None’。一般数据比较少或者特征少的时候可以不用管这个值,如果模型样本数量多,特征也多时,推荐限制这个最大深度,具体取值取决于数据的分布。常用的可以取值10-100之间,常用来解决过拟合。

min_samples_split:
内部节点(即判断条件)再划分所需最小样本数,【int, float】。默认值为2。如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_split*样本数量)作为最小样本数。(向上取整)

min_samples_leaf:
叶子节点(即分类)最少样本数。如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_leaf*样本数量)的值作为最小样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。

min_weight_fraction_leaf:
叶子节点(即分类)最小的样本权重和,【float】。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,就是不考虑权重问题,所有样本的权重相同。
一般来说如果我们有较多样本有缺失值或者分类树样本的分布类别偏差很大,就会引入样本权重,这时就要注意此值。

max_features:
在划分数据集时考虑的最多的特征值数量,【int值】。在每次split时最大特征数;【float值】表示百分数,即(max_features*n_features)

random_state:
【int, randomSate instance, None】,默认是None

max_leaf_nodes:
最大叶子节点数。【int, None】,通过设置最大叶子节点数,可以防止过拟合。默认值None,默认情况下不设置最大叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多,可以加限制,具体的值可以通过交叉验证得到。

min_impurity_decrease:
节点划分最小不纯度,【float】。默认值为‘0’。限制决策树的增长,节点的不纯度(基尼系数,信息增益,均方差,绝对差)必须大于这个阈值,否则该节点不再生成子节点。
min_impurity_split(已弃用):

信息增益的阀值。决策树在创建分支时,信息增益必须大于这个阈值,否则不分裂。(从版本0.19开始不推荐使用:min_impurity_split已被弃用,以0.19版本中的min_impurity_decrease取代。 min_impurity_split的默认值将在0.23版本中从1e-7变为0,并且将在0.25版本中删除。 请改用min_impurity_decrease。)

class_weight:
类别权重,【dict, list of dicts, balanced】,默认为None。(不适用于回归树,sklearn.tree.DecisionTreeRegressor)
指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。balanced,算法自己计算权重,样本量少的类别所对应的样本权重会更高。如果样本类别分布没有明显的偏倚,则可以不管这个参数。

presort:
bool,默认是False,表示在进行拟合之前,是否预分数据来加快树的构建。

鸢尾花示例:

import pandas as pd
import  matplotlib.pyplot as plt
from sklearn import tree
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split


X, y = datasets.load_iris(True)
# random state:控制器,控制每次的随机。因为要随机采样,设置了这个参数以后,每次随机的结果是一样的,这样很有用,控制住了不必要的变量
X_train, X_test, y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=1024)
# 计算每种特征值权重
print(X_train.std(axis=0))
clf = DecisionTreeClassifier(criterion='entropy',max_depth=2)
clf.fit(X_train,y_train)
y_predict = clf.predict(X_test)
print(clf.score(X_test, y_test))
tree.plot_tree(clf)
plt.show()

输出结果:
#四种特征值的均方差
[0.82300095 0.42470578 1.74587112 0.75016619]
0.9666666666666667

在这里插入图片描述

输的深度越大,则运算时间会变长,因此应该合理的设置深度

集成算法

一般情况下不使用决策树,而是使用集成算法

集成算法: 集成方法的目标是将使用给定学习算法构建的几个基本估计量的预测结合起来,以提高单个估计量的通用性/鲁棒性。

集成学习算法分为两种

Bagging算法:
样本随机,在相同训练数据中随机选取特征来同时搭建多个独立的分类模型,通过投票的方式,以少数服从多数的为原则选出最优分类决策

Bagging算法首先采用M轮自助采样法,获得M个包含N个训练样本的采样集。然后,基于这些采样集训练出一个基学习器。最后将这M个基学习器进行组合。组合策略为:
分类任务采用简单投票法:即每个基学习器一票
回归问题使用简单平均法:即每个基学习器的预测值取平均值
代表算法有随机森林、极限森林

Boosting算法
按一定的次序搭建多个分类模型。后加入的模型需要对现有的集成模型有一定优化,进而不断提高更行过后模型的性能,并借助多个弱分类器搭建出强分类器。与第一种不同在于每一颗树在生成的过程中都会尽可能降低模型在训练集上的拟合或训练误差。

Boosting算法是一种将弱学习器提升为强学习器的算法框架,代表算法梯度提升树,Adaboost。
算法机制:
(1)先从初始训练集训练出一个基学习器
(2)在根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到最大的关注。
(3)然后基于调整后的样本分布来训练下一个基学习器;
(4)如此重复进行,直至基学习器数目达到实现指定的值T为止。
(5)再将这T个基学习器进行加权结合得到集成学习器。
因此,对于Boosting算法,存在两个问题:   
(1)在每一轮中如何调整训练集,使训练的弱分类器得以进行;(调整样本权值)   
(2)如何将各个弱分类器联合起来形成强分类器。 (调整模型权值)
集成学习通过将多个弱分类器组合形成一个强分类器,获得一个比单一学习器有显著优越的泛化性能。常见的弱分类器有:决策树、BP神经网络、Logistic回归、SVM等。
对个体学习器有一定要求:应有一定的"准确性"、各学习器之间具有"差异性"。

AdaBoost:
Adaptive Boosting自适应提升学习算法和Boosting考虑的点一样,Adaboost自适应在于:"关注"被错分的样本,"器重"性能好的弱分类器。
两个核心步骤:
权值调整:AdaBoost算法提高哪些被前一轮基分类器错误分类样本的权值,降低被正确分类样本的权值。从而是没有得到正确分类的样本得到下一轮基分类器的更大关注。
基分类器组合:加大分类误差较小的弱分类器的权值,使其在表决中起到较大的作用。反之,减小分类误差较大的弱分类器的权值。
AdaBoost特点:
(1)可以使用各种方法构建子分类器,Adaboost算法提供的是框架;
(2)子分类器容易构造;
(3)速度快,且基本不用调参数;
(4)泛化错误率低。
AdaBoost迭代算法分为3步:
(1)初始化训练数据的权值分布:假设有N个样本,每个样本赋予相同权值1/N。
(2)训练弱分类器:本轮训练中,若某样本分错,则提高它的权值,相反分类正确的样本被降低权值。然后,权值更新过的全体样本被用于训练下一个分类器,使得下一个分类器更关注权重大的难分样本。多次迭代,训练多个弱分类器。
(3)加权组合弱分类器:加大分类误差率小的弱分类器的权重,使其在最终表决中起较大作用,而降低分类误差率大的弱分类器的权重,使其在最终表决中起较小作用。

随机森林

多颗决策树构建而成,每一颗决策树都是刚才讲到的决策树原理。此外,在树的构造过程中拆分每个节点时,可以从所有输入要素或尺寸的随机子集中找到最佳拆分最大特征数。

API

class sklearn.ensemble.RandomForestClassifier(
n_estimators=100, 
criterion='gini', 
max_depth=None,
min_samples_split=2, 
min_samples_leaf=1,
min_weight_fraction_leaf=0.0, 
max_features='auto',
max_leaf_nodes=None, 
min_impurity_decrease=0.0, 
min_impurity_split=None,
bootstrap=True, 
oob_score=False,
n_jobs=None, 
random_state=None,
verbose=0, 
warm_start=False,
class_weight=None,
ccp_alpha=0.0, 
max_samples=None)

决策树的参数:
criterion: 特征选择算法

splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。

max_features: 选择最适属性时划分的特征不能超过此值。
当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
if “auto”, then max_features=sqrt(n_features).
If “sqrt”, thenmax_features=sqrt(n_features).
If “log2”, thenmax_features=log2(n_features).
If None, then max_features=n_features.

max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。

min_samples_split: 根据属性划分节点时,每个划分最少的样本数。

min_samples_leaf: 叶子节点最少的样本数。

max_leaf_nodes: (default=None)叶子树的最大样本数。

min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值

verbose: (default=0) 是否显示任务进程

随机森林特有的参数:
n_estimators=10: 决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。

bootstrap=True: 是否有放回的采样。

oob_score=False: oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。

n_jobs=1: 并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job

warm_start=False: 热启动,决定是否使用上次调用该类的结果然后增加新的。

class_weight=None: 各个label的权重

from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from sklearn import datasets
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

wine = datasets.load_wine()
wine
X = wine['data']
y = wine['target']
print(X.shape)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf = RandomForestClassifier()
clf.fit(X_train, y_train)
y_ = clf.predict(X_test)
accuracy_score(y_test, y_)
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train, y_train)
dt_clf.score(X_test, y_test)
score = 0
for i in range(100):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    dt_clf = DecisionTreeClassifier()
    dt_clf.fit(X_train, y_train)
    score += dt_clf.score(X_test, y_test) / 100

print('决策树多次运行准确率:', score)
score = 0
for i in range(100):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    clf = RandomForestClassifier(n_estimators=100)
    clf.fit(X_train, y_train)
    score += clf.score(X_test, y_test) / 100
print('随机森林多次运行准确率:', score)


输出结果:
(178, 13)
决策树多次运行准确率: 0.9019444444444441
随机森林多次运行准确率: 0.9808333333333333

极限森林

像随机森林中一样,使用候选特征的随机子集,但不是寻找最有区别的阈值,而是为每个候选特征随机绘制阈值,并选择这些随机生成的阈值中的最佳阈值作为划分规则。

from sklearn import datasets
from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier

print("酒分类 13个特征值")
X, y = datasets.load_wine(True)
clf = DecisionTreeClassifier()
forest = RandomForestClassifier(n_estimators=100)
extra = ExtraTreesClassifier(n_estimators=100)
print("决策树准确度:", cross_val_score(clf, X, y, cv=6, scoring='accuracy').mean())
print("随机森林准确度", cross_val_score(forest, X, y, cv=6, scoring='accuracy').mean())
print("极限森林准确度", cross_val_score(extra, X, y, cv=6, scoring='accuracy').mean())
print()
print("鸢尾花分类 4个特征值")
X, y = datasets.load_iris(True)
clf = DecisionTreeClassifier()
forest = RandomForestClassifier(n_estimators=100)
extra = ExtraTreesClassifier(n_estimators=100)
print("决策树准确度:", cross_val_score(clf, X, y, cv=6, scoring='accuracy').mean())
print("随机森林准确度", cross_val_score(forest, X, y, cv=6, scoring='accuracy').mean())
print("极限森林准确度", cross_val_score(extra, X, y, cv=6, scoring='accuracy').mean())

输出结果:
酒分类 13个特征值
决策树准确度: 0.882183908045977
随机森林准确度 0.9666666666666667
极限森林准确度 0.9888888888888889

鸢尾花分类 4个特征值
决策树准确度: 0.96
随机森林准确度 0.9533333333333333
极限森林准确度 0.9466666666666667

预处理对于结果的准确度十分重要,数据的处理是重中之重。
当数据较简单时,决策树,随机森林和极限森林差别不大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值