| 1.1 引言
如果您阅读了《机器学习---概述》这篇所讲述的内容,您会对分类有一个大致的了解。同时我们也提及了监督学习和非监督学习。监督学习意味着我们将标记历史数据,我们将使用这些数据来通知我们的模型。我们将我们试图预测的标签或事物称为目标。所以在监督学习中,历史数据有一个已知的目标,而对于无监督学习,没有已知的目标。
在监督学习中,有分类和回归。分类问题的目标是一个分类值(通常是 True 或 False,但可以是多个类别)。回归问题的目标是数值的问题。
例如,预测房价是一个回归问题。它是受监督的,因为我们有过去房屋销售的历史数据。这是回归,因为房价是一个数值。
预测某人是否会拖欠贷款是一个分类问题。同样,它是受监督的,因为我们有过去贷款人是否违约的历史数据,这是一个分类问题,因为我们试图预测贷款人是否属于两个类别之一(违约与否)。
注:后面我们会接触一种算法叫逻辑回归,虽然名称中有回归,但它是一种用于解决分类问题的算法,而不是回归问题。
| 2.1 分类术语(Classification Terminology)
让我们来看一下机器学习初学者常见的数据集---《Titanic》(泰坦尼克数据集),
注 : titanic.csv文件可在文末获取
import pandas as pd
df = pd.read_csv("titanic.csv")
print(df.head())
观察上图,Survived字段是我们试图预测的。我们称之为目标。你可以看到它是一个 1 和 0 的列表。1 表示乘客幸存,0 表示乘客没有幸存。
剩下的列是我们可以用来预测目标的乘客信息。我们将这些列中的每一列称为一个特征。特征是我们用来进行预测的数据。
虽然我们知道数据集中的每位乘客是否幸存下来,但我们希望能够对我们无法为其收集数据的其他乘客做出预测。换句话说,你随便让一个人去泰坦尼克号上,给出他的信息,预测他是否会幸存。我们将建立一个机器学习模型来帮助我们做到这一点。
| 2.1 分类的线性模型(Linear Model for Classification)
| 2.11 图形分类(Classification Graphically)
我们最终会想要使用所有的功能,但为简单起见,我们只从其中两个功能(票价和年龄)开始。使用两个特征使我们能够在图表中可视化数据。
在 x 轴上是乘客的票价,在 y 轴上是他们的年龄。黄色的点是幸存的乘客,紫色的点是没有幸存的乘客。
想要可视化出数据,我们使用matplotlib,如果你不熟悉,请参考《数据科学---使用Matplotlib进行数据可视化》。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("titanic.csv")
plt.xlabel('Fare')
plt.ylabel('Age')
plt.scatter(df['Fare'],df['Age'], c=df['Survived'])
您可以看到图表底部的黄点比顶部多。这是因为儿童比成人更有可能存活下来,这符合我们的直觉。同样,图表右侧有更多黄点,这意味着支付更多费用的人更有可能生存。
线性模型的任务是找到最能区分这两个类的线,使黄色点在一侧,紫色点在另一侧。
下图一条不错的线的例子(表述的更加清楚的应该是一个二元一次方程的函数图像)。该线路用于预测新乘客。如果乘客的数据点位于线路的右侧,我们会预测他们会幸存下来。如果在左侧,我们会预测他们无法生存。
Tips : 所以按照上篇文章的内容我们将构建模型,构建模型的挑战将是确定可能的最佳线路是什么。
| 2.12 线性方程(Equation for the Line)
一条线由以下形式的等式定义,我们也将其称为二元一次方程的一般式:
0 = ax + by + c
a、b 和 c 的值是系数。任何三个值都将定义一条唯一的线。
让我们看一下系数为 a=1、b=-1 和 c=-30 的直线的具体示例。
0 = (1)x + (-1)y + (-30)
三个系数分别为:1、-1、-30 回想一下,我们一直在用 x 轴表示票价,y 轴表示乘客的年龄来绘制数据。要从等式中画一条线,我们需要在线上的两个点。例如,我们可以看到点 (30, 0) 正好在线上 (Fare 30, Age 0)。如果我们把它代入方程,它就可以解决。我们还可以看到点 (50, 20) 也在线上 (Fare 50, Age 20)。
展示在图表上的样子:
Tips : 方程的系数控制线的位置。
| 2.13 基于线性方程做出预测
如果我们获取乘客的数据,我们可以使用这个等式来确定他们落在线路的哪一侧。例如,假设我们有一位乘客,其票价为 100,年龄为 20。
让我们将这些值代入我们的方程:
(1)100 + (-1)20 - 30 = 100 - 20 - 30 = 50
由于该值为正,因此该点位于线的右侧,我们可以预测乘客幸免于难。
现在假设一位乘客的票价为 10,他们的年龄为 50。让我们将这些值代入等式。
(1)10 + (-1)50 - 30 = -70
由于该值为负,因此该点位于线的左侧,我们可以预测乘客没有幸存。
我们可以在下图中看到这两点。
Tips : 一个点位于直线的哪一边,决定了我们是否认为乘客会幸存下来。
| 2.14 好的函数该如何找到?
让我们看看两条不同的线。首先,我们有迄今为止一直在使用的二元一次函数。我们称之为第 1 条线。
0 = (1)x + (-1)y - 30
接下来我们有另一个直线方程。我们称之为第 2 条线。
0 = (4)x + (5)y - 400
如果我们查看这两条线,我们会看到第 1 条线右侧的黄色点较多,左侧的紫色点较多。第 2 条线的右侧没有很多点;大多数紫色和黄色点都在左侧。这使得第 1 条线成为首选项,因为它在分割黄色和紫色点方面做得更好。我们需要在数学上定义这个想法,以便我们可以通过算法找到最佳线,说明你需要了解一定的数学知识(关于数学后面也会介绍)。
Tips : 逻辑回归是一种在数学上找到最佳线的方法,那是我们下一篇将会描述的内容。
| 2.15 完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("titanic.csv")
plt.ylabel('Age')
plt.xlabel('Fare')
# 绘制散点图
plt.scatter(df['Fare'], df['Age'], c=df['Survived'])
# 构造二元一次方程
y = np.arange(0, 80, 1)
c = 30
x = y + c
# 绘制直线
plt.plot(x, y, 'c')
当然,你也可以访问github存储库来下载代码:
https://github.com/Zesheng-Wang/Machine-Learning
References:
https://www.kaggle.com/arshid/iris-flower-dataset
https://www.datacamp.com/community/tutorials/machine-learning-in-r
https://en.wikipedia.org/wiki/Iris_flower_data_set
https://towardsdatascience.com/machine-learning-classifiers
Getting started with Classification---Sarthak Yadav
| 4.1 写在最后
学习不是一蹴而就的,机器学习所涉及的内容非常宽泛,后面可能还会涉及一些数学公式。不过作为一种面向应用的方式方法,在不同的场景下同样有着不同的解决方式,希望今天的内容可以帮你了解什么是分类,从根本上理解机器学习,而不是做一个调包侠,希望可以帮你打下坚实的基础。
勘误:
由于我自己也不是资深编程高手,在创作此内容时尽管已经力求精准,查阅了诸多资料,还是难保有所疏漏,如果各位发现有误可以公众号内留言,欢迎指正。
你要偷偷学Python,然后惊艳所有人。
-END-
感谢大家的关注
你关心的,都在这里