Python [ sklearn 学习 ]
内容来自于B站菜菜老师的sklearn课程中的课件。
0. 安装
# pip 终端安装
pip install pandas
pip install matplotlib
pip install numpy
pip install graphviz # --- 或者 conda install python-graphviz
pip install scikit-learn
注意在pycharm中的安装包sklearn不是我们需要的,我们需要的是scikit-learn
1. 决策树
1.1.1 概念
- 根节点:最开始的节点,无进有出。
- 中间节点:有进有出的节点。
- 叶子结点:有进无出的节点。
- 子节点和父节点:两个节点相连,上面的是父节点,下面的是子节点。
1.1.2 sklearn 中的决策树
函数名 | 含义 |
---|---|
tree.DecisionTreeClassifier() | 分类树 |
tree.DecisionTreeRegressor() | 回归树 |
tree.export_graphviz () | 将生成的决策树导出为DOT格式,画图专用 |
tree.ExtraTreeClassifier() | 高随机版本的分类树 |
tree.ExtraTreeRegressor() | 高随机版本的回归树 |
1.1.3 使用sklearn.tree 的基本使用
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import graphviz
'''
加载数据 和 分割数据
'''
wine = load_wine()
# ------ 将数据组成一张表 --------
# pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# --- 分割数据
# target_size 测试集占的比例
# 返回值顺序固定,要固定返回值顺序
xtrain,xtest,ytrain,ytest = train_test_split(wine.data,wine.target,test_size=0.3)
'''
开始训练【调库核心】
'''
clf = tree.DecisionTreeClassifier(criterion="entropy") # 实例化
clf = clf.fit(xtrain,ytrain) # 用训练集数据训练模型
res = clf.score(xtest,ytest) # 测试模型
print(res)
'''
绘制树模型
'''
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
# 方法1 : gr.render(view==True) 报错
dot_data = tree.export_graphviz(clf,feature_names= feature_name,class_names=["琴酒","雪梨","贝尔摩德"],filled=True,rounded=True)
gr = graphviz.Source(dot_data)
# gr.render(view==True)
# 方法2 :使用matplotlib库,只能在控制台运行才会出图,这里我就先保存在根目录峡的img下
fig = plt.figure()
tree.plot_tree(clf,feature_names=feature_name,class_names=["琴酒","雪梨","贝尔摩德"],filled=True,rounded=True)
fig.savefig(os.path.join('img','tree.png'))
img = mpimg.imread(os.path.join('img','tree.png'))
plt.imshow(img)
在pycharm上训练完显示树状图上(gr.render(view=True)),可能会报错,原因可能是库没有安装正确,使用conda安装:
conda install python-graphviz
决策树可视化如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNvasL48-1678285722590)(tree.png)]
节点中,【第一个】参数代表分类要求; 【第二个】参数代表分类后的信息熵; 【第三个】参数代表此节点包含的样本数; 【第四个】参数代表此节点包含的样本数不同类别的样本数; 【第五个】代表此节点中样本最多的类别。
[*zip(feature_name,clf.feature_importances_)] # 显示其中不同属性所占的重要程度
1.1.4 重要参数说明
①计算不纯度的计算方法参数
- criterion:计算方法
【“entropy”】:信息熵 ;【“gini”】:基尼系数【默认参数】
clf = tree.DecisionTreeClassifier(criterion="entropy")
②防止过拟合的一组参数。
- spiltter:分支依据
【“best”】:侧重将重要的特征作为分枝依据 【“random”】:随机分枝。
- random_state 随机的整数。
clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30 #
,splitter="random" # "best" 侧重更重要的特征进行分支;“random” 分支时随机
)
③剪枝的相关参数
- max_depth : 最大树深。
超过最大深度的数值全部剪掉,建议参数从3开始。【 高样本以及低样本量时非常有效且必要 】
- min_samples_leaf:最小子节点样本数。
每个分支的子节点所包含的训练样本数最小个数。
- min_samples_split:最小父节点分割样本数。
节点中最少包含样本数才能被分割。
- max_features:最大特征个数
限制分支时考虑的特征个数,与剪枝类似。不推荐使用,如果希望通过降维的方式解决过拟合的问题,建议使用PCA,ICA或者特征选择模块的降维算法。
- min_impurity_decrease:信息增益阈值
信息增益小设定值时不会分支。