引言
最近在读西瓜书,查阅了多方资料,恶补了数值代数、统计概率和线代,总算是勉强看懂了西瓜书中的公式推导。但是知道了公式以后还是要学会应用的,几经摸索发现python下的sklearn包把机器学习中经典的算法都封装好了,因此,打算写几篇博客记录一下sklearn包下的常用学习算法的使用,防止自己以后忘了,嘿嘿。
1.决策树
决策树是一种常见的机器学习算法,它的原理就是以事物的属性为节点,属性的不同取值为分支构造一棵多叉树。初始的多叉树可以学习到训练集上的事物的所有属性,我们通过相关的方法对这棵树进行剪枝和层次调整后,使之对于训练集中未出现过的新数据具有一定的分类能力,即泛化。
2.决策树算法种类
由1中对决策树的描述,我们可以知道生成决策树的核心问题就是分支的选择,即每一步我们应该选择待分类事物的哪一个属性作为分支属性,我们应该把对事物影响大的属性尽可能放在树的高层,这是因为越往下走剩下的样本就会越少对事物影响大的属性应该在树中对大多数样本起到分类作用。基于不同的分支选择方法,决策树主要有三类,即ID3算法,C4.5算法和CART算法。
1.ID3算法
ID3主要基于信息增益来进行分支属性的选择。首先引入信息熵:其中,|y|表示样本类别总数,
表示第k类样本所占的比例,我们可以把Ent(D)看成一个多元函数,使用拉格朗日乘数法(还需要结合分析法)即可求出其最大最小值,即:
,在信息熵的基础上,引入信息增益:
其中,a为事物的属性,假设属性a由v个可能的取值
,
表示D中所有在a上取值为
的样本。
ID3在每一步计算每个属性的信息增益,选取信息增益最大的作为当前划分的属性。
2.C4.5算法
ID3中使用的信息增益偏向取值较多的属性,如果有“编号”这类属性,那ID3算法会把编号作为最优属性,这很荒诞,C4.5算法就使用增益率代替增益,解决这种问题。增益率公式如下:其中,IV(a)成为a的固有值:
此外,为了避免偏向于取值数目少的属性,C4.5算法并不是直接选取增益率最大的属性进行分支,而是启发式的,先找出信息增益高于平均值的属性,再从中选出增益率最高的作为分支属性。
3.CART算法
CART算法使用基尼指数来作为划分原则,基尼指数公式为:其中,
CART
3.sklearn中的决策树算法DecisionTreeClassifier
sklearn包包含了很多机器学习的经典算法,我是用其中所带的DecisionTreeClassifier实现了对经典数据集iris的分类任务,以下为代码:
from sklearn import datasets
from pandas import DataFrame
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
#加载数据
iris=datasets.load_iris()
#先把数据整合到DataFrame,方便统一处理和展示(个人习惯)
iris_data=DataFrame(iris.data, columns=iris.feature_names)
pd.set_option('display.width',None)
tar=list(iris.target)
iris_data['target']=tar
# print(iris_data)
#把数据转成np.array类型以便作为参数传入分类器
X=iris_data.iloc[:,0:4].values
Y=iris_data.iloc[:,4].values
#train_test_split函数用来划分数据集和测试集,这个数据集量比较大,我们留百分之30作为测试集即可
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)
#对数据集进行标准化处理,如果是其他数据,要注意进行数据清洗
sc=StandardScaler()
#fit是获取整体数据的均值方差,StandardScaler的使用方法就是先fit整体,再对需要的数据transform
sc.fit(X)
standard_train=sc.transform(X_train)
standard_test=sc.transform(X_test)
#训练决策树,criterion表示需要使用的算法,可选值为'gini'(默认值)表示使用基尼指数进行决策,"entropy"表示使用信息增益进行决策
dtc=DecisionTreeClassifier(criterion="entropy")
dtc.fit(standard_train,Y_train)
#在测试集上进行测试
result=dtc.predict(standard_test)
print("测试集合的y值:",list(Y_test))
print("决策树算法预测的的y值:",list(result))
print("预测的正确率为:",dtc.score(standard_test,Y_test))
运行结果
可以看到,训练出的决策树对测试集的分类正确率达到了百分之九十八,还算可以,我们可以通过调整参数(决策方法)或者采用交叉验证法来迭代训练分类器来对这个决策树进行优化。