编程中的人工智能(下)

zhouchuer

2024-11-01 21:58:49

Algo. & Theory

前言

没有看过上一期最好看看。本篇接着上次继续讲决策树。

决策树算法

决策树算法能够计算数据的信息熵,并根据信息熵的减少帮你得出一个分类预测的判断逻辑

信息熵

熵能够体现事件的不确定性:

  1. 影响一件事的因素越,结果越不确定,则熵越
  2. 反之影响一件事的因素越,结果越确定,那么熵就越
  3. 熵可以通过复杂的数学公式计算出来。

创建模型

第一类:分类模型(适合离散数据)。

c = DecisionTreeClassifier (criterion = 'entropy')

第二类:回归模型(适合连续数据)。

c = DecisionTreeRegressor (criterion = 'entropy')

决策树模型的训练、测验、预测

决策树模型的训练、测验、预测方法和贝叶斯算法完全一致。即:

# 训练模型
c.fit(x_train, y_train)
# 测验模型
c.score(x_test, y_test)
# 分类预测
c.predict(t_word)

决策树过拟合

  1. 过拟合
  2. 判断过拟合
  3. 解决过拟合

过拟合

过拟合是决策树模型面临的常见问题,模型考虑过多因素时,容易导致过拟合。

判断过拟合

一般来说,当模型出现训练结果很好,但测试结果很差的情况时,说明模型发生了过拟合。注意两个条件必须同时满足。

列举一个:

c.score(x_train, y_train) # 结果:0.9
c.score(x_test, y_test) # 结果:0.4
# 发生过拟合

解决过拟合

想要解决程序的过拟合问题,我们可以限制决策树的宽度和高度。注意可以同时限制宽度和高度。

# 限制高度
c = DecisionTreeClassifier(criterion = 'entropy', max_depth = 高度)
# 限制宽度
c = DecisionTreeRegressor(max_leaf_nodes = 数量)

补充一个决策树可视化,不单独分框了。

# 绘制决策树
x = export_graphviz(c, out_file = 'tree.dot')
(graph, ) = pydot.graph_from_dot_file('tree.dot')
graph.write_png('tree.png')

画图

画图有如下方法:

  1. 图形种类:画提琴图;画柱形图。
  2. 图形设置:画多张图;设置图形大小。

画提琴图

我们可以使用 seaborn 库中的 violinplot 函数绘制提琴图。

# 格式
sns.violinplot(x = 结果, y = 因素, data = 数据)
# 代码
sns.violinplot(x = 'Species', y = 'Sepal.Length', data=df)

为了更好的看清结果,在使用提琴图时我们可以交换 xy 的参数。

画好图之后,可以使用 show 函数展示图像。

plt.show()
# 画小提琴图用 seaborn 库
# 展示图像使用 matplotlib.pyplot 库

画柱形图

我们可以使用 matplotlib.pyplot 库中的 barh 函数绘制柱形图。

# 格式
plt.barh(y,x)
# 代码
plt.barh(df.columns[0:4],c.feature_importances_)

除了 barh 外,我们也可以使用 bar 函数,两者格式相同,但是 xy 标签相反。

# 格式
plt.bar(x,y)
# 代码
plt.bar(df.columns[0:4],c.feature_importances_)

画多张图

想要画出多张图,我们可以使用 matplotlib.pyplot 库中的 subplot 函数。

# 格式
plt.subplot(行数, 列数, 位置)
# 代码
plt.subplot(2, 2, 1)

subplot 的位置从 1 开始。

设置图像大小

想要设置图像大小,可以使用 matplotlib.pyplot 库中的 figure 函数。

# 格式
plt.figure(figsize = 大小)
# 代码
plt.figure(figsize = (8, 8))

二值化处理

我们可以使用 sklearn 库中的 Binarizer 函数可以实现数据二值化处理。

# 格式
变量名 = Binarizer(threshold = 边界值)
# 代码
binary = Binarizer(threshold = 0)

threshold 参数可以控制转化的边界,边界值自身转化成 0

举例:

threshold = 2
表格: 转化前 转化后
0 0
1 0
2 0
3 1
\cdots 1
n 1

完成创建之后,还需要使用 fit_transform 对数据进行转化。

# 格式
数据 = 变量名.fit_transform(数据)
# 代码
df[['kills']] = binary.fit_transform (df[['kills']])

检测异常值

有时候,在人们统计、输入、整理数据的时候会遗漏、写错一些内容。这些被遗漏的内容被称作为异常值。其中由遗漏的空数据会被计算机识别成 Nan。对于这种异常值,我们可以直接删除。

在程序中,NaN 表示不确定一个值到底是几,在这种情况下它和自己不相等。

# 格式
# dataframe 元素 != dataframe 元素
# 代码
if df[i][j] != df[i][j]:
#   + 分支语句

下一期将介绍网页,敬请期待!