如何用Python处理分类和回归问题?附方法和代码

如何用Python处理分类和回归问题?附方法和代码

编译 | AI科技大本营

参与 | 王柯凝

编辑 | 明明

【AI科技大本营导读】继马斯克的重型火箭猎鹰火箭(Falcon Heavy)发射成功后,营长的朋友圈被持续刷屏,虽然特斯拉Roadster飞偏了,但不可否认未来是属于科技的,更是属于人工智能和机器学习的,任何一个不了解这些技术的人都会很快发现自己将落后于这个时代。

对于人工智能和机器学习来说,目前有很多种可以实施的技术和工具用来解决实时问题,其中,监督学习(Supervised Learning)是最常用的方法之一。什么是监督学习?监督学习如何实现呢?营长为大家找到了使用Python进行监督学习的方法。

什么是监督学习?

在监督学习中,首先导入包含训练属性和目标属性的数据集。然后,监督学习算法学习训练样本和与之相关的目标变量之间的关系,并利用所学习到的关系对全新的输入(没有目标)进行分类。

为了说明监督学习是如何工作的,我们来举一个例子:根据一个学生的学习小时数来预测他的考试分数。

在数学表达式上可表示为:Y = f(X)+ C,其中:

  • f 表示考试分数和学生为考试所准备的小时数之间的关系;

  • X 表示输入(准备的小时数);

  • Y 表示输出(学生的考试分数);

  • C 表示随机误差。

监督学习算法的最终目标是给定一个新的输入X,最大精度的预测Y。

实现监督学习最常用的方法

根据给定的数据集,机器学习问题可分为两类:分类和回归

如果给定的数据同时具有输入(训练)值和输出(目标)值,则是一个分类问题;如果给定数据集的属性是连续的值且没有任何目标标签,则是一个回归问题。

分类: 有输出标签,这是猫还是狗?
回归: 房子卖多少钱?

分类

举个例子:一位医学研究人员想要分析乳腺癌数据,来预测患者应该接受三种治疗方案中的哪一种。这个数据分析任务被称为分类,它构建一个模型或分类器来预测从属的类别标签,比如:“治疗方案A”,“治疗方案B”或“治疗方案C”。

分类是预测分类(离散、无序的)的类标号,分为两个过程:学习和分类。

分类的方法

一些常用的分类算法如下:

  • K-近邻算法(KNN)

  • 决策树算法

  • 贝叶斯分类算法

  • 支持向量机(SVM)

在学习过程中,分类模型通过分析训练集来构建分类器;在分类过程中,预测给定数据的分类标签。将待分析的数据集元组和与之相关联的类标签分成一个训练集和一个测试集。从待分析的数据集中随机抽样组成训练集的各个元组,剩下的元组形成测试集,并独立于训练集的元组,这就意味着测试集不会被用来构建分类器。

测试集用于评估分类器的预测正确率。分类器的正确率是分类器正确分类的测试元组所占得百分比。为了达到更高的正确率,最好的办法就是测试不同的算法,并在每个算法中尝试不同的参数。其中,最好的一个方法是交叉验证。

为了选择一个较好的算法来解决这个问题,对于不同的算法,必须考虑其正确率,训练时间,线性度,参数个数以及其他特殊情况。

在IRIS 数据集上,我们用Scikit-Learn库实现K-近邻法算法,根据给定的输入对花的类型进行分类。

为了应用机器学习算法,我们首先需要了解给定的数据集。在这个例子中,我们用的是从Scikit-Learn包中导入的IRIS数据集。现在,我们用代码来探索IRIS数据集的属性。

确保你的电脑上已经安装了Python。另外,使用PIP安装如下几个包:

pip 安装 pandas
pip 安装 matplotlib
pip 安装 scikit-learn

在这段代码中,我们使用pandas包的几个方法了解IRIS数据集的属性。

输出:

<class ‘sklearn.datasets.base.Bunch’>
dict_keys([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’])]
<class ‘numpy.ndarray’> <class ‘numpy.ndarray’>
(150, 4)
[‘setosa’ ‘versicolor’ ‘virginica’]
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

Scikit-Learn学习之K-近邻法

如果一个算法在只是简单的存储训练集元组,并一直等待,直到给定一个测试元组时才进行泛化, 根据其存储的训练元组的相似性进行分类,则称之为惰性学习。K-近邻分类器就是一种惰性学习。

K-近邻法基于类比进行学习,也就是说,将给定的测试元组和与之相似的训练元组相比较。将训练元组表示为n维空间中的一个点,这样,所有的训练元组将被存储在一个n维模式空间。当给定一个未知元组,K-近邻分类器搜索模式空间中最接进未知元组的K个训练元组,这K个训练元组即是这个未知元组的个K个“近邻”。

“贴近度”用来定义一个距离度量(如欧几里得距离)。一个合适的K值则需要根据实际情况而定。在这段代码中,我们从 sklearn 中导入K-近邻分类器,并将其用于我们输入的数据中,之后再对花进行分类。

输出:

[1 1]

这里,0对应于Versicolor;1对应Virginic;2对应Setosa。根据给定的输入,机器预测两朵花都是Versicolor。

使用K-近邻法对IRIS数据集分类

如何用Python处理分类和回归问题?附方法和代码

回归

回归用来描述两个或更多变量之间的关系。例如:根据给定输入X,预测一个人的收入。

这里,目标变量指的是我们所关心的待预测的未知变量,连续是指Y的值之间不存在距离(不连续性)。

预测收入是一个典型的回归问题。输入数据应该包含可以预测收入的信息(称为特征),比如:工作时间,教育经历,职位,住所。

回归模型

常用的回归模型有:

  • 线性回归

  • Logistic回归

  • 多项式回归

线性回归使用最佳拟合直线(也称回归线)建立因变量(Y)和一个或多个自变量(X)之间的关系。用数学表达式表示:

h(xi)=βo+β1*xi+e

其中,βo是截距,β1是线的斜率,e是误差项。

图表显示为:

如何用Python处理分类和回归问题?附方法和代码

Logistic回归是一种用于响应变量是分类的算法,其思想是找出特征与特定结果概率之间的关系。用数学表达式表示:

p(X)=βo+β1*X

其中,p(x)=p(y=1|x)

图表显示为:

如何用Python处理分类和回归问题?附方法和代码

多项式回归是一种回归分析方法,其中自变量x和因变量y之间的关系被建模为x的一个n次多项式。

解决线性回归问题

我们有数据集X和相应的目标值Y,使用普通的最小二乘法学习一个线性模型,给定一个新的x,我们可以使用这个模型以尽可能小的误差来预测一个新的y。

将给定的数据集分成一个训练数据集和一个测试数据集。训练集具有标签(特征),因此算法可以从这些带有标注的例子从学习。测试不带有任何标签,也就是说,你还不知道预测值。

我们使用一个特征进行训练,并用线性回归方法来拟合训练数据,然后用测试数据集预测输出结果。

线性回归在Scikit-Learn中的实现

输出:

[
[ 0.07786339] [-0.03961813] [ 0.01103904] [-0.04069594] 
[-0.03422907] [ 0.00564998] [ 0.08864151] [-0.03315126]
[-0.05686312] [-0.03099563] [ 0.05522933] [-0.06009656]
[ 0.00133873] [-0.02345095] [-0.07410811] [ 0.01966154]
[-0.01590626] [-0.01590626] [ 0.03906215] [-0.0730303 ]
]

预测的输出值:

[
225.9732401 115.74763374 163.27610621 114.73638965 120.80385422 
158.21988574 236.08568105 121.81509832 
99.56772822 123.83758651 204.73711411 96.53399594 
154.17490936 130.91629517 83.3878227 171.36605897
137.99500384 137.99500384 189.56845268 84.3990668
]

如何用Python处理分类和回归问题?附方法和代码

表中(diabetes_X_test, diabetes_y_pred) 的预测在线性方程上是连续的。

作者 | Vihar Kurama

原文链接

https://towardsdatascience.com/supervised-learning-with-python-cf2c1ae543c1

相关推荐