文章目录
前言
本文为大家总结了监督学习和无监督学习中常用算法原理简单介绍,包括了代码的详细详解,是机器学习的入门学习,同时也是AI算法面试的重点问题。
一、监督学习和无监督学习
1. 监督学习
定义:提供输入数据和其对应的标签数据,然后搭建一个模型,模型经过训练后准确的找到输入数据和标签数据之间的最优映射关系,从而对新的未标记数据进行预测或分类。
定义看懵逼了吧?接下来说人话!!!
假如有一群草泥马和牛马组成的马群,这时候需要一个机器对马群进行分类,但是这个机器不知道草泥马和牛马长什么样儿,所以我们首先拿一堆草泥马和牛马的照片给机器看,告诉机器草泥马和牛马长什么样儿。机器经过反复的看,形成肌肉记忆,可以对草泥妈和牛马形成自己的定义,然后机器就可以准确的对马群进行分类。
在这个过程中,草泥马和牛马的照片就叫做标签,反复的看理解为训练,形成的肌肉记忆叫做模型,这就是监督学习的过程。
2. 无监督学习
定义:训练数据只包含输入样本,没有相应的标签或目标。
包装一下:我们没有拿草泥马和牛马的照片对机器进行系统的训练,机器也不知道这两个马儿长什么样,而是直接让机器对这两个马儿进行分类。这就是无监督学习。
3. 两者主要区别以及优缺点
如图所示,左图是无监督学习的过程,虽然数据被分成了两类,但是没有对应的数据标签,统一用蓝色的圆点表示,这更像是把具有相同的特征的数据聚集在一起,所以无监督学习实现分类的算法又叫做聚类。右图是监督学习中二分类的过程,标签在图中体现为三角和圆。
无监督学习的关键优势是它可以在没有人工标签的情况下自动从大量未标记的数据中获取知识。这使得无监督学习在数据探索、数据预处理和模式发现方面具有广泛的应用。它也可以用作监督学习的预处理步骤,以减少标记数据的需求或改善模型的性能。缺点是无监督学习的性能很大程度上依赖于输入数据的质量和特征。如果数据存在噪声、缺失值或异常值,这些因素可能会对模型的性能产生负面影响。
监督学习的优势是使用标记的训练数据来指导模型的学习过程,因此可以获得相对准确的预测结果。通过与真实标签进行比较,模型可以进行纠正和优化,提高预测的准确性。缺点是监督学习模型在训练阶段是通过学习训练数据的模式和规律来进行预测。如果模型在训练数据上过度拟合,可能在新的未见过的数据上表现不佳,泛化能力受到限制。
4. 半监督学习
为了综合两者的优点,半监督学习诞生了。半监督学习是介于监督学习和无监督学习之间的一种机器学习方法。在半监督学习中,模型使用同时包含标记和未标记样本的训练数据进行学习。
半监督学习的优势在于:
- 利用未标记数据:未标记数据通常更容易获取,半监督学习可以充分利用这些数据来提高模型的性能和泛化能力,尤其在标记数据有限或获取成本高的情况下。
- 提高泛化能力:通过利用更多的数据进行学习,半监督学习可以帮助模型更好地捕捉数据的潜在结构,提高模型在新数据上的泛化能力。
- 减少标记成本:相比于完全依赖标记数据进行训练,半监督学习可以使用较少的标记数据来达到类似的性能,从而降低了标记数据的需求和成本。
二、常用机器学习算法介绍
1.监督学习
1.1 线性回归算法
线性回归是一种用于建立自变量(输入)和因变量(输出)之间线性关系的模型,其重点如下:
- 通过提供数据训练模型,让模型得到自变量和因变量对应的映射关系。
- 映射关系是连续且线性的
下面通过图来更加直观的看线性回归问题:
X—房屋面积; —面积和价格对应的数据;
Y—房屋价格; 弧线—线性映射模型;
如果我们想要房屋面积对应的价格的话,通过这个线性回归模型,就可以很快的进行预测,这就是线性回归的整个过程。代码如下(示例):
import numpy as np
from sklearn.linear_model import LinearRegression
# 输入数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 6, 8, 10])
# 创建线性回归模型
model = LinearRegression()
# 拟合模型
model.fit(X, y)
# 预测
X_test = np.array([[6], [7]])
y_pred = model.predict(X_test)
# 输出预测结果
print(y_pred)
1.2 逻辑回归算法
逻辑回归实际上是一种分类算法,它的输出是一个概率值,表示样本属于某个类别的概率。逻辑回归模型的数学表示如下:
逻辑回归实际上是一种分类算法,它的输出是一个概率值,表示样本属于某个类别的概率。逻辑回归模型的数学表示如下:
- 假设函数(Hypothesis):
hθ(x)> = g(θ^T * x)
其中,hθ(x) 表示预测函数,g(z) 表示逻辑函数(Sigmoid函数),θ 是模型参数,x 是输入特征向量。
- 逻辑函数(Sigmoid函数):
g(z)> = 1 / (1 + e^(-z))
其中,e 表示自然指数,z 是线性回归模型的输出。
- 损失函数(Cost Function):
J(θ)= -1/m * ∑[y * log(hθ(x)) + (1 - y) * log(1 - hθ(x))]
其中,m 表示样本数量,y 表示实际标签
在实际应用中,逻辑回归可以用于各种二分类问题,例如垃圾邮件分类、疾病诊断、广告点击预测等。它的优点包括模型简单、计算效率高、可解释性好等特点。然而,逻辑回归也有一些限制,例如对于非线性问题的建模能力较弱。在处理多分类问题时,可以使用一对多(One-vs-Rest)或多项式逻辑回归进行扩展。代码如下(示例):
import numpy as np
from sklearn.linear_model import LogisticRegression
# 输入数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([0, 0, 1, 1, 1])
# 创建逻辑回归模型
model = LogisticRegression()
# 拟合模型
model.fit(X, y)
# 预测
X_test = np.array([[6], [7]])
y_pred = model.predict(X_test)
# 输出预测结果
print(y_pred)
1.3 决策树算法
决策树算法用于解决分类和回归问题。它通过构建一棵树形结构来进行决策,每个内部节点表示一个特征或属性(色泽和触感),每个叶节点表示一个类别或一个数值(好瓜、坏瓜)。
决策树算法的基本步骤如下:
- 特征选择:根据某个准则选择最佳的特征作为当前节点的划分依据。常用的特征选择准则包括信息增益、信息增益比、基尼指数等。
- 决策树生成:根据特征选择的结果,递归地生成决策树的内部节点和叶节点。每个内部节点表示一个特征,根据该特征的取值将样本划分到不同的子节点中。
- 决策树剪枝:为了防止过拟合,可以进行决策树的剪枝操作。剪枝过程可以通过预剪枝或后剪枝来实现。预剪枝是在决策树生成过程中进行判断,如果划分不再显著提高性能,则停止划分。后剪枝是在决策树生成之后,通过剪枝操作来减小决策树的复杂度。
常见的决策树算法有ID3、C5.0和CART,CART的分类效果一般要优于其他决策树。
ID3的核心思想是基于信息增益来选择最优的特征进行节点的划分。
import numpy as np
def entropy(y):
classes, counts = np.unique(y, return_counts=True)
probabilities = counts / len(y)
entropy = -np.sum(probabilities * np.log2(probabilities))
return entropy
def information_gain(X, y, feature_index):
total_entropy = entropy(y)
feature_values = np.unique(X[:, feature_index])
weighted_entropy = 0
for value in feature_values:
subset_indices = np.where(X[:, feature_index] == value)
subset_y = y[subset_indices]
subset_entropy = entropy(subset_y)
subset_weight = len(subset_y) / len(y)
weighted_entropy += subset_weight * subset_entropy
information_gain = total_entropy - weighted_entropy
return information_gain
def id3(X, y, features):
if len(np.unique(y)) == 1:
# 所有样本属于同一类别,返回叶节点
return y[0]
if len(features) == 0:
# 没有可用的特征,返回多数类别
classes, counts = np.unique(y, return_counts=