有监督学习及决策树

有监督的机器学习即标签(label)已知的机器学习。在训练阶段,我们要事先告知机器,如果我输入样本x,你要输出对应的数据y。重复多次后,机器就会学到一个输入数据和输出数据之间的关系或规则。在测试阶段,在面对一个未知标签的测试样本x’时,机器会根据学到的关系或规则,判断输出最合理的y’。

有监督的机器学习分为分类(classification)和回归(Regression)两大问题,二者的区别在于标签是离散的还是连续的。

对于分类问题,比如预测一个水果的好坏,首先对足够多的水果的不同属性进行记录,如颜色、气味、体积、重量等,同时还要知道每个水果是好还是坏。将这些数据输入机器,让机器去学习水果的这些属性和水果好坏的关系。面对一个不知道是好还是坏的水果,我们将这个水果的各个属性输入机器,机器就会判断这个水果更可能是好还是坏。

对于回归问题,比如预测一个青少年的身高,首先记录足够多的 可能对青少年的身高有影响的因素的情况,如运动、饮食、睡眠、基因等,并记录其在成年后的身高。将数据输入机器,让机器去学习这些因素与身高的关系。面对一个即将步入青少年时期的孩子,我们输入这个孩子在上述因素的情况,机器就会预测这个孩子成年后最有可能的身高范围。

水果的好坏是离散的,青少年的身高是连续的,但离散和连续没有太大区别。我们可以对不同水果进行打分,最后的分数是连续的,再划定一个阈值,只有大于这个阈值的水果才算作是好水果,这样就把连续的水果分数转换为离散的水果质量。青少年的身高是连续的,但是我们可以划定几个阈值,如1.5米,1.6米,1.7米,1.8米,1.9米,根据相邻阈值划分出几个区间,并对处于不同区间的人判断为矮、较矮、正常、较高、高等,这样就把连续的身高转换为离散的身高判断。如果把区间的宽度不断缩小,也可以把无限多个分段看作一段连续的取值。

决策树(Decision tree)可以说是有监督学习最简单的算法。用样本的不同属性建立起一棵树,在每个节点对不同的一个或几个属性进行判断,然后进入不同的分支,直至达到叶子节点对样本进行判断。我是用的是sklearn自带的红酒数据集,包含178个样本,每个样本有13个特征,如酒精、类黄酮、脯氨酸等。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz

wine = load_wine()

Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 # ,random_state=10
                                 # ,splitter="random"                   #best
                                 # ,max_depth=3                        #最大深度  
                                 # ,min_samples_leaf=10           #叶子节点最小样本数
                                 # ,min_samples_split=25          #分支节点最小样本数
                                 # ,max_features=3                    #考虑的最大特征数
                                 # ,min_impurity_decrease         #最小信息增益
                                 )
clf = clf.fit(Xtrain,Ytrain)
#[*zip(feature_name,clf.feature_importances_)]
dot_data = tree.export_graphviz(clf
                               ,feature_names = feature_name
                               ,class_names = ["Gin","Sherry","Vermouth"]
                               ,filled = True
                               ,rounded = True
                               )
graph = graphviz.Source(dot_data)
graph

有监督学习及决策树_第1张图片
对决策树的深度进行剪枝。

import matplotlib.pyplot as plt

test = []
for i in range(10):
    clf = tree.DecisionTreeClassifier(max_depth=i+1
                                      ,criterion="entropy"
                                      ,random_state=30
                                      ,splitter="random"
                                    )
    clf = clf.fit(Xtrain,Ytrain)
    score = clf.score(Xtest,Ytest)
    test.append(score)
    
plt.plot(range(1,11),test,color="r",label="max_depth")
plt.legend()
plt.show()

有监督学习及决策树_第2张图片
对决策树进行剪枝,是为了避免过拟合(Over fitting),在训练集的准确率很高,但在测试集的准确率下降,如上图在max_depth取值大于4时,测试集的准确率下降了,说明开始出现过拟合现象。因为训练样本在包含了总体样本的普遍性质的同时,还会包含个别样本的特殊性质。如果决策树过于充分的学习了训练样本,会把那些属于个别样本的特殊性质也学到,面对测试样本时,往往会根据特殊性质作出错误的判断。在决策树中,最有效的剪枝参数是max_depth,控制决策树的最大深度,使树不要对过多的属性进行学习,只学习几个最重要的属性即可。

[1]机器学习sklearn课堂.https://www.bilibili.com/video/av79396766?from=search&seid=9799125221555866661

你可能感兴趣的:(机器学习)