突发!员工跳楼!只拿低保工资!央企设计院集体罢工!

突发!北京某院集体罢工!

淄博向东,惠泊向西:在人民与人民币之间,惠泊停车选择了人民币

【少儿禁】马建《亮出你的舌苔或空空荡荡》

10部适合女性看的唯美情色电影

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

机器学习大科普:回归、分类与聚类

胡萝卜酱 DataGo数据狗 2022-07-01

提及机器学习算法,首先会想到哪些呢?决策树、KNN、SVM、随机森林、逻辑回归……以上这些算法在之前的文章推送里都或多或少有提及,然鹅,你萌知道怎么对他们分类吗?机器学习算法的分类,其实也有好几种分类方式,比如有监督/无监督、生成/判别等等。而本文,胡萝卜酱将机器学习任务的角度来进行分类,也就是回归、分类和聚类。本文仅作为简单的科普,不涉及推理等。


1、回归


回归,Regression,是一种对数值型连续随机变量进行预测和建模的监督学习算法。最常用的回归分为两类:线性回归、非线性回归。


1.1 线性回归

线性回归应该是我们最熟悉的算法,简单而言,就是将输入项分别乘以一些常量,再将结果加起来得到输出。以鸢尾花数据集为例,


线性回归拟合后:

1from sklearn.datasets import load_iris
2import pandas as pd
3import matplotlib.pyplot as plt
4
5iris_data = load_iris()
6iris = pd.DataFrame(iris_data['data'],columns=['sepal_length','sepal_width','petal_length','petal_width'])
7iris['target'] = iris_data['target']
8
9
10from sklearn.cross_validation import train_test_split
11#线性回归
12from sklearn import linear_model
13plt.scatter(iris['petal_length'],iris['petal_width'],s = 75, c = 'r', alpha = 0.5)
14plt.show()
15x_train,x_test, y_train, y_test = train_test_split(iris['petal_length'],iris['petal_width'],test_size=0.2, random_state=0)
16
17linear = linear_model.LinearRegression()
18linear.fit(x_train.values.reshape(-1,1),y_train)
19linear.score(x_train.values.reshape(-1,1), y_train)
20
21print('Coefficient: n', linear.coef_)
22print('Intercept: n', linear.intercept_)
23
24y =  linear.predict(x_test.values.reshape(-1,1))
25plt.scatter(x_test,y_test,s = 75, c = 'r', alpha = 0.5)
26plt.plot(x_test,y, c = 'g', alpha = 0.5)
27plt.show()

    

简单的线性回归通常被使用正则化的回归方法(LASSO、Ridge 和 Elastic-Net)所代替。正则化其实就是一种对过多回归系数采取惩罚以减少过拟合风险的技术。线性回归适用于预测房价、总销售额等。也可将线性回归具体分为一元线性回归(上例)和多元线性回归。

  • 优点:可以通过正则化来降低过拟合的风险,并且很容易使用随机梯度下降和新数据更新模型权重。

  • 缺点:线性回归在变量是非线性关系的时候表现很差,并且不能拟合更复杂的情景。

1.2 非线性回归

非线性回归是用以解决变量间非线性关系的,主要有回归树、深度学习等。以回归树为例,它是决策树中的一类,它通过将数据集重复分割为不同的分支而实现分层学习。这里不进行详细讲解。

在回归里面,常用的是线性回归,以及它的变种:岭回归与lasso回归。它们的损失函数对比见下图。若要使用它们进行回归计算,可以直接调用sklearn。

2、分类


分类,是一种对离散型随机变量建模或预测的监督学习算法。


2.1 逻辑回归

逻辑回归虽然名字叫做回归,其实它是分类算法。它用于在给定独立变量的基础上估计离散值(二值,像0与1,是与否,真与假)。简单来说,这就是通过拟合数据到一个逻辑函数来预测一个事件发生的可能性。因为他预测的是概率,所以输出变量就在0与1之间。具体可以参考Python数据分析之逻辑回归(logistic regression)一文。


2.2 决策树

决策树是一种简单但广泛使用的分类器,它通过训练数据构建决策树,对未知的数据进行分类。决策树的每个内部节点表示在一个属性上的测试,每个分枝代表该测试的一个输出,而每个树叶结点存放着一个类标号。 在决策树算法中,ID3基于信息增益作为属性选择的度量,C4.5基于信息增益比作为属性选择的度量,CART基于基尼指数作为属性选择的度量。同样,我们以鸢尾花数据集为例:


1from sklearn import tree
2tr=tree.DecisionTreeClassifier(criterion='gini')
3x_train,x_test, y_train, y_test = train_test_split(iris[['sepal_length','sepal_width','petal_length','petal_width']],iris['target'],test_size=0.2, random_state=0)
4tr.fit(x_train,y_train)
5tr.score(x_train,y_train)
6
7import pydotplus
8# 设置图像参数
9dot_data = tree.export_graphviz(tr, out_file=None,
10                         feature_names=['sepal_length','sepal_width','petal_length','petal_width'],
11                         class_names=['setosa''versicolor''virginica'],
12                         filled=True, rounded=True,
13                         special_characters=True)
14graph = pydotplus.graph_from_dot_data(dot_data)
15graph.write_pdf("iris.pdf"


  • 优点:不需要任何领域知识或参数假设、适合高维数据、可在短时间内处理大量数据。

  • 缺点:易于过拟合、易忽略变量属性之间的相关性。


2.3 朴素贝叶斯

朴素贝叶斯,是假定一个属性值在给定类的影响独立于其他属性的算法。具体可参考机器学习实战之朴素贝叶斯一文。

  • 优点:所需估计的参数少,对缺失数据不敏感。

  • 缺点:需假设变量之间相互独立、需要知道先验概率。


2.4 KNN

KNN,也就是K最近邻算法。具体可以参考Python数据分析之k-近邻算法(kNN)一文。

  • 优点:简单、易于理解、容易实现、通过对K的选择可具备丢噪音数据的健壮性。

  • 缺点:计算复杂度高,空间复杂度高。


2.5 SVM

SVM,也就是支持向量机,它把分类问题转化为寻找分类平面的问题,并通过最大化分类边界点距离分类平面的距离来实现分类。具体可以参考机器学习之SVM支持向量机(一)一文。

  • 优点:可以解决高维、非线性问题,可以解决小样本下的机器学习问题。

  • 缺点:难以调参,内存消耗大,对缺失数据非常敏感。

2.6 集成学习

集成学习的思路是在对新的实例进行分类的时候,把多个单分类器的结果进行某种组合,来对最终的结果进行分类。 一般的boosting>bagging>single classifier。集成学习的方法主要有一下三种: 

  1. 在样本上做文章,基分类器为同一个分类算法,主要有bagging和boosting。

  2.  在分类算法上做文章,即用于训练基分类器的样本相同。基分类器的算法不同。

  3. 在样本属性集上做文章,即在不同的属性上构建分类器,比较出名的是随机森林的算法

胡萝卜酱会在以后的文章推送中详细讲解这些集成算法。


3、聚类


 以上介绍的算法都是有监督学习,而聚类是无监督学习。该算法基于数据的内部结构寻找观察样本的自然族群(即集群)。


3.1 K-means聚类

K 均值聚类是一种假设我们数据的分布是K个sigma相同的高斯分布的算法,聚类的度量基于样本点之间的几何距离(即在坐标平面中的距离)。集群是围绕在聚类中心的族群,而集群呈现出类球状并具有相似的大小。具体可以参考利用KMeans聚类进行航空公司客户价值分析一文。

  • 优点:聚类快速、简单。

  • 缺点:需要指定集群的数量,且当集群呈现类球状时聚类效果才好。


3.2 层次聚类

层次聚类(Hierarchical Clustering)是对给定数据集在不同层次进行划分,形成树形的聚类结构,直到满足某种停止条件为止。数据集的划分可采用自底向上或自顶向下的划分策略。层次聚类的步骤如下:

假设有N个待聚类的样本,对于层次聚类来说,其步骤为:


  1. 初始化:把每个样本各自归为一类(每个样本自成一类),计算每两个类之间的距离,在这里也就是样本与样本之间的相似度(本质还是计算类与类之间的距离)。

  2. 寻找各个类之间最近的两个类,把它们归为一类(这样,类的总数就减少了一个)

  3. 重新计算新生成的这个类与各个旧类之间的距离(相似度)

  4. 重复(2)(3)步,直到所有的样本都归为一类,结束。

胡萝卜酱在之后也会通过层次聚类进行相关案例的数据分析,这里不再展开介绍。

  • 优点:不需要数据集呈现类球状。

  • 缺点:需要假定集群数量。


3.3 DBSCAN

DBSCAN ,基于密度聚类的算法,它通过一组邻域参数来描述样本分布的紧密程度。DBSCAN算法的步骤如下:

  • 优点:不需要假设集群为球状,同时不要求每个点都被分类。

  • 缺点:用户必须调增epslion和min_sample来定义集群密度的超参数。


除上述三种聚类方法外,还有DPEAK、谱聚类、AP聚类等聚类算法。感兴趣的可以看相关的技术博客学习。


本文仅介绍了机器学习算法的一种分类方式及其优缺点,要深入学习这些算法,最好结合实践展开,只有动手做了,才能知道自己的不足。

文章有问题?点此查看未经处理的缓存