共计 14716 个字符,预计需要花费 37 分钟才能阅读完成。
机器学习算法(五):基于企鹅数据集的决策树分类预测
本我的项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc
1 逻决策树的介绍和利用
1.1 决策树的介绍
决策树是一种常见的分类模型,在金融风控、医疗辅助诊断等诸多行业具备较为宽泛的利用。决策树的核心思想是基于树结构对数据进行划分,这种思维是人类解决问题时的本能办法。例如在婚恋市场中,女方通常会先询问男方是否有房产,如果有房产再理解是否有车产,如果有车产再看是否有稳固工作……最初得出是否要深刻理解的判断。
次要利用:
因为决策树模型中自变量与因变量的非线性关系以及决策树简略的计算方法,使得它成为集成学习中最为宽泛应用的基模型。梯度晋升树 (GBDT),XGBoost 以及 LightGBM 等先进的集成模型 都采纳了决策树作为基模型,在广告计算、CTR 预估、金融风控等畛域大放异彩,成为当今与神经网络等量齐观的简单模型,更是数据挖掘较量中的常客。在新的钻研中,南京大学周志华传授提出一种多粒度级联森林模型,发明了一种全新的基于决策树的深度集成办法,为咱们提供了决策树倒退的另一种可能。
同时决策树在一些明确须要可解释性或者提取分类规定的场景中被广泛应用,而其余机器学习模型在这一点很难做到。例如在医疗辅助零碎中,为了不便业余人员发现错误,经常将决策树算法用于辅助病症检测。例如在一个预测哮喘患者的模型中,医生发现测试的许多高级模型的成果十分差。在他们运行了一个决策树模型后发现,算法认为激烈咳嗽的病人患哮喘的危险很小。但医生十分分明激烈咳嗽个别都会被立即查看医治,这意味着患有激烈咳嗽的哮喘病人都会马上失去收治。用于建模的数据认为这类病人危险很小,是因为所有这类病人都失去了及时医治,所以极少有人在此之后患病或死亡。
1.2 相干流程
- 理解 决策树 的理论知识
- 把握 决策树 的 sklearn 函数调用并将其使用在企鹅数据集的预测中
Part1 Demo 实际
- Step1: 库函数导入
- Step2: 模型训练
- Step3: 数据和模型可视化
- Step4: 模型预测
Part2 基于企鹅(penguins)数据集的决策树分类实际
- Step1: 库函数导入
- Step2: 数据读取 / 载入
- Step3: 数据信息简略查看
- Step4: 可视化形容
- Step5: 利用 决策树模型 在二分类上 进行训练和预测
- Step6: 利用 决策树模型 在三分类 (多分类) 上 进行训练和预测
3 算法实战
3.1Demo 实际
Step1: 库函数导入
## 根底函数库
import numpy as np
## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns
## 导入决策树模型函数
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
Step2: 训练模型
##Demo 演示 LogisticRegression 分类
## 结构数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 1, 0, 1, 0, 1])
## 调用决策树回归模型
tree_clf = DecisionTreeClassifier()
## 调用决策树模型拟合结构的数据集
tree_clf = tree_clf.fit(x_fearures, y_label)
Step3: 数据和模型可视化(须要用到 graphviz 可视化库)
## 可视化结构的数据样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()
## 可视化决策树
import graphviz
dot_data = tree.export_graphviz(tree_clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("pengunis")
'pengunis.pdf'
Step4: 模型预测
## 创立新样本
x_fearures_new1 = np.array([[0, -1]])
x_fearures_new2 = np.array([[2, 1]])
## 在训练集和测试集上散布利用训练好的模型进行预测
y_label_new1_predict = tree_clf.predict(x_fearures_new1)
y_label_new2_predict = tree_clf.predict(x_fearures_new2)
print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)
The New point 1 predict class:
[1]
The New point 2 predict class:
[0]
3.2 基于 penguins_raw 数据集的决策树实战
在实际的最开始,咱们首先须要导入一些根底的函数库包含:numpy(Python 进行科学计算的根底软件包),pandas(pandas 是一种疾速,弱小,灵便且易于应用的开源数据分析和解决工具),matplotlib 和 seaborn 绘图。
# 下载须要用到的数据集
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv
--2023-03-22 16:21:32-- https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/6tree/penguins_raw.csv
正在解析主机 tianchi-media.oss-cn-beijing.aliyuncs.com (tianchi-media.oss-cn-beijing.aliyuncs.com)... 49.7.22.39
正在连接 tianchi-media.oss-cn-beijing.aliyuncs.com (tianchi-media.oss-cn-beijing.aliyuncs.com)|49.7.22.39|:443... 已连贯。已收回 HTTP 申请,正在期待回应... 200 OK
长度:53098 (52K)
正在保留至:“penguins_raw.csv”penguins_raw.csv 100%[===================>] 51.85K --.-KB/s in 0.04s
2023-03-22 16:21:33 (1.23 MB/s) - 已保留“penguins_raw.csv”[53098/53098])
Step1:函数库导入
## 根底函数库
import numpy as np
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns
本次咱们抉择企鹅数据(palmerpenguins)进行办法的尝试训练,该数据集一共蕴含 8 个变量,其中 7 个特色变量,1 个指标分类变量。共有 150 个样本,指标变量为 企鹅的类别 其都属于企鹅类的三个亚属,别离是(Adélie, Chinstrap and Gentoo)。蕴含的三种种企鹅的七个特色,别离是所在岛屿,嘴巴长度,嘴巴深度,脚蹼长度,身材体积,性别以及年龄。
变量 | 形容 |
---|---|
species | a factor denoting penguin species |
island | a factor denoting island in Palmer Archipelago, Antarctica |
bill_length_mm | a number denoting bill length |
bill_depth_mm | a number denoting bill depth |
flipper_length_mm | an integer denoting flipper length |
body_mass_g | an integer denoting body mass |
sex | a factor denoting penguin sex |
year | an integer denoting the study year |
Step2:数据读取 / 载入
## 咱们利用 Pandas 自带的 read_csv 函数读取并转化为 DataFrame 格局
data = pd.read_csv('./penguins_raw.csv')
## 为了不便咱们仅选取四个简略的特色,有趣味的同学能够钻研下其余特色的含意以及应用办法
data = data[['Species','Culmen Length (mm)','Culmen Depth (mm)',
'Flipper Length (mm)','Body Mass (g)']]
Step3:数据信息简略查看
## 利用.info()查看数据的整体信息
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 344 entries, 0 to 343
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Species 344 non-null object
1 Culmen Length (mm) 342 non-null float64
2 Culmen Depth (mm) 342 non-null float64
3 Flipper Length (mm) 342 non-null float64
4 Body Mass (g) 342 non-null float64
dtypes: float64(4), object(1)
memory usage: 13.6+ KB
## 进行简略的数据查看,咱们能够利用 .head() 头部.tail()尾部
data.head()
<div>
<style scoped>
.dataframe tbody tr th:only-of-type {vertical-align: middle;}
.dataframe tbody tr th {vertical-align: top;}
.dataframe thead th {text-align: right;}
</style>
Species | Culmen Length (mm) | Culmen Depth (mm) | Flipper Length (mm) | Body Mass (g) | |
---|---|---|---|---|---|
0 | Adelie Penguin (Pygoscelis adeliae) | 39.1 | 18.7 | 181.0 | 3750.0 |
1 | Adelie Penguin (Pygoscelis adeliae) | 39.5 | 17.4 | 186.0 | 3800.0 |
2 | Adelie Penguin (Pygoscelis adeliae) | 40.3 | 18.0 | 195.0 | 3250.0 |
3 | Adelie Penguin (Pygoscelis adeliae) | NaN | NaN | NaN | NaN |
4 | Adelie Penguin (Pygoscelis adeliae) | 36.7 | 19.3 | 193.0 | 3450.0 |
</div>
这里咱们发现数据集中存在 NaN,个别的咱们认为 NaN 在数据集中代表了缺失值,可能是数据采集或解决时产生的一种谬误。这里咱们采纳 - 1 将缺失值进行填补,还有其余例如“中位数填补、平均数填补”的缺失值解决办法有趣味的同学也能够尝试。
data = data.fillna(-1)
data.tail()
<div>
<style scoped>
.dataframe tbody tr th:only-of-type {vertical-align: middle;}
.dataframe tbody tr th {vertical-align: top;}
.dataframe thead th {text-align: right;}
</style>
Species | Culmen Length (mm) | Culmen Depth (mm) | Flipper Length (mm) | Body Mass (g) | |
---|---|---|---|---|---|
339 | Chinstrap penguin (Pygoscelis antarctica) | 55.8 | 19.8 | 207.0 | 4000.0 |
340 | Chinstrap penguin (Pygoscelis antarctica) | 43.5 | 18.1 | 202.0 | 3400.0 |
341 | Chinstrap penguin (Pygoscelis antarctica) | 49.6 | 18.2 | 193.0 | 3775.0 |
342 | Chinstrap penguin (Pygoscelis antarctica) | 50.8 | 19.0 | 210.0 | 4100.0 |
343 | Chinstrap penguin (Pygoscelis antarctica) | 50.2 | 18.7 | 198.0 | 3775.0 |
</div>
## 其对应的类别标签为 'Adelie Penguin', 'Gentoo penguin', 'Chinstrap penguin' 三种不同企鹅的类别。data['Species'].unique()
array(['Adelie Penguin (Pygoscelis adeliae)',
'Gentoo penguin (Pygoscelis papua)',
'Chinstrap penguin (Pygoscelis antarctica)'], dtype=object)
## 利用 value_counts 函数查看每个类别数量
pd.Series(data['Species']).value_counts()
Adelie Penguin (Pygoscelis adeliae) 152
Gentoo penguin (Pygoscelis papua) 124
Chinstrap penguin (Pygoscelis antarctica) 68
Name: Species, dtype: int64
## 对于特色进行一些统计形容
data.describe()
<div>
<style scoped>
.dataframe tbody tr th:only-of-type {vertical-align: middle;}
.dataframe tbody tr th {vertical-align: top;}
.dataframe thead th {text-align: right;}
</style>
Culmen Length (mm) | Culmen Depth (mm) | Flipper Length (mm) | Body Mass (g) | |
---|---|---|---|---|
count | 344.000000 | 344.000000 | 344.000000 | 344.000000 |
mean | 43.660756 | 17.045640 | 199.741279 | 4177.319767 |
std | 6.428957 | 2.405614 | 20.806759 | 861.263227 |
min | -1.000000 | -1.000000 | -1.000000 | -1.000000 |
25% | 39.200000 | 15.500000 | 190.000000 | 3550.000000 |
50% | 44.250000 | 17.300000 | 197.000000 | 4025.000000 |
75% | 48.500000 | 18.700000 | 213.000000 | 4750.000000 |
max | 59.600000 | 21.500000 | 231.000000 | 6300.000000 |
</div>
Step4: 可视化形容
## 特色与标签组合的散点可视化
sns.pairplot(data=data, diag_kind='hist', hue= 'Species')
plt.show()
从上图能够发现,在 2D 状况下不同的特色组合对于不同类别的企鹅的散点散布,以及大略的辨别能力。Culmen Lenth 与其余特色的组合散点的重合较少,所以对于数据集的划分能力最好。
咱们发现
'''为了不便咱们将标签转化为数字'Adelie Penguin (Pygoscelis adeliae)'------0'Gentoo penguin (Pygoscelis papua)'------1'Chinstrap penguin (Pygoscelis antarctica) ------2 '''
def trans(x):
if x == data['Species'].unique()[0]:
return 0
if x == data['Species'].unique()[1]:
return 1
if x == data['Species'].unique()[2]:
return 2
data['Species'] = data['Species'].apply(trans)
for col in data.columns:
if col != 'Species':
sns.boxplot(x='Species', y=col, saturation=0.5, palette='pastel', data=data)
plt.title(col)
plt.show()
利用箱型图咱们也能够失去不同类别在不同特色上的散布差别状况。
# 选取其前三个特色绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
data_class0 = data[data['Species']==0].values
data_class1 = data[data['Species']==1].values
data_class2 = data[data['Species']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(data_class0[:,0], data_class0[:,1], data_class0[:,2],label=data['Species'].unique()[0])
ax.scatter(data_class1[:,0], data_class1[:,1], data_class1[:,2],label=data['Species'].unique()[1])
ax.scatter(data_class2[:,0], data_class2[:,1], data_class2[:,2],label=data['Species'].unique()[2])
plt.legend()
plt.show()
Step5: 利用 决策树模型 在二分类上 进行训练和预测
## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。from sklearn.model_selection import train_test_split
## 抉择其类别为 0 和 1 的样本(不包含类别为 2 的样本)data_target_part = data[data['Species'].isin([0,1])][['Species']]
data_features_part = data[data['Species'].isin([0,1])][['Culmen Length (mm)','Culmen Depth (mm)',
'Flipper Length (mm)','Body Mass (g)']]
## 测试集大小为 20%,80%/20% 分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)
## 从 sklearn 中导入决策树模型
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
## 定义 决策树模型
clf = DecisionTreeClassifier(criterion='entropy')
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy',
max_depth=None, max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort='deprecated',
random_state=None, splitter='best')
## 可视化
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("penguins")
'penguins.pdf'
## 在训练集和测试集上散布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics
## 利用 accuracy(准确度)【预测正确的样本数目占总预测样本数目标比例】评估模型成果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
## 查看混同矩阵 (预测值和实在值的各类状况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)
# 利用热力求对于后果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
The accuracy of the Logistic Regression is: 0.9954545454545455
The accuracy of the Logistic Regression is: 1.0
The confusion matrix result:
[[31 0]
[0 25]]
咱们能够发现其准确度为 1,代表所有的样本都预测正确了。
Step6: 利用 决策树模型 在三分类 (多分类) 上 进行训练和预测
## 测试集大小为 20%,80%/20% 分
x_train, x_test, y_train, y_test = train_test_split(data[['Culmen Length (mm)','Culmen Depth (mm)',
'Flipper Length (mm)','Body Mass (g)']], data[['Species']], test_size = 0.2, random_state = 2020)
## 定义 决策树模型
clf = DecisionTreeClassifier()
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',
max_depth=None, max_features=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, presort='deprecated',
random_state=None, splitter='best')
## 在训练集和测试集上散布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
## 因为决策树模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)), 所有咱们能够利用 predict_proba 函数预测其概率
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)
print('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为 0 类的概率,第二列代表预测为 1 类的概率,第三列代表预测为 2 类的概率。## 利用 accuracy(准确度)【预测正确的样本数目占总预测样本数目标比例】评估模型成果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
The test predict Probability of each class:
[[0. 0. 1.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 0. 1.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 0. 1.]
[0. 0. 1.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[0. 0. 1.]
[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[1. 0. 0.]]
The accuracy of the Logistic Regression is: 0.9963636363636363
The accuracy of the Logistic Regression is: 0.9565217391304348
## 查看混同矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)
# 利用热力求对于后果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
The confusion matrix result:
[[30 1 0]
[0 23 0]
[2 0 13]]
3.3 重要知识点
3.3.1 决策树构建的伪代码
输出:训练集 D ={($x_1$,$y_1$),($x_2$,$y_2$),….,($x_m$,$y_m$)};
特色集 A ={$a_1$,$a_2$,….,$a_d$}
输入:以 node 为根节点的一颗决策树
过程:函数 TreeGenerate($D$,$A$)
- 生成节点 node
- $if$ $D$ 中样本全书属于同一类别 $C$ $then$:
- —- 将 node 标记为 $C$ 类叶节点;$return$
- $if$ $A$ = 空集 OR D 中样本在 $A$ 上的取值雷同 $then$:
- —- 将 node 标记为叶节点,其类别标记为 $D$ 中样本数最多的类;$return$
- 从 $A$ 中抉择最优划分属性 $a_*$;
- $for$ $a_*$ 的每一个值 $a_*^v$ $do$:
- —- 为 node 生成一个分支,令 $D_v$ 示意 $D$ 中在 $a_*$ 上取值为 $a_*^v$ 的样本子集;
- —-$if$ $D_v$ 为空 $then$:
- ——– 将分支节点标记为叶节点,其类别标记为 $D$ 中样本最多的类;$then$
- —-$else$:
- ——– 以 TreeGenerate($D_v$,$A${$a_*$})为分支节点
决策树的构建过程是一个递归过程。函数存在三种返回状态:(1)以后节点蕴含的样本全副属于同一类别,无需持续划分;(2)以后属性集为空或者所有样本在某个属性上的取值雷同,无奈持续划分;(3)以后节点蕴含的样本汇合为空,无奈划分。
3.3.2 划分抉择
从上述伪代码中咱们发现,决策树的关键在于 line6. 从 $A$ 中抉择最优划分属性 $𝑎_∗$,个别咱们心愿决策树每次划分节点中蕴含的样本尽量属于同一类别,也就是节点的“纯度”更高。
3.3.2.1 信息增益
信息熵是一种掂量数据凌乱水平的指标,信息熵越小,则数据的“纯度”越高
$\operatorname{Ent}(D)=-\sum_{k=1}^{|\mathcal{Y}|} p_{k} \log _{2} p_{k}$
其中 $p_k$ 代表了第 $k$ 类样本在 $D$ 中占有的比例。
假如离散属性 $a$ 有 $V$ 个可能的取值{$a^1$,$a^2$,….,$a^V$},若应用 $a$ 对数据集 $D$ 进行划分,则产生 $D$ 个分支节点,记为 $D^v$。则应用 $a$ 对数据集进行划分所带来的信息增益被定义为:
$\operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right)$
个别的信息增益越大,则意味着应用特色 $a$ 来进行划分的成果越好。
3.3.2.2 基尼指数
$\begin{aligned}
\operatorname{Gini}(D) &=\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \
&=1-\sum_{k=1}^{|\mathcal{Y}|} p_{k}^{2}
\end{aligned}$
基尼指数反映了从数据集 $D$ 中随机抽取两个的类别标记不统一的概率。
$\operatorname{Gini}\operatorname{index}(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right)$
应用特色 $a$ 对数据集 $D$ 划分的基尼指数定义为上。
3.3.3 重要参数
Criterion 这个参数正是用来决定模型特征选择的计算方法的。sklearn 提供了两种抉择:
- 输出”entropy“,应用信息熵(Entropy)
- 输出”gini“,应用基尼系数(Gini Impurity)
random_state 用来设置分枝中的随机模式的参数,默认 None,在高维度时随机性会体现更显著。splitter 也是用来管制决策树中的随机选项的,有两种输出值,输出”best”,决策树在分枝时尽管随机,然而还是会优先选择更重要的特色进行分枝(重要性能够通过属性 feature_importances_查看),输出“random”,决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而升高对训练集的拟合。
限度树的最大深度,超过设定深度的树枝全副剪掉。这是用得最宽泛的剪枝参数,在高维度低样本量时十分无效。决策树多成长一层,对样本量的需要会增加一倍,所以限度树深度可能无效地限度过拟合。
min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须蕴含至多 min_samples_leaf 个训练样本,否则分枝就不会产生,或者,分枝会朝着满足每个子节点都蕴含 min_samples_leaf 个样本的方向去产生。个别搭配 max_depth 应用,在回归树中有神奇的成果,能够让模型变得更加平滑。这个参数的数量设置得太小会引起过拟合,设置得太大就会阻止模型学习数据。
4. 总结
决策树的次要长处:
- 具备很好的解释性,模型能够生成能够了解的规定。
- 能够发现特色的重要水平。
- 模型的计算复杂度较低。
决策树的次要毛病:
- 模型容易过拟合,须要采纳减枝技术解决。
- 不能很好利用连续型特色。
- 预测能力无限,无奈达到其余强监督模型成果。
- 方差较高,数据分布的轻微扭转很容易造成树结构齐全不同。
本我的项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc
参考链接:https://tianchi.aliyun.com/course/278/3422
自己最近打算整合 ML、DRL、NLP 等相干畛域的体系化我的项目课程,不便入门同学疾速把握相干常识。申明:局部我的项目为网络经典我的项目不便大家疾速学习,后续会一直削减实战环节(较量、论文、事实利用等)。
- 对于机器学习这块布局为:根底入门机器学习算法 —> 简略我的项目实战 —> 数据建模较量 —–> 相干事实中利用场景问题解决。一条路线帮忙大家学习,疾速实战。
- 对于深度强化学习这块布局为:根底单智能算法教学(gym 环境为主)—-> 支流多智能算法教学(gym 环境为主)—-> 单智能多智能题实战(论文复现偏业务如:无人机优化调度、电力资源调度等我的项目利用)
- 自然语言解决相干布局:除了单点算法技术外,次要围绕常识图谱构建进行:信息抽取相干技术(含智能标注)—> 常识交融 —-> 常识推理 —-> 图谱利用
上述对于你把握后的期许:
- 对于 ML,心愿你后续能够乱杀数学建模相干较量(加入就获奖保底,top 还是难的须要钻研)
- 能够理论解决事实中一些优化调度问题,而非停留在 gym 环境下的一些游戏 demo 玩玩。(更深层次可能须要本人钻研了,难度还是很大的)
- 把握可常识图谱全流程构建其中各个重要环节算法,蕴含图数据库相干常识。
这三块畛域耦合状况比拟大,后续会通过比方:搜寻举荐零碎整个我的项目进行耦合,各项算法都会耦合在其中。举例:常识图谱就会用到(图算法、NLP、ML 相干算法),搜寻举荐零碎(除了该畛域召回粗排精排重排混排等算法外,还有强化学习、常识图谱等耦合在其中)。饼画的有点大,前面缓缓实现。