机器学习入门之监督学习(分类篇)

机器学习是人工智能的一个分支,它使计算机能够从数据中学习并做出决策或预测,而不是通过明确编程来执行特定任务。简而言之,机器学习涉及到算法和统计模型的使用,这些工具使计算机能够识别数据中的模式,并根据这些模式来做出决策或预测。

一、机器学习的关键特性:

  • 自动化和改进:机器学习模型能随着时间和更多数据的输入而自我改进。
  • 模式识别:机器学习算法通常用于识别复杂的数据模式,这对于传统编程方法来说可能非常困难。
  • 预测能力:基于已有的数据,机器学习可以预测未来的趋势和行为。

机器学习的主要类别:

  1. 监督学习(Supervised Learning)
  2. 无监督学习(Unsupervised Learning)
  3. 半监督学习(Semi-supervised Learning)
  4. 强化学习(Reinforcement Learning)

二、监督学习

监督学习是机器学习中最常见的一种类型,它涉及到训练数据的使用,这些数据已经包含了输入数据以及对应的正确输出。算法在这种学习过程中通过分析训练数据学会了将输入映射到正确的输出,然后应用这种映射关系到新的数据上。

特点

  • 数据标注:监督学习需要大量的标记数据,即每个输入样本都需要有一个对应的标签。
  • 任务类型:常见的监督学习任务包括分类(预测离散标签)和回归(预测连续值)。

举例

  • 分类任务:如垃圾邮件检测,图像识别。
  • 回归任务:如房价预测,股票价格预测。

监督学习的核心挑战包括过拟合(模型过于复杂,学习了训练数据中的噪声而不仅仅是信号),以及如何获得足够多的高质量标注数据。这类学习的效果很大程度上依赖于训练数据的质量和量。

三、分类任务(Classification)

分类是监督学习中的一种,其目标是预测数据点属于哪一个类别或类别组。这种任务通常涉及到将数据点分配给两个或更多类别中的一个。根据类别的数量,分类可以进一步分为二分类和多分类:

  • 二分类(Binary Classification):任务是将实例分为两组,常见的应用有垃圾邮件检测(是垃圾邮件或不是垃圾邮件)。
  • 多分类(Multiclass Classification):涉及三个或更多类别的分类,例如,识别图像中的动物属于哪种类别(猫、狗、马等)。
1)判别模型(Discriminative Models)

判别模型直接学习输入数据(特征)到输出标签(类别)之间的映射关系,即它们关注于判断或者区分数据点属于哪一个类别。这种模型通常不尝试了解数据的生成过程,而是专注于找到不同类别之间的边界。判别模型的主要目标是找到这些边界,以最大化地区分不同的类别。

常见的判别模型包括:

  • 支持向量机(SVM)
  • 逻辑回归(Logistic Regression)
  • 决策树(Decision Trees)
  • 随机森林(Random Forests)
  • 深度学习中的卷积神经网络(CNNs)和循环神经网络(RNNs)
2)生成模型(Generative Models)

生成模型则尝试学习数据生成的过程,即它们试图了解每个类别数据是如何产生的。这种模型学习输入数据的潜在分布,并能够基于这个分布生成新的数据点。生成模型不仅可以用于分类,还能用于生成与训练数据相似的新数据。

常见的生成模型包括:

  • 朴素贝叶斯(Naive Bayes)
  • 高斯混合模型(Gaussian Mixture Models)
  • 隐马尔可夫模型(Hidden Markov Models)
  • 生成对抗网络(GANs)
  • 变分自编码器(VAEs)

四、常见的分类 判别模型

1)朴素贝叶斯(Naive Bayes)

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单概率分类器,它在分类任务中广泛应用。朴素贝叶斯分类器的“朴素”二字来源于其对特征之间独立性的假设,即假设各特征在给定类别的条件下是相互独立的。

朴素贝叶斯模型基于贝叶斯定理来计算和预测类别的概率。贝叶斯定理提供了一种计算条件概率的方法,即在已知某些信息的情况下,事件的概率如何变化。公式如下:

P(A|B)=\frac{P(B|A)*P(A)}{P(B)}

其中:

对于分类任务,我们用 YYY 表示类别变量,XXX 表示特征数据。朴素贝叶斯的目标是计算给定特征 XXX 的条件下,观测数据属于某一类 YYY 的概率 P(Y∣X)。根据贝叶斯定理,我们有:

朴素贝叶斯模型因其简单、高效以及在大量特征存在的情况下仍然表现良好而广泛使用,尤其适用于文本分类(如垃圾邮件和情感分析)和医疗诊断等领域。然而,其性能高度依赖于特征独立性的假设,这在实际中往往不完全成立

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

# 加载数据
data = fetch_20newsgroups(subset='all', categories=['alt.atheism', 'soc.religion.christian'])

# 文本向量化
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(data.data)
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 创建多项式朴素贝叶斯模型
model = MultinomialNB()

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

# 预测
y_pred = model.predict(X_test)

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

五、常见的分类 生成模型

1)逻辑回归(Logistic Regression)

逻辑回归(Logistic Regression)是一种广泛用于分类任务的统计模型,尽管名字中有“回归”,它实际上是用于二分类问题(如是或否的决策问题)的判别模型。它通过使用逻辑函数估计概率来进行预测,这使得它非常适用于需要概率输出的应用场景。

逻辑回归的核心是逻辑函数(Logistic Function),也称为 Sigmoid 函数,其公式如下:

 逻辑回归广泛用于医疗、金融、社交网络分析等领域,适合于处理二分类问题。它的主要优点是模型形式简单、可解释性强,输出的概率意义清晰。然而,逻辑回归假设数据的决策边界是线性的,对于复杂的非线性关系和高度复杂的数据结构,它可能无法提供足够的模型复杂度,这时候可能需要考虑更复杂的模型如决策树、随机森林或神经网络

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 生成模拟数据
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, n_clusters_per_class=1, flip_y=0.1, random_state=1)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, 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"Model Accuracy: {accuracy}")
2)K近邻(K-Nearest Neighbors, KNN)算法

K近邻(K-Nearest Neighbors, KNN)算法是一种基本且广泛使用的分类和回归方法,但在实际应用中主要用于分类。它属于非参数学习算法和懒惰学习算法,即它不会从训练数据中学习一个显式的模型,而是直接使用实例本身进行预测。

KNN算法的核心思想非常简单:给定一个训练数据集,对新的实例进行分类时,会在训练集中寻找与这个新实例最近的K个实例(邻居),这些实例的多数类别将被用来预测新实例的类别。

步骤如下:

  1. 选择K的值:K是一个用户定义的常数,通常通过交叉验证来选择一个最优的K值。
  2. 距离度量:计算新实例与训练集中每个实例之间的距离。常用的距离度量包括欧氏距离、曼哈顿距离和明可夫斯基距离。
  3. 找到最近的K个邻居:根据定义的距离,从训练数据中选出距离最近的K个实例。
  4. 进行决策:在分类任务中,通常采用“投票制”(即选择这K个实例中出现次数最多的类别)。在回归任务中,则通常是这K个实例的输出值的平均值。
KNN的优点
  • 简单有效:算法易于理解和实现。
  • 无需训练阶段:KNN是一种懒惰学习算法,不需要在训练阶段建立模型,因此特别适合于那些数据频繁更新的应用。
  • 适用性广:可以用于分类和回归,且可以轻松地适应多分类问题。
KNN的缺点
  • 计算成本高:因为每个测试实例都需要对所有训练数据进行距离计算,计算成本较高,特别是在数据集很大时。
  • 存储需求高:需要存储全部数据。
  • 对不平衡数据敏感:KNN对数据分布敏感,不平衡的数据会影响其性能。
  • 对噪声和离群点敏感:K近邻算法对噪声数据和离群点敏感。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建KNN模型,选择K=3
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 进行预测
y_pred = knn.predict(X_test)

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

决策树是一种常用的机器学习方法,广泛应用于分类和回归任务。它以树状结构表示数据分割的决策过程,每个内部节点代表一个属性上的决策点,每个分支代表决策的结果,而每个叶节点代表一个类别或数值(根据是分类树还是回归树)。

决策树的构建过程是一个递归分割数据的过程。主要步骤如下:

  1. 选择最佳分割属性:从当前数据集的特征中选择最适合作为节点分割标准的特征。这一过程通常基于某种统计标准,比如信息增益(在ID3算法中使用)、信息增益率(在C4.5算法中使用)或基尼不纯度(在CART算法中使用)。
  2. 分割数据:根据选定的特征和其阈值将数据分割成子集,每个子集流向树的一个新节点。
  3. 递归构建树:对分割后的每个子集重复步骤1和2,直到满足停止条件(如数据量小于某个阈值、达到预设的树的最大深度、或者子集在目标变量上的纯度已经很高)。
  4. 剪枝:为防止过拟合,有时需要对已生成的树进行剪枝,剪掉一些对训练数据的特殊性质过度拟合的部分。
优点
  • 易于理解和解释:人们可以通过查看树结构很容易地理解模型的决策逻辑。
  • 对数据的要求不严:不需要很大程度的数据预处理,比如创建虚拟变量或删除空值。
  • 可处理数值和类别数据:能够处理各种类型的数据。
缺点
  • 容易过拟合:尤其是树很深的时候,它可能会构建一个过于复杂的树,试图完美拟合所有的样本。
  • 稳定性差:小的数据变化可能会导致生成完全不同的树。
  • 偏向于多数类:如果某些类占主导地位,决策树将创建偏向于这些类的偏见。
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建决策树模型
tree = DecisionTreeClassifier(max_depth=3)

# 训练模型
tree.fit(X_train, y_train)

# 预测测试集
y_pred = tree.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值