浅学一下,总结一下笔记,证明自己学过了 (XD)
机器学习使计算机能够从研究数据和统计信息中学习。
机器学习是迈向人工智能(AI)方向的其中一步。
机器学习是一种程序,可以分析数据并学习预测结果。
先上思维导图!
6.1 正态数据分布(Normal Data Distribution)
9.1 多项式回归(Polynomial Regression)
10.1 多元回归(Multiple Regression)
13.2.1 首先,导入所需的模块,并使用 pandas 读取数据集
13.2.4 现在,我们可以创建实际的决策树,使其适合我们的细节,然后在计算机上保存一个 .png 文件
第一节 机器学习 - 入门
1.1 从何处开始?
在本教程中,我们将回到数学并研究统计学,以及如何根据数据集计算重要数值。
我们还将学习如何使用各种 Python 模块来获得所需的答案。
并且,我们将学习如何根据所学知识编写能够预测结果的函数。
1.2 数据集
在计算机中,数据集指的是任何数据集合。它可以是从数组到完整数据库的任何内容。
一个数组的例子:
[99,86,87,88,111,86,103,87,94,78,77,85,86]
一个数据库的例子:
Carname | Color | Age | Speed | AutoPass |
---|---|---|---|---|
BMW | red | 5 | 99 | Y |
Volvo | black | 7 | 86 | Y |
VW | gray | 8 | 87 | N |
VW | white | 7 | 88 | Y |
Ford | white | 2 | 111 | Y |
VW | white | 17 | 86 | Y |
Tesla | red | 2 | 103 | Y |
BMW | black | 9 | 87 | Y |
Volvo | gray | 4 | 94 | N |
Ford | white | 11 | 78 | N |
Toyota | gray | 12 | 77 | N |
VW | white | 9 | 85 | N |
Toyota | blue | 6 | 86 | Y |
通过查看数组,我们可以猜测平均值可能约为 80 或 90,并且我们还可以确定最大值和最小值,但是我们还能做什么?
通过查看数据库,我们可以看到最受欢迎的颜色是白色,最老的车龄是 17 年,但是如果仅通过查看其他值就可以预测汽车是否具有 AutoPass,该怎么办?
这就是机器学习的目的!分析数据并预测结果!
在机器学习中,通常使用非常大的数据集。在本教程中,我们会尝试让您尽可能容易地理解机器学习的不同概念,并将使用一些易于理解的小型数据集。
1.3 数据类型
如需分析数据,了解我们要处理的数据类型非常重要。
我们可以将数据类型分为三种主要类别:
- 数值(Numerical)
- 分类(Categorical)
- 序数(Ordinal)
数值数据是数字,可以分为两种数值类别:
离散数据(Discrete Data)
- 限制为整数的数字。例如:经过的汽车数量。
连续数据(Continuous Data)
- 具有无限值的数字。例如:一件商品的价格或一件商品的大小。
分类数据是无法相互度量的值。例如:颜色值或任何 yes/no 值。
序数数据类似于分类数据,但可以相互度量。示例:A 优于 B 的学校成绩,依此类推。
通过了解数据源的数据类型,您就能够知道在分析数据时使用何种技术。
第二节 机器学习 - 平均中位数模式
2.1 均值、中值和众数
从一组数字中我们可以学到什么?
在机器学习(和数学)中,通常存在三中我们感兴趣的值:
- 均值(Mean) - 平均值
- 中值(Median) - 中点值,又称中位数
- 众数(Mode) - 最常见的值
例如:我们已经登记了 13 辆车的速度:
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
什么是平均,中间或最常见的速度值?
2.2 均值
均值就是平均值。
要计算平均值,请找到所有值的总和,然后将总和除以值的数量:
(99+86+87+88+111+86+103+87+94+78+77+85+86) / 13 = 89.77
NumPy 模块拥有用于此目的的方法:
实例:请使用 NumPy mean()
方法确定平均速度
import numpy
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = numpy.mean(speed)
print(x)
结果:
2.3 中值
中值是对所有值进行排序后的中间值:
77, 78, 85, 86, 86, 86, 87, 87, 88, 94, 99, 103, 111
在找到中位数之前,对数字进行排序很重要。
NumPy 模块拥有用于此目的的方法:
实例:请使用 NumPy median()
方法找到中间值
import numpy
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = numpy.median(speed)
print(x)
结果:
如果中间有两个数字,则将这些数字之和除以 2。
77, 78, 85, 86, 86, 86, 87, 87, 94, 98, 99, 103 (86 + 87) / 2 = 86.5
实例:使用 NumPy 模块计算中值
import numpy
speed = [99,86,87,88,86,103,87,94,78,77,85,86]
x = numpy.median(speed)
print(x)
结果:
2.4 众数
众值是出现次数最多的值:
99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86 = 86
SciPy 模块拥有用于此目的的方法:
实例:请使用 SciPy mode()
方法查找出现次数最多的数字
from scipy import stats
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = stats.mode(speed)
print(x)
结果:
2.5 章节总结
均值、中值和众数是机器学习中经常使用的技术,因此了解它们背后的概念很重要。
第三节 机器学习 - 标准差
3.1 什么是标准差?
标准差(Standard Deviation,又常称均方差)是一个数字,描述值的离散程度。
低标准偏差表示大多数数字接近均值(平均值)。
高标准偏差表示这些值分布在更宽的范围内。
例如:这次我们已经登记了 7 辆车的速度:
speed = [86,87,88,86,87,85,86]
标准差是:0.9
意味着大多数值在平均值的 0.9 范围内,即 86.4。
让我们对范围更广的数字集合进行处理:
speed = [32,111,138,28,59,77,97]
标准差是:37.85
这意味着大多数值都在平均值(平均值为 77.4)的 37.85 范围内。
如您所见,较高的标准偏差表示这些值分布在较宽的范围内。
NumPy 模块有一种计算标准差的方法:
实例:请使用 NumPy std()
方法查找标准差
import numpy
speed = [86,87,88,86,87,85,86]
x = numpy.std(speed)
print(x)
结果:
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.std(speed)
print(x)
结果:
3.2 方差
方差是另一种数字,指示值的分散程度。
实际上,如果采用方差的平方根,则会得到标准差!
或反之,如果将标准偏差乘以自身,则会得到方差!
如需计算方差,您必须执行以下操作:
1. 求均值:
(32+111+138+28+59+77+97) / 7 = 77.4
2. 对于每个值:找到与平均值的差:
32 - 77.4 = -45.4 111 - 77.4 = 33.6 138 - 77.4 = 60.6 28 - 77.4 = -49.4 59 - 77.4 = -18.4 77 - 77.4 = - 0.4 97 - 77.4 = 19.6
3. 对于每个差异:找到平方值:
(-45.4)2 = 2061.16 (33.6)2 = 1128.96 (60.6)2 = 3672.36 (-49.4)2 = 2440.36 (-18.4)2 = 338.56 (- 0.4)2 = 0.16 (19.6)2 = 384.16
4. 方差是这些平方差的平均值:
(2061.16+1128.96+3672.36+2440.36+338.56+0.16+384.16) / 7 = 1432.2
幸运的是,NumPy 有一种计算方差的方法:
实例:使用 NumPy var()
方法确定方差
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.var(speed)
print(x)
结果:
3.3 标准差
如我们所知,计算标准差的公式是方差的平方根:
√ 1432.25 = 37.85
或者,如上例所示,使用 NumPy 计算标准差:
实例:请使用 NumPy std() 方法查找标准差
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.std(speed)
print(x)
结果:
3.4 符号
标准差通常用 Sigma 符号表示:σ
方差通常由 Sigma Square 符号 σ2 表示
第四节 机器学习 - 百分位数
4.1 什么是百分位数?
统计学中使用百分位数(Percentiles)为您提供一个数字,该数字描述了给定百分比值小于的值。
例如:假设我们有一个数组,包含住在一条街上的人的年龄。
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
什么是 75 百分位数?答案是 43,这意味着 75% 的人是 43 岁或以下。
NumPy 模块有一种用于找到指定百分位数的方法:
实例:使用 NumPy percentile()
方法查找百分位数
import numpy
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
x = numpy.percentile(ages, 75)
print(x)
结果:
实例:90% 的人口年龄是多少岁?
import numpy
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
x = numpy.percentile(ages, 90)
print(x)
结果:
第五节 机器学习 - 数据分布
5.1 数据分布(Data Distribution)
在本教程稍早之前,我们仅在例子中使用了非常少量的数据,目的是为了了解不同的概念。
在现实世界中,数据集要大得多,但是至少在项目的早期阶段,很难收集现实世界的数据。
5.1.1 我们如何获得大数据集?
为了创建用于测试的大数据集,我们使用 Python 模块 NumPy,该模块附带了许多创建任意大小的随机数据集的方法。
实例:创建一个包含 250 个介于 0 到 5 之间的随机浮点数的数组
import numpy
x = numpy.random.uniform(0.0, 5.0, 250)
print(x)
5.2 直方图
为了可视化数据集,我们可以对收集的数据绘制直方图。
我们将使用 Python 模块 Matplotlib 绘制直方图:
实例:绘制直方图
import numpy
import matplotlib.pyplot as plt
x = numpy.random.uniform(0.0, 5.0, 250)
plt.hist(x, 5)
plt.show()
5.2.1 直方图解释
我们使用上例中的数组绘制 5 条柱状图。
第一栏代表数组中有多少 0 到 1 之间的值。
第二栏代表有多少 1 到 2 之间的数值。
等等。
我们得到的结果是:
52 values are between 0 and 1 48 values are between 1 and 2 49 values are between 2 and 3 51 values are between 3 and 4 50 values are between 4 and 5
注释:数组值是随机数,不会在您的计算机上显示完全相同的结果。
5.3 大数据分布
包含 250 个值的数组被认为不是很大,但是现在您知道了如何创建一个随机值的集,并且通过更改参数,可以创建所需大小的数据集。
实例:创建一个具有 100000 个随机数的数组,并使用具有 100 栏的直方图显示它们
import numpy
import matplotlib.pyplot as plt
x = numpy.random.uniform(0.0, 5.0, 100000)
plt.hist(x, 100)
plt.show()
第六节 机器学习 - 正态数据分布
6.1 正态数据分布(Normal Data Distribution)
在上一章中,我们学习了如何创建给定大小且在两个给定值之间的完全随机数组。
在本章中,我们将学习如何创建一个将值集中在给定值周围的数组。
在概率论中,在数学家卡尔·弗里德里希·高斯(Carl Friedrich Gauss)提出了这种数据分布的公式之后,这种数据分布被称为正态数据分布或高斯数据分布。
实例:典型的正态数据分布
import numpy
import matplotlib.pyplot as plt
x = numpy.random.normal(2.0, 0.5, 100000)
plt.hist(x, 100)
plt.show()
结果:
注释:由于正态分布图具有钟形的特征形状,因此也称为钟形曲线。
6.1.1 直方图解释
我们使用 numpy.random.normal()
方法创建的数组(具有 100000 个值)绘制具有 100 栏的直方图。
我们指定平均值为 2.0,标准差为 0.5。
这意味着这些值应集中在 2.0 左右,并且很少与平均值偏离 0.5。
从直方图中可以看到,大多数值都在 1.0 到 3.0 之间,最高值大约是 2.0。
第七节 机器学习 - 散点图
7.1 散点图(Scatter Plot)
散点图是数据集中的每个值都由点表示的图。
Matplotlib 模块有一种绘制散点图的方法,它需要两个长度相同的数组,一个数组用于 x 轴的值,另一个数组用于 y 轴的值:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x 数组代表每辆汽车的年龄。
y 数组表示每个汽车的速度。
实例:请使用 scatter()
方法绘制散点图
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
结果:
7.1.1 散点图解释
x 轴表示车龄,y 轴表示速度。
从图中可以看到,两辆最快的汽车都使用了 2 年,最慢的汽车使用了 12 年。
注释:汽车似乎越新,驾驶速度就越快,但这可能是一个巧合,毕竟我们只注册了 13 辆汽车。
7.2 随机数据分布
在机器学习中,数据集可以包含成千上万甚至数百万个值。
测试算法时,您可能没有真实的数据,您可能必须使用随机生成的值。
正如我们在上一章中学到的那样,NumPy 模块可以帮助我们!
让我们创建两个数组:
它们都填充有来自正态数据分布的 1000 个随机数。
第一个数组的平均值设置为 5.0,标准差为 1.0。
第二个数组的平均值设置为 10.0,标准差为 2.0:
实例:创建 1000 个点的散点图,符合上述描述
import numpy
import matplotlib.pyplot as plt
x = numpy.random.normal(5.0, 1.0, 1000)
y = numpy.random.normal(10.0, 2.0, 1000)
plt.scatter(x, y)
plt.show()
结果:
7.2.1 散点图解释
我们可以看到,点集中在 x 轴上的值 5 和 y 轴上的 10 周围。
我们还可以看到,在 y 轴上扩散得比在 x 轴上更大。
第八节 机器学习 - 线性回归
当您尝试找到变量之间的关系时,会用到术语“回归”(regression)。
在机器学习和统计建模中,这种关系用于预测未来事件的结果。
8.1 线性回归
线性回归使用数据点之间的关系在所有数据点之间画一条直线。
这条线可以用来预测未来的值。
在机器学习中,预测未来非常重要。
8.1.1 工作原理 *
Python 提供了一些方法来查找数据点之间的关系并绘制线性回归线。我们将向您展示如何使用这些方法而不是通过数学公式。
在下面的示例中,x 轴表示车龄,y 轴表示速度。我们已经记录了 13 辆汽车通过收费站时的车龄和速度。让我们看看我们收集的数据是否可以用于线性回归:
实例 8-1-1:
首先绘制散点图:
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
结果:
实例 8-1-2:
导入 scipy
并绘制线性回归线:
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
结果:
8.1.2 例子解释
导入所需模块:
import matplotlib.pyplot as plt
from scipy import stats
创建表示 x 和 y 轴值的数组:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
执行一个方法,该方法返回线性回归的一些重要键值:
slope, intercept, r, p, std_err = stats.linregress(x, y)
创建一个使用 slope
和 intercept
值的函数返回新值。这个新值表示相应的 x 值将在 y 轴上放置的位置:
def myfunc(x):
return slope * x + intercept
通过函数运行 x 数组的每个值。这将产生一个新的数组,其中的 y 轴具有新值:
mymodel = list(map(myfunc, x))
绘制原始散点图:
plt.scatter(x, y)
绘制线性回归线:
plt.plot(x, mymodel)
显示图:
plt.show()
8.2 R-Squared
重要的是要知道 x 轴的值和 y 轴的值之间的关系有多好,如果没有关系,则线性回归不能用于预测任何东西。
该关系用一个称为 r 平方(r-squared)的值来度量。
r 平方值的范围是 0 到 1,其中 0 表示不相关,而 1 表示 100% 相关。
Python 和 Scipy 模块将为您计算该值,您所要做的就是将 x 和 y 值提供给它:
实例:验证我们上面的数据在线性回归中的拟合度如何?
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)
结果:
注释:结果 -0.76 表明存在某种关系,但不是完美的关系,但它表明我们可以在将来的预测中使用线性回归。
8.3 预测未来价值 *
现在,我们可以使用收集到的信息来预测未来的值。
例如:让我们尝试预测一辆拥有 10 年历史的汽车的速度。
为此,我们需要与上例中相同的 myfunc()
函数:
def myfunc(x):
return slope * x + intercept
实例:预测一辆有 10年车龄的汽车的速度
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
结果:
该例预测速度为 85.6,我们也可以从实例 8-3-2 图中读取:
注释:红线是我自己画的
8.4 糟糕的拟合度
让我们创建一个实例,其中的线性回归并不是预测未来值的最佳方法。
实例 8-6-1:x 和 y 轴的这些值将导致线性回归的拟合度非常差
import matplotlib.pyplot as plt
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
结果:
这个散点图看上去太散了,回归线完全没有契合啊,看看他的 R-Squared 值
实例 8.6.2 查看 R-Squared 值
import numpy
from scipy import stats
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
slope, intercept, r, p, std_err = stats.linregress(x, y)
print(r)
结果: 0.013 表示关系很差,并告诉我们该数据集不适合线性回归。
第九节 机器学习 - 多项式回归
9.1 多项式回归(Polynomial Regression)
如果您的数据点显然不适合线性回归(穿过数据点之间的直线),那么多项式回归可能是理想的选择。
像线性回归一样,多项式回归使用变量 x 和 y 之间的关系来找到绘制数据点线的最佳方法。
9.1.1 工作原理
Python 有一些方法可以找到数据点之间的关系并画出多项式回归线。我们将向您展示如何使用这些方法而不是通过数学公式。
在下面的例子中,我们注册了 18 辆经过特定收费站的汽车。
我们已经记录了汽车的速度和通过时间(小时)。
x 轴表示一天中的小时,y 轴表示速度:
实例 9-1-1 首先绘制散点图
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
结果:
实例 9-1-2 导入 numpy
和 matplotlib
,然后画出多项式回归线
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
结果:
9.1.2 例子解释
导入所需模块:
import numpy
import matplotlib.pyplot as plt
创建表示 x 和 y 轴值的数组:
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
NumPy 有一种方法可以让我们建立多项式模型:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
然后指定行的显示方式,我们从位置 1 开始,到位置 22 结束:
myline = numpy.linspace(1, 22, 100)
绘制原始散点图:
plt.scatter(x, y)
画出多项式回归线:
plt.plot(myline, mymodel(myline))
显示图表:
plt.show()
9.2 R-Squared
重要的是要知道 x 轴和 y 轴的值之间的关系有多好,如果没有关系,则多项式回归不能用于预测任何东西。
该关系用一个称为 r 平方( r-squared)的值来度量。
r 平方值的范围是 0 到 1,其中 0 表示不相关,而 1 表示 100% 相关。
Python 和 Sklearn 模块将为您计算该值,您所要做的就是将 x 和 y 数组输入:
实例 9-2-1:上述数据在多项式回归中的拟合度如何
import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
结果:
结果 0.94 表明存在很好的关系,我们可以在将来的预测中使用多项式回归。
9.3 预测未来值
现在,我们可以使用收集到的信息来预测未来的值。
例如:让我们尝试预测在晚上 17 点左右通过收费站的汽车的速度:
为此,我们需要与上面的实例相同的 mymodel 数组:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
实例 9-3-1:预测下午 17 点过车的速度
import numpy
from sklearn.metrics import r2_score
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)
结果:
该例预测速度为 88.87,我们拿出上面的多项式回归线图,画一下就可以知道
9.4 糟糕的拟合度
让我们创建一个实例,其中多项式回归不是预测未来值的最佳方法。
实例 9-4-1:x 和 y 轴的这些值会导致多项式回归的拟合度非常差的情况
import numpy
import matplotlib.pyplot as plt
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
结果:
散点分布太分散了,完全没有契合度!
实例 9-4-2:看看他的R-Squared值是多少
import numpy
from sklearn.metrics import r2_score
x = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
结果:
太低了,0.00995 表示关系很差,并告诉我们该数据集不适合多项式回归。
第十节 机器学习 - 多元回归
10.1 多元回归(Multiple Regression)
多元回归就像线性回归一样,但是具有多个独立值,这意味着我们试图基于两个或多个变量来预测一个值。
请看下面的数据集,其中包含了一些有关汽车的信息。
Car(品牌) | Model(型号) | Volume(排量) | Weight(重量) | CO2(CO2排放量) |
---|---|---|---|---|
Toyota | Aygo | 1000 | 790 | 99 |
Mitsubishi | Space Star | 1200 | 1160 | 95 |
Skoda | Citigo | 1000 | 929 | 95 |
Fiat | 500 | 900 | 865 | 90 |
Mini | Cooper | 1500 | 1140 | 105 |
VW | Up! | 1000 | 929 | 105 |
Skoda | Fabia | 1400 | 1109 | 90 |
Mercedes | A-Class | 1500 | 1365 | 92 |
Ford | Fiesta | 1500 | 1112 | 98 |
Audi | A1 | 1600 | 1150 | 99 |
Hyundai | I20 | 1100 | 980 | 99 |
Suzuki | Swift | 1300 | 990 | 101 |
Ford | Fiesta | 1000 | 1112 | 99 |
Honda | Civic | 1600 | 1252 | 94 |
Hundai | I30 | 1600 | 1326 | 97 |
Opel | Astra | 1600 | 1330 | 97 |
BMW | 1 | 1600 | 1365 | 99 |
Mazda | 3 | 2200 | 1280 | 104 |
Skoda | Rapid | 1600 | 1119 | 104 |
Ford | Focus | 2000 | 1328 | 105 |
Ford | Mondeo | 1600 | 1584 | 94 |
Opel | Insignia | 2000 | 1428 | 99 |
Mercedes | C-Class | 2100 | 1365 | 99 |
Skoda | Octavia | 1600 | 1415 | 99 |
Volvo | S60 | 2000 | 1415 | 99 |
Mercedes | CLA | 1500 | 1465 | 102 |
Audi | A4 | 2000 | 1490 | 104 |
Audi | A6 | 2000 | 1725 | 114 |
Volvo | V70 | 1600 | 1523 | 109 |
BMW | 5 | 2000 | 1705 | 114 |
Mercedes | E-Class | 2100 | 1605 | 115 |
Volvo | XC70 | 2000 | 1746 | 117 |
Ford | B-Max | 1600 | 1235 | 104 |
BMW | 2 | 1600 | 1390 | 108 |
Opel | Zafira | 1600 | 1405 | 109 |
Mercedes | SLK | 2500 | 1395 | 120 |
我们可以根据发动机排量的大小预测汽车的二氧化碳排放量,但是通过多元回归,我们可以引入更多变量,例如汽车的重量,以使预测更加准确。
10.1.1 工作原理 *
在 Python 中,我们拥有可以完成这项工作的模块。首先导入 Pandas 模块:
import pandas
Pandas 模块允许我们读取 csv 文件并返回一个 DataFrame 对象。
df = pandas.read_csv("cars.csv")
然后列出独立值,并将这个变量命名为 X。
将相关值放入名为 y 的变量中。
# 提示:通常,将独立值列表命名为大写 X,将相关值列表命名为小写 y。
X = df[['Weight', 'Volume']]
y = df['CO2']
我们将使用 sklearn 模块中的一些方法,因此我们也必须导入该模块:
from sklearn import linear_model
在 sklearn 模块中,我们将使用 LinearRegression()
方法创建一个线性回归对象。
该对象有一个名为 fit()
的方法,该方法将独立值和从属值作为参数,并用描述这种关系的数据填充回归对象:
regr = linear_model.LinearRegression()
regr.fit(X, y)
现在,我们有了一个回归对象,可以根据汽车的重量和排量预测 CO2 值:
# 预测重量为 2300kg、排量为 1300ccm 的汽车的二氧化碳排放量:
predictedCO2 = regr.predict([[2300, 1300]])
实例 10-1-1 完整实例
import pandas
from sklearn import linear_model
df = pandas.read_csv("cars.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
regr = linear_model.LinearRegression()
regr.fit(X, y)
# 预测重量为 2300kg、排量为 1300ccm 的汽车的二氧化碳排放量:
predictedCO2 = regr.predict([[2300, 1300]])
print(predictedCO2)
结果:
虽然有结果,但是有个小插曲
更改后的实例代码如下:
import pandas
from sklearn import linear_model
df = pandas.read_csv("cars.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
regr = linear_model.LinearRegression()
regr.fit(X.values, y.values)
# 预测重量为 2300kg、排量为 1300ccm 的汽车的二氧化碳排放量:
predictedCO2 = regr.predict([[2300, 1300]])
print(predictedCO2)
结果:
问题解决方案:
综上所述:我们预测,配备 1.3 升发动机,重量为 2300 千克的汽车,每行驶 1 公里,就会释放约 107 克二氧化碳。
10.2 系数
系数是描述与未知变量的关系的因子。
例如:如果 x
是变量,则 2x
是 x
的两倍。x
是未知变量,数字 2
是系数。
在这种情况下,我们可以要求重量相对于 CO2 的系数值,以及体积相对于 CO2 的系数值。我们得到的答案告诉我们,如果我们增加或减少其中一个独立值,将会发生什么。
实例 10-2-1 打印回归对象的系数值
import pandas
from sklearn import linear_model
df = pandas.read_csv("cars.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
regr = linear_model.LinearRegression()
regr.fit(X, y)
print(regr.coef_)
结果:
10.2.1 系数结果解释
结果数组表示重量和排量的系数值。
Weight: 0.00755095 Volume: 0.00780526
这些值告诉我们,如果重量增加 1g,则 CO2 排放量将增加 0.00755095g。
如果发动机尺寸(容积)增加 1 ccm,则 CO2 排放量将增加 0.00780526g。
我认为这是一个合理的猜测,但还是请进行测试!
我们已经预言过,如果一辆配备 1300ccm 发动机的汽车重 2300 千克,则二氧化碳排放量将约为 107 克。
如果我们增加 1000g 的重量会怎样?
实例 10-2-1-1:复制之前的例子,但是将车重从 2300 更改为 3300
import pandas
from sklearn import linear_model
df = pandas.read_csv("cars.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
regr = linear_model.LinearRegression()
regr.fit(X, y)
predictedCO2 = regr.predict([[3300, 1300]])
print(predictedCO2)
结果:
我们已经预测,配备 1.3 升发动机,重量为 3.3 吨的汽车,每行驶 1 公里,就会释放约 115 克二氧化碳。
这表明 0.00755095 的系数是正确的:
107.2087328 + (1000 * 0.00755095) = 114.75968
第十一节 机器学习 - 缩放
11.1 特征缩放(Scale Features)
当您的数据拥有不同的值,甚至使用不同的度量单位时,可能很难比较它们。与米相比,公斤是多少?或者海拔比较时间呢?
这个问题的答案是缩放。我们可以将数据缩放为易于比较的新值。
请看下表,它与我们在多元回归一章中使用的数据集相同,但是这次,Volume 列包含的单位是升,而不是 ccm(1.0 而不是 1000)。
Car | Model | Volume | Weight | CO2 |
---|---|---|---|---|
Toyota | Aygo | 1.0 | 790 | 99 |
Mitsubishi | Space Star | 1.2 | 1160 | 95 |
Skoda | Citigo | 1.0 | 929 | 95 |
Fiat | 500 | 0.9 | 865 | 90 |
Mini | Cooper | 1.5 | 1140 | 105 |
VW | Up! | 1.0 | 929 | 105 |
Skoda | Fabia | 1.4 | 1109 | 90 |
Mercedes | A-Class | 1.5 | 1365 | 92 |
Ford | Fiesta | 1.5 | 1112 | 98 |
Audi | A1 | 1.6 | 1150 | 99 |
Hyundai | I20 | 1.1 | 980 | 99 |
Suzuki | Swift | 1.3 | 990 | 101 |
Ford | Fiesta | 1.0 | 1112 | 99 |
Honda | Civic | 1.6 | 1252 | 94 |
Hundai | I30 | 1.6 | 1326 | 97 |
Opel | Astra | 1.6 | 1330 | 97 |
BMW | 1 | 1.6 | 1365 | 99 |
Mazda | 3 | 2.2 | 1280 | 104 |
Skoda | Rapid | 1.6 | 1119 | 104 |
Ford | Focus | 2.0 | 1328 | 105 |
Ford | Mondeo | 1.6 | 1584 | 94 |
Opel | Insignia | 2.0 | 1428 | 99 |
Mercedes | C-Class | 2.1 | 1365 | 99 |
Skoda | Octavia | 1.6 | 1415 | 99 |
Volvo | S60 | 2.0 | 1415 | 99 |
Mercedes | CLA | 1.5 | 1465 | 102 |
Audi | A4 | 2.0 | 1490 | 104 |
Audi | A6 | 2.0 | 1725 | 114 |
Volvo | V70 | 1.7 | 1523 | 109 |
BMW | 5 | 2.0 | 1705 | 114 |
Mercedes | E-Class | 2.1 | 1605 | 115 |
Volvo | XC70 | 2.0 | 1746 | 117 |
Ford | B-Max | 1.6 | 1235 | 104 |
BMW | 2 | 1.6 | 1390 | 108 |
Opel | Zafira | 1.6 | 1405 | 109 |
Mercedes | SLK | 2.5 | 1395 | 120 |
很难将排量 1.0 与车重 790 进行比较,但是如果将它们都缩放为可比较的值,我们可以很容易地看到一个值与另一个值相比有多少。
缩放数据有多种方法,在本教程中,我们将使用一种称为标准化(standardization)的方法。
标准化方法使用以下公式:
z = (x - u) / s
新值 =(原始值 - 平均值)/ 标准差
其中 z 是新值,x 是原始值,u 是平均值,s 是标准差。
如果从上述数据集中获取 weight 列,则第一个值为 790,缩放后的值为:
(790 - 1292.23) / 238.74 = -2.1
如果从上面的数据集中获取 volume 列,则第一个值为 1.0,缩放后的值为:
(1.0 - 1.61) / 0.38 = -1.59
现在,您可以将 -2.1 与 -1.59 相比较,而不是比较 790 与 1.0。
您不必手动执行此操作,Python sklearn 模块有一个名为 StandardScaler()
的方法,该方法返回带有转换数据集方法的 Scaler 对象。
实例 11-1-1 缩放 Weight 和 Volume 列中的所有值
import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("cars2.csv")
X = df[['Weight', 'Volume']]
scaledX = scale.fit_transform(X)
print(scaledX)
结果:
请注意,前两个值是 -2.1 和 -1.59,与我们的计算相对应
11.2 预测 CO2 值
第十节-多元回归 一章的任务是在仅知道汽车的重量和排量的情况下预测其排放的二氧化碳。
缩放数据集后,在预测值时必须使用缩放比例:
实例 11-2-1 预测一辆重 2300 公斤的 1.3 升汽车的二氧化碳排放量
import pandas
from sklearn import linear_model
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
df = pandas.read_csv("cars2.csv")
X = df[['Weight', 'Volume']]
y = df['CO2']
scaledX = scale.fit_transform(X.values)
regr = linear_model.LinearRegression()
regr.fit(scaledX, y)
scaled = scale.transform([[2300, 1.3]])
predictedCO2 = regr.predict([scaled[0]])
print(predictedCO2)
结果:
不知道咋回事,和官网的数据一样,但是官网得出107,我是106,我的是M2Max的Mac,不知道是不是苹果芯片或者是 sklearn 版本造成的?
第十二节 机器学习 - 训练/测试
12.1 评估模型
在机器学习中,我们创建模型来预测某些事件的结果,就像在上一章中当我们了解重量和发动机排量时,预测了汽车的二氧化碳排放量一样。
要衡量模型是否足够好,我们可以使用一种称为训练/测试的方法。
12.2 什么是训练/测试
训练/测试是一种测量模型准确性的方法。
之所以称为训练/测试,是因为我们将数据集分为两组:训练集和测试集。
80% 用于训练,20% 用于测试。
您可以使用训练集来训练模型。
您可以使用测试集来测试模型。
训练模型意味着创建模型。
测试模型意味着测试模型的准确性。
12.3 从数据集开始
从要测试的数据集开始。
我们的数据集展示了商店中的 100 位顾客及其购物习惯。
实例 12-3-1
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
# numpy.random.normal(平均值, 标准差, 数量)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
# 绘制原始散点图
plt.scatter(x, y)
plt.show()
结果:
x 轴表示购买前的分钟数。
y 轴表示在购买上花费的金额。
12.4 拆分训练/测试
训练集应该是原始数据的 80% 的随机选择。
测试集应该是剩余的 20%。
train_x = x[:80] train_y = y[:80] test_x = x[80:] test_y = y[80:]
12.5 显示训练集
显示与训练集相同的散点图:
实例 12-5-1 显示训练集
plt.scatter(train_x, train_y)
plt.show()
# 下面是完整代码
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
# plt.scatter(x, y)
# plt.show()
plt.scatter(train_x, train_y)
plt.show()
结果:
它看起来像原始数据集,因此似乎是一个合理的选择。
12.6 显示测试集
为了确保测试集不是完全不同,我们还要看一下测试集。
实例 12-6-1 显示测试集
plt.scatter(test_x, test_y)
plt.show()
# 下面是完整代码
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
# plt.scatter(x, y)
# plt.show()
# plt.scatter(train_x, train_y)
# plt.show()
plt.scatter(test_x, test_y)
plt.show()
结果:
测试集也看起来像原始数据集。
12.7 拟合数据集
数据集是什么样的?我认为最合适拟合的是多项式回归,因此让我们画一条多项式回归线。
要通过数据点画一条线,我们使用 matplotlib 模块的 plott()
方法:
实例 12-7-1 绘制穿过数据点的多项式回归线
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()
结果:
此结果可以支持我们对数据集拟合多项式回归的建议,即使如果我们尝试预测数据集之外的值会给我们带来一些奇怪的结果。例如:该行表明某位顾客在商店购物 6 分钟,会完成一笔价值 200 的购物。这可能是过拟合的迹象。
但是 R-squared 分数呢? R-squared score很好地指示了我的数据集对模型的拟合程度。
分数见下一章
12.8 R2
还记得 R2,也称为 R平方(R-squared)吗?
它测量 x 轴和 y 轴之间的关系,取值范围从 0 到 1,其中 0 表示没有关系,而 1 表示完全相关。
sklearn 模块有一个名为 rs_score()
的方法,该方法将帮助我们找到这种关系。
在这里,我们要衡量顾客在商店停留的时间与他们花费多少钱之间的关系。
实例 12-8-1 训练数据在多项式回归中的拟合度
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)
结果:0.799 显示关系不错。
12.9 引入测试集
现在,至少在训练数据方面,我们已经建立了一个不错的模型。
然后,我们要使用测试数据来测试模型,以检验是否给出相同的结果。
实例 12-9-1 使用测试数据时确定 R2 分数
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)
结果:0.809 表明该模型也适合测试集,我们确信可以使用该模型预测未来值。
12.10 预测值
现在我们已经确定我们的模型是不错的,可以开始预测新值了。
实例 12-10-1 如果购买客户在商店中停留 5 分钟,他/她将花费多少钱?
print(mymodel(5))
# 下面为完整代码
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
print(mymodel(5))
结果:22.88,把 12.7 拟合数据集 训练所得的回归图进行对比
似乎很对应!
第13节 机器学习 - 决策树
13.1 决策树(Decision Tree)
在本章中,我们将向您展示如何制作“决策树”。决策树是一种流程图,可以帮助您根据以前的经验进行决策。
在这个例子中,一个人将尝试决定他/她是否应该参加喜剧节目。
幸运的是,我们的例中人物每次在镇上举办喜剧节目时都进行注册,并注册一些关于喜剧演员的信息,并且还登记了他/她是否去过。
Age(年龄) | Experience(经验) | Rank(等级) | Nationality(国籍) | Go(去了吗) |
---|---|---|---|---|
36 | 10 | 9 | UK | NO |
42 | 12 | 4 | USA | NO |
23 | 4 | 6 | N | NO |
52 | 4 | 4 | USA | NO |
43 | 21 | 8 | USA | YES |
44 | 14 | 5 | UK | NO |
66 | 3 | 7 | N | YES |
35 | 14 | 9 | UK | YES |
52 | 13 | 7 | N | YES |
35 | 5 | 9 | N | YES |
24 | 3 | 5 | USA | NO |
18 | 3 | 7 | UK | YES |
45 | 9 | 9 | UK | YES |
上表:某观众参加的戏剧演出的演员信息
现在,基于此数据集,Python 可以创建决策树,这个决策树可用于决定是否值得参加任何新的演出。
13.2 工作原理
13.2.1 首先,导入所需的模块,并使用 pandas 读取数据集
实例 13-2-1-1 读取并打印数据集
import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)
结果:
13.2.2 如需制作决策树,所有数据都必须是数字
我们必须将非数字列 “Nationality” 和 “Go” 转换为数值。
Pandas 有一个
map()
方法,该方法接受字典,其中包含有关如何转换值的信息。
{'UK': 0, 'USA': 1, 'N': 2}
表示将值 'UK' 转换为 0,将 'USA' 转换为 1,将 'N' 转换为 2。
实例 13-2-2-1 将字符串值更改为数值
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)
结果:
13.2.3 然后,我们必须将特征列与目标列分开
特征列是我们尝试从中预测的列,目标列是具有我们尝试预测的值的列。
实例 13-2-3-1 设置X 为特征列,y 为目标列
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)
结果:
13.2.4 现在,我们可以创建实际的决策树,使其适合我们的细节,然后在计算机上保存一个 .png 文件
实例 13-2-4-1 创建一个决策树,将其另存为图像,然后显示该图像
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
13.2.5 完整代码 + 踩坑
import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
# 读取数据集
df = pandas.read_csv("shows.csv")
# 将数据转换为数字 将字符串值更改为数值
d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
# 将特征列与目标列分开
features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
# 创建实际的决策树 显示为图像
dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()
踩坑:生成图片过程中报错,并且生成的图片是空
Traceback (most recent call last):
File "/Users/liqianye/my-workspace/learning-items/JetAuto/pythonProject/venv/lib/python3.9/site-packages/pydotplus/graphviz.py", line 1918, in write
fobj.write(self.create(prog, format))
File "/Users/liqianye/my-workspace/learning-items/JetAuto/pythonProject/venv/lib/python3.9/site-packages/pydotplus/graphviz.py", line 1959, in create
raise InvocationException(
pydotplus.graphviz.InvocationException: GraphViz's executables not found
看了好多帖子,最后确定了
python编译报错无非三种,语法错误,没有装库,路径没对。w3cshool的语句语法错误应该不会犯,那么我看了一下报错信息,我本地环境欠缺了两个内容。
1.pydotplus库,我们使用pip install pydotplus即可安装该库
2.安装上述库文件依然报错,因为我们还需要一个绘制决策树图片的程序,对,是程序,而不是库,所以我们得安装对应的程序,否则这个错误【pydotplus.graphviz.InvocationException: GraphViz's executables not found】就会让你抓狂,程序下载路径是这个【https://graphviz.org/download/】,大家选好自己电脑对应的版本下载安装即可。
3.对代码稍作改动,在引入所有包之后,还需要在代码中加入GraphViz程序的安装路径变量
————————————————
版权声明:本文为CSDN博主「氷凌公子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36694133/article/details/124859063
我的是MacOS,没有安装Homebrew,于是安装了一个 GraphViz 的dmg安装文件,安装完成后,程序坞里出现了一个图标,图片得以生成。
13.3 生成结果图 + 结果解释
不同的结果???
如果运行足够多次,即使您输入的数据相同,决策树也会为您提供不同的结果。
这是因为决策树无法给我们 100% 的肯定答案。它基于结果的可能性,答案会有所不同。
决策树使用您先前的决策来计算您是否愿意去看喜剧演员的几率。
让我们阅读决策树的不同方面:
Rank
Rank <= 6.5
表示排名在 6.5 以下的喜剧演员将遵循True
箭头(向左),其余的则遵循False
箭头(向右)。
gini = 0.497
表示分割的质量,并且始终是 0.0 到 0.5 之间的数字,其中 0.0 表示所有样本均得到相同的结果,而 0.5 表示分割完全在中间进行。
samples = 13
表示在决策的这一点上还剩下 13 位喜剧演员,因为这是第一步,所以他们全部都是喜剧演员。
value = [6, 7]
表示在这 13 位喜剧演员中,有 6 位将获得 "NO",而 7 位将获得 "GO"。
Gini
分割样本的方法有很多,我们在本教程中使用 GINI 方法。
基尼方法使用以下公式:
Gini = 1 - (x/n)2 - (y/n)2
其中,x 是肯定答案的数量 ("GO"),n 是样本数量,y 是否定答案的数量 ("NO"),使用以下公式进行计算:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
下一步包含两个框,其中一个框用于喜剧演员,其 'Rank' 为 6.5 或更低,其余为一个框。
True - 5 名喜剧演员在这里结束
gini = 0.0
表示所有样本均得到相同的结果。
samples = 5
表示该分支中还剩下 5 位喜剧演员(5 位的等级为 6.5 或更低的喜剧演员)。
value = [5, 0]
表示 5 得到 "NO" 而 0 得到 "GO"。
False - 8 位戏剧演员继续
Rank(排名)
Rank
<= 8.5
表示排名值小于 8.5 的喜剧演员将遵循左箭头,其余的将遵循右箭头。
gini = 0.219
意味着大约 22% 的样本将朝一个方向移动。
samples = 8
表示该分支中还剩下 8 个喜剧演员(8 个喜剧演员的等级高于 6.5)。
value = [1, 7]
表示在这 8 位喜剧演员中,1 位将获得 "NO",而 7 位将获得 "GO"。
True - 4 名喜剧演员在这里结束
False - 4 位戏剧演员继续
。。。。。。。
吧啦吧啦吧啦
下面的都差不多,不写了 呵呵 这几个参数明白就行了。知道啥意思就行了。
13.4 预测值
我们可以使用决策树来预测新值。
例如:我是否应该去看一个由 40 岁的美国喜剧演员主演的节目,该喜剧演员有 10 年的经验,喜剧排名为 7?
实例 13-4-1 使用 predict()
方法来预测新值
print(dtree.predict([[40, 10, 7, 1]]))
实例 13-4-2 如果喜剧等级为 6,答案是什么?
print(dtree.predict([[40, 10, 6, 1]]))