首页 > 编程语言 >机器学习_分类算法详解

机器学习_分类算法详解

时间:2024-06-03 17:32:28浏览次数:20  
标签:机器 算法 train test import model sklearn 详解 accuracy

机器学习中的分类算法是用于将输入数据分配到预定义类别中的算法。分类任务是监督学习的一种,模型根据训练数据中的输入-输出对进行学习,然后预测新的输入数据的类别。常见的分类算法包括:

  1. 逻辑回归(Logistic Regression)
  2. k-近邻(k-Nearest Neighbors, k-NN)
  3. 支持向量机(Support Vector Machine, SVM)
  4. 决策树(Decision Tree)
  5. 随机森林(Random Forest)
  6. 朴素贝叶斯(Naive Bayes)
  7. 神经网络(Neural Network)

我们将详细讲解其中的几种,并提供相应的代码实例。

1.逻辑回归(Logistic Regression)

逻辑回归是一种用于二分类问题的线性模型。它使用sigmoid函数将线性回归的输出转换为概率值。

原理

逻辑回归是一种线性模型,用于二分类问题。它通过学习线性关系来预测输入数据属于某个类别的概率。其核心是使用sigmoid函数将线性组合的结果映射到[0,1]区间。

公式:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1​
其中, z = w T x + b z = \mathbf{w}^T \mathbf{x} + b z=wTx+b,w是权重,b是偏置,x是输入特征。

损失函数(对数似然损失):
L ( y , y ^ ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(y, \hat{y}) = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] L(y,y^​)=−N1​i=1∑N​[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]
其中,hat(y_i)是预测的概率。

使用场景

适用于线性可分的二分类问题,如垃圾邮件分类、信用卡欺诈检测。

优缺点

优点:

  • 简单易理解
  • 计算效率高
  • 输出概率值,易于解释

缺点:

  • 处理非线性问题能力差
  • 对异常值敏感
代码实例
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = LogisticRegression()
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

2.k-近邻(k-Nearest Neighbors, k-NN)

k-近邻算法是通过测量不同特征值之间的距离进行分类的。对于新的数据点,它寻找最近的k个邻居,并根据这些邻居的多数类别进行分类。

原理

k-NN是一种基于实例的学习方法,通过计算新样本与训练样本的距离,选择k个最近邻居,并以多数投票决定新样本的类别。

距离公式(欧氏距离):
d ( x i , x j ) = ∑ m = 1 M ( x i m − x j m ) 2 d(\mathbf{x}_i, \mathbf{x}_j) = \sqrt{\sum_{m=1}^M (x_{im} - x_{jm})^2} d(xi​,xj​)=m=1∑M​(xim​−xjm​)2

使用场景

适用于小规模数据集,如图像分类、推荐系统。

优缺点

优点:

  • 简单易实现
  • 不需要训练阶段

缺点:

  • 计算复杂度高,预测慢
  • 对噪声敏感
  • 高维数据效果差
代码实例
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

3.支持向量机(Support Vector Machine, SVM)

SVM通过在特征空间中寻找一个最佳的超平面来将数据点分类。这个超平面最大化了两类之间的间隔(即支持向量)。

原理

SVM通过在高维空间中找到一个最佳超平面将数据分类,最大化类间的间隔(支持向量)。对于线性不可分数据,可以通过核函数将数据映射到更高维空间。

决策函数:
f ( x ) = w T x + b f(\mathbf{x}) = \mathbf{w}^T \mathbf{x} + b f(x)=wTx+b

优化目标:
min ⁡ w , b 1 2 ∥ w ∥ 2 \min_{\mathbf{w}, b} \frac{1}{2} \|\mathbf{w}\|^2 w,bmin​21​∥w∥2
约束条件:
y i ( w T x i + b ) ≥ 1 , ∀ i y_i (\mathbf{w}^T \mathbf{x}_i + b) \geq 1, \forall i yi​(wTxi​+b)≥1,∀i

使用场景

适用于中小规模、高维数据集,如文本分类、人脸识别。

优缺点

优点:

  • 处理高维数据能力强
  • 可以使用核函数处理非线性问题

缺点:

  • 训练时间长
  • 对参数和核函数敏感
代码实例
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = SVC(kernel='linear')
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

4.决策树(Decision Tree)

决策树是基于树结构的模型,通过一系列的决策规则将数据分类。每个节点表示一个特征,分支表示特征值,而叶子节点表示类别。

原理

决策树通过一系列的决策规则将数据分类,每个节点表示一个特征,分支表示特征值,叶子节点表示类别。树的构建通过递归地选择最佳分割特征和分割点来完成。

信息增益(ID3算法):
Gain ( D , A ) = Entropy ( D ) − ∑ v ∈ Values ( A ) ∣ D v ∣ ∣ D ∣ Entropy ( D v ) \text{Gain}(D, A) = \text{Entropy}(D) - \sum_{v \in \text{Values}(A)} \frac{|D_v|}{|D|} \text{Entropy}(D_v) Gain(D,A)=Entropy(D)−v∈Values(A)∑​∣D∣∣Dv​∣​Entropy(Dv​)

使用场景

适用于易于解释的分类问题,如客户分类、信用评分。

优缺点

优点:

  • 易于理解和解释
  • 不需要特征缩放

缺点:

  • 容易过拟合
  • 对噪声敏感
代码实例
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = DecisionTreeClassifier()
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

这些代码示例展示了几种基本的分类算法在Python中的实现方式。每个算法都有其独特的优点和适用场景,可以根据具体问题选择合适的算法。

好的,接下来我们将继续详细讲解其他几种常见的分类算法,包括随机森林、朴素贝叶斯和神经网络,并提供相应的代码实例。

5.随机森林(Random Forest)

随机森林是由多棵决策树组成的集成学习模型,通过集成多个决策树的预测结果来提高分类性能和减少过拟合。

原理

随机森林是由多棵决策树组成的集成学习模型。每棵树在训练时使用不同的子集和特征子集,最终通过投票来决定分类结果。

决策过程:

  • 随机选择样本和特征
  • 构建多棵决策树
  • 多数投票决定分类结果
使用场景

适用于需要高准确度和稳定性的分类问题,如银行贷款评估、疾病诊断。

优缺点

优点:

  • 高准确度
  • 抗过拟合
  • 处理大规模数据能力强

缺点:

  • 训练和预测时间较长
  • 模型复杂,难以解释
代码实例
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

6.朴素贝叶斯(Naive Bayes)

朴素贝叶斯是基于贝叶斯定理的分类算法,它假设特征之间是相互独立的。常用的朴素贝叶斯分类器包括高斯贝叶斯、伯努利贝叶斯和多项式贝叶斯。

原理

朴素贝叶斯基于贝叶斯定理,假设特征之间是独立的。通过计算每个类别的条件概率,选择概率最大的类别作为预测结果。

贝叶斯定理:
P ( C k ∣ x ) = P ( x ∣ C k ) P ( C k ) P ( x ) P(C_k | \mathbf{x}) = \frac{P(\mathbf{x} | C_k) P(C_k)}{P(\mathbf{x})} P(Ck​∣x)=P(x)P(x∣Ck​)P(Ck​)​
其中,(P(\mathbf{x} | C_k))假设特征独立:
P ( x ∣ C k ) = ∏ i = 1 n P ( x i ∣ C k ) P(\mathbf{x} | C_k) = \prod_{i=1}^n P(x_i | C_k) P(x∣Ck​)=i=1∏n​P(xi​∣Ck​)

使用场景

适用于特征独立性假设较强的分类问题,如文本分类、垃圾邮件检测。

优缺点

优点:

  • 简单高效
  • 对小规模数据集表现好

缺点:

  • 特征独立性假设过于简单
  • 对连续特征效果不佳
代码实例
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = GaussianNB()
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

7.神经网络(Neural Network)

神经网络是一种模拟人脑神经元连接模式的模型,特别适用于复杂的非线性分类任务。常见的神经网络包括前馈神经网络、卷积神经网络和递归神经网络。

原理

神经网络模拟人脑神经元的连接方式,通过层层传递和激活函数实现复杂的非线性分类。常用的前馈神经网络由输入层、隐藏层和输出层组成。

前向传播公式:
a ( l + 1 ) = σ ( W ( l ) a ( l ) + b ( l ) ) a^{(l+1)} = \sigma(W^{(l)} a^{(l)} + b^{(l)}) a(l+1)=σ(W(l)a(l)+b(l))
其中,(\sigma)是激活函数,如ReLU或sigmoid。

损失函数(交叉熵损失):
L ( y , y ^ ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(y, \hat{y}) = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] L(y,y^​)=−N1​i=1∑N​[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]

使用场景

适用于复杂的非线性分类问题,如图像分类、语音识别。

优缺点

优点:

  • 处理复杂非线性问题能力强
  • 适合大规模数据

缺点:

  • 训练时间长
  • 需要大量数据和计算资源
  • 难以解释
代码实例
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score

# 示例数据集(假设数据已准备好)
X = np.array([[0.5, 1.5], [1.5, 1.9], [2.1, 1.8], [3.2, 3.1], [3.5, 4.1], [4.2, 4.5]])
y = np.array([0, 0, 0, 1, 1, 1])

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 模型训练
model = MLPClassifier(hidden_layer_sizes=(10, 10), max_iter=1000, random_state=42)
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)

# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

比较与选择

在实际应用中,不同的分类算法有各自的优缺点,选择合适的分类算法需要根据具体问题的需求进行权衡。

  • 逻辑回归适用于简单的线性可分问题,解释性强。
  • k-NN简单直观,但计算复杂度高,不适合高维数据。
  • SVM对于高维数据表现良好,但在大规模数据集上训练时间较长。
  • 决策树易于理解和解释,但容易过拟合。
  • 随机森林通过集成学习提高性能,减少过拟合,但训练和预测时间较长。
  • 朴素贝叶斯适用于特征独立性假设成立的情况,计算效率高。
  • 神经网络适合处理复杂的非线性问题,但需要大量数据和计算资源。

通过对比这些算法的优缺点,可以选择最适合具体任务的分类算法。在实践中,可以通过交叉验证和调参来进一步优化模型性能。

标签:机器,算法,train,test,import,model,sklearn,详解,accuracy
From: https://blog.csdn.net/a6181816/article/details/139317333

相关文章

  • 机器学习_聚类算法详解
    聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:1.K-means聚类原理K-means是一种迭代优化算法,目标是将数据集分成K个簇,每个簇由一个中心点......
  • Python数据分析【Numpy系列】np.linspace()用法详解
    np.linspace()是NumPy库中一个非常有用的函数,它用于在指定的区间内生成等间距的样本值。这个函数非常适合在数值分析、数据可视化和信号处理等领域生成数据点。函数语法numpy.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0)......
  • 文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题
    八、假设设计了这样一个proto-vEB结构,其中每个簇数组仅有u14u^\frac{1}{......
  • C++实现线程池详解
    在现代软件开发中,高效地管理和利用计算资源是一项关键任务。线程池(ThreadPool)是一种非常有效的并发编程技术,它允许我们管理和重用一组线程,从而避免频繁创建和销毁线程带来的性能开销。1.线程池的基本概念线程池是一组预先创建的线程,这些线程等待并执行任务。当任务到达时,它......
  • 基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)
     ......
  • 【图像去噪】基于原始对偶算法优化的TV-L1模型进行图像去噪研究(Matlab代码实现)
    ......
  • 模式匹配---kmp算法
    模式匹配--Kmp算法暴力匹配暴力匹配,既普通模式匹配,主串一个一个地与子串进行比对,一旦匹配失败就跳回主串原指针的下一个重新回溯,子串跳回第一个,重新开始匹配。主串BABCBFDAB下标012345678子串BCB主串原指针指向下标为......
  • DevOps生命周期的8个阶段和DevOps pipeline 详解
    您可能也在探索DevOpspipeline或工作流的概念,这些术语可能会根据不同的解释者而有所交替使用。尽管如此,DevOps生命周期和DevOpspipeline这两个术语更常被提及。本文将首先阐述DevOps生命周期的概念,然后深入介绍DevOpspipeline。DevOps生命周期和DevOpspipeline的概述DevOps......
  • 求一个算法思路,类似一维装箱?
    有很多小矩形(膜材料和长度可能不一样,但是高度是统一的):a120,a250,b12,b200,c300,c450,…字母表示膜的材料,数值表示长度。要将这些矩形进行分类,变成更大的矩形(水平平铺,不同的膜材料可以放在一起,但是不同材质的矩形之间要留10毫米间距,相同材质的可以紧密接触)。比如:(a120,a250,c30......
  • 寻路算法---基于AutoCAD二次开发
    在CAD中绘制首尾相连的直线,并据此构件点与点之间的连接关系,考虑到可能会有线连接的地方有一定的距离delta 点的信息,用于最开始情况下的点的信息集合///<summary>///点对应的信息///</summary>publicclassQjPointInfo{///<summary>......