朴素贝叶斯分类器
与线性模型相似,相比起来训练速度更快,但是模型泛化能力稍差。高效的原因是通过查看每个特征来学习参数,从每个特征中收集简单的类别统计数据。
sklearn中实现了3种朴素贝叶斯分类器:
- GuassianNB:高斯贝叶斯分类器,应用于任意连续数据。保存每个类别中每个特征的平均值和标准差。
- BernoulliNB:伯努利贝叶斯分类器,输入数据是二分类数据。计算每个类别中每个特征不为0的元素个数。
- MultinomialNB:多项式贝叶斯分类器,假定输入数据是计数数据。比如说一个词的出现次数。计算每个类别中每个特征的平均值。
BernoulliNB和MultinomialNB主要用在文本分类中。
具体可参考sklearn官方文档
决策树
决策树是从一层层的if/else问题中学习的,这些问题叫做测试。一系列问题可以表示为一棵决策树。
1、构造决策树
- 将所有数据当做一个根结点,通过测试对数据集进行划分。
- 若测试结果为真,将这个点分配到左边的结点,否则分配到右边。每个结点都包含一个测试。
- 对数据反复进行递归划分,直到每个叶结点只包含单一类别。若叶结点中数据点的目标值相同,则为纯叶结点。
2、控制决策树的复杂度
通常来说,如果叶结点都是纯的会导致模型非常复杂,因为它要去拟合每个数据,造成过拟合。
防止过拟合有两种常见的策略:
- 预剪枝:及早停止树的生长。可通过限制树的最大深度,限制叶结点的最大数目,规定一个结点中数据点的最小数目。
- 后剪枝:先构造树,随后删除或折叠信息少的结点。
sklearn实现决策树在DecisionTreeClassifier和DecisionTreeRegressor中。只实现了预剪枝,没有后剪枝。
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(cancer.data,cancer.target,stratify=cancer.target,random_state=42)
tree=DecisionTreeClassifier().fit(X_train,y_train)
print("train acc={}".format(tree.score(X_train,y_train)))
print("test acc={}".format(tree.score(X_test,y_test)))
输出:
train acc=1.0
test acc=0.9230769230769231
可以看到训练集上的精度是100%,这棵树直到划分到纯叶结点才停止的。
它对测试集的数据泛化能力不好,接下来通过限制树的深度来停止生长,避免过拟合问题。
tree=DecisionTreeClassifier(max_depth=4).fit(X_train,y_train)#将深度设为4,意味着只可以连续问4个问题。
print("train acc={:.3f}".format(tree.score(X_train,y_train)))
print("test acc={:.3f}".format(tree.score(X_test,y_test)))
输出:
train acc=0.988
test acc=0.944
3、决策树可视化
将决策树可视化有助于理解算法是如何预测的。
生成.dot文件
from sklearn.tree import export_graphviz#可视化树,生成一个.dot文件,保存图形的文本文件格式
export_graphviz(tree,out_file="tree.dot",class_names=["malignant","benign"],
feature_names=cancer.feature_names,impurity=False