机械学习入门

机械学习要解决的问题:

1. 初始化一个几乎什么也不能做的模型;
2. 抓一些有标注的数据集;
3. 修改模型使得它在抓取的数据集上能够更准确执行任务;
4. 重复以上步骤 2 3 ,直到模型看起来不错机械学习入门_第1张图片

 

机器学习背后的核心思想是,设计程序使得它可以在执行的时候提升它在某任务上的能力,而不是有着 固定行为的程序。机器学习包括多种问题的定义,提供很多不同的算法,能解决不同领域的各种问题。

机械学习的四个要素

成功的机械学习有四个要素:数据,转化数据的模型,衡量模型好坏的损失函数和一个调整模型权重来最小化损失函数的算法。

1.数据:   越多越好的数据包括图片,结构数据,文本,声音

2.模型:通常数据和我们最终想要的相差很远,例如我们想知道照片中的人是不是高兴的,所以我们 需要把一千万像素变成一个高兴度的概率值。通常我们需要在数据上应用数个非线性函数(例如神经网络)

3.损失函数:我们需要对比模型的输出和真实值之间的误差。取决于我们想短线还是长线,这个函数可以很不一样。

4.训练:通常一个模型里面有很多参数。我们通过最小化损失函数来学这些参数。不幸的是,即使我们做得很好也不能保证在新的没见过的数据上我们可以仍然做很好。

误差

训练误差:这是模型在评估用来训练模型的数据集上的误差。这个类似于考试前我们在模拟试 卷上拿到的分数。有一定的指向性,但不一定保证真实考试分数。

测试误差:这是模型在没见过的新数据上的误差,可能会跟训练误差不很一样(统计上叫过拟 合)。这个类似于考前模考次次拿高分,但实际考起来却失误了。

监督学习与无监督学习

监督学习

监督学习描述的任务是:当给定输入 x ,如何通过在有标注输入和输出的数据上训练模型而能够预测输出 y。从统计角度来说,监督学习主要关注如何估计条件概率 P(y|x) 。在实际情景中,监督学习最为常用。
例如:给定一位患者的 CT 图像,预测该患者是否得癌症;给定英文句子,预测出它的正确中文翻译;给 定本月公司财报数据,预测下个月该公司股票价格

  • 目标值:类别 (分类问题)
    分类:k-近邻算法,贝叶斯分类,决策树与随机森林,逻辑回归

  • 目标值:连续型的数据 (回归问题)
    回归:线性回归,岭回归

决策树

决策树( Decision Tree )是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规 则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,

决策数中的核心问题:

1)如何从数据表中找出最佳节点和最佳分枝?

2 )如何让决策树停止生长,防止过拟合?

sklearn中的决策树:

模块:sklearn.tree

tree.DecisionTreeClassifier 分类树
tree.DecisionTreeRegressor 回归树
tree.export_graphviz 画图专用,导出为dot格式
tree.ExtraTreeClassifier 高随机版本分类树
tree.ExtraTreeRegressor 高随机版本回归树

sklearn基本建模流程:

from sklearn import tree

clf = tree.DecisionTreeClassifier()   #实例化
clf=clf.fit(xtrain,ytrain)    #训练模型
result = clf.score(X_test,y_test)    #导入测试集,查看模型的好坏

 重要参数

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)

1.criterion:这个参数用来决定不纯度的计算方法

 1)entropy 使用信息熵(Entropy)

 2)gini 使用基尼系数(Gini Impurity)

机械学习入门_第2张图片

 

其中 t 代表给定的节点, i 代表标签的任意分类, $p(i|t)$ 代表标签分类 i 在节点 t 上所占的比例。注意,当使用信息熵 时,sklearn 实际计算的是基于信息熵的信息增益 (Information Gain) ,即父节点的信息熵和子节点的信息熵之差。 比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基 本相同。 信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏 感,所以信息熵作为指标时,决策树的生长会更加“ 精细 ,因此对于高维数据或者噪音很多的数据,信息熵很容易 过拟合,基尼系数在这种情况下效果往往比较好。当然,这不是绝对的
参数 criterion
如何影响模型 通过确定不纯度的计算方法,帮忙找出最佳节点和最佳分支,不纯度越低,拟合效果越好
有哪些计算方法 gini(基尼系数)与entropy(信息熵)
如何选择

通常选择基尼系数

噪声很大,维数大时选择基尼系数

通常两者可以都尝试一下,选取最优参数

建立一棵树:

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split    #导入需要的库

wine=load_wine()    #导入红酒数据集
wine.data.shape    #查看红酒数据集的形状
wine.target    #查看目标值
#分训练集和测试集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.taget,test test_size=0.3,random_state=3)    #random_state 为随机数种子,test_size为测试集所占的数据比例,此处为30%

#建立模型
clf=tree.DecisionTreeClassifier(criterion="entropy",min_sample_=5)
clf=clf.fit(Xtrain,Ytrain)    #训练模型
score=clf.score(Xtest,Ytest)    #测试模型

#画出一棵树
import graphviz    #导入画图的库
dot_data=tree.export_graphviz(clf,filled=True,rounded=True)

#查看特征重要性
clf.feature_importances_
[*zip(feature_name,clf.feature_importances_)]

2.random_state&splitter

random_state 用来设置分枝中的随机模式的参数,默认 None ,在高维度时随机性会表现更明显,低维度的数据 (比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。

splitter 也是用来控制决策树中的随机选项的,有两种输入值,输入 ”best" ,决策树在分枝时虽然随机,但是还是会 优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_ 查看),输入 “random" ,决策树在 分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这 也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能

减枝参数

为了让决策树有更好的泛化性,我们要对决策树进行剪枝。 剪枝策略对决策树的影响巨大,正确的剪枝策略是优化 决策树算法的核心。 sklearn 为我们提供了不同的剪枝策略:

1)max_depth
作用:限制树的最大深度,超过设定深度的树枝全部剪掉
这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所 以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3 开始尝试,看看拟合的效 果再决定是否增加设定深度。

2)min_samples_leaf & min_samples_split

min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须包含至少 min_samples_leaf 个训练样本,否则分 枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf 个样本的方向去发生
min_samples_split 限定,一个节点必须要包含至少 min_samples_split 个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。

3)max_features & min_impurity_decrease

max_features 限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和 max_depth 异曲同工, max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量 而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA ICA 或者特征选择模块中的降维算法

min_impurity_decrease 限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在 0.19 版本种更新的 功能,在0.19 版本之前时使用 min_impurity_split

超参数学习曲线

超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲 线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score
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="red",label="max_depth")
plt.show

重要属性和接口

#apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtset)
#predict返回测试样本的分类回归结果
clf.predict(Xtest)
至此,我们已经学完了分类树 DecisionTreeClassififier 和用决策树绘图( export_graphviz )的所有基础。我们讲解 了决策树的基本流程,分类树的七个参数,一个属性,四个接口,以及绘图所用的代码。
七个参数: Criterion ,两个随机性相关的参数( random_state splitter ),四个剪枝参数( max_depth, , min_sample_leaf, max_feature min_impurity_decrease
一个属性: feature_importances_
四个接口: fit score apply predict

随机森林

随机森林建模流程

from sklearn.tree import RandomForestClassifier
rfc=RandomForestClassifier()
rfc=rfc.fit(Xtrain,Ytrain)
score=rfc.score(Xtest,Ytest)
class sklearn.ensemble.RandomForestClassifier (n_estimators=’10’, 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)

重要参数

  参数 含义
criterion 不纯度的两种指标:基尼系数与信息熵
max_depth 树的最大深度,超过最大深度的部分会被剪掉
min_samples_leaf
一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样
本,否则分枝就不会发生
min_samples_split
一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分 枝,否则分枝就不会发生
max_features
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,
默认值为总特征个数开平方取整
min_impurity_decrease 限制信息增益的大小,小于设定值的分枝不会发生
n_estimators 限制随机森林中树的个数  

建立一片森林:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_c)
     ,"Random Forest:{}".format(score_r)
     )

随机森林是一种经典的Bagging集成算法,其中基评估器为决策树或回归树,随机森林中的重要属性与接口与上述的决策树大致相同

你可能感兴趣的:(机械学习入门)