Bootstrap

【机器学习】分类器

在机器学习(Machine Learning,ML)中,分类器泛指算法或模型,用于将输入数据分为不同的类别或标签。分类器是监督学习的一部分,它依据已知的数据集中的特征和标签进行训练,并根据这些学习到的知识对新的未标记数据进行分类。

分类器的目标是从输入数据中提取有用的特征,并根据这些特征对数据进行分类。这些特征可以是数值型、类别型或其他类型的数据。分类器可以根据数据的属性和学习算法的选择,采用不同的方法进行分类。本文介绍4种常见的分类器:SVM、KNN、RF、NB。

目录

一.SVM

1.原理

2.鸢尾花分类预测

二.KNN

1.原理

2.鸢尾花分类预测

三.RF

1.原理

2.鸢尾花分类预测

四.NB

1.原理

2.鸢尾花分类预测

一.SVM

1.原理

支持向量机(SupportVectorMachine,SVM)是由Vapnik等人运用统计学理论中的结构风险最小化准则和VC维理论提出的一种依赖核函数的机器学习分类算法,其原理是:寻找分类的最优超平面,使超平面两侧类别的边缘距离最大。样本集\left \{(x_{1},y_{1}), (x_{2},y_{2}),...,(x_{n},y_{n})\right \},分类函数为

其中,ω是权值向量,b是偏移量。

下图为线性可分的二分类问题的支持向量机示例。

其中,H 是最优超平面,对应\omega x+b=0H_{1}H_{2}分别为类1和类2距离H的最近样本点,称为支持向量。 依据结构风险最小化准则,寻找最优超平面等价为:

其中,\xi _{i}\xi _{i}^{*}分别为松弛因子的上限和下限,C表示惩罚因子,i=1,2,…n。 引入拉格朗日算子\alpha _{i},分类阈值b*,最优分类函数为:

样本集线性不可分时,引入核函数K将样本转换到近似线性可分的空间,对应的最优分类函数为:

常用的径向基核函数的表达式如下。

2.鸢尾花分类预测

Scikit-learn是一个强大的Python库,提供丰富的机器学习算法和工具。利用Scikit-learn里面的SVM实现鸢尾花分类的代码如下。

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

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

# 训练SVM模型
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}')

二.KNN

1.原理

K近邻分类器(K-nearest neighbour,KNN)是1种非线性分类算法,算法原理为:如果1个待预测样本附近的K个最近样本的大多数属于某一个类别,则该样本也属于这个类别。

以下图为例。

K=3时,距离待分类的绿色圆点最近的3个邻居为为2个红色三角形和1个蓝色正方形,基于统计的方法判定绿色圆点属于红色三角形类别。

K=5时,距绿色圆点最近的5个邻居为为2个红色三角形和3个蓝色正方 形,此时绿色圆点为蓝色正方形类别。

2.鸢尾花分类预测

利用Scikit-learn里面的KNN实现鸢尾花分类的代码如下。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

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

# 训练KNN模型
knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(X_train, y_train)

# 预测
y_pred = knn_model.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

三.RF

1.原理

随机森林(RandomForest,RF)是1个包含多个决策树的分类器,最终输出类别由统计得到的各个决策树的分类类别的众数决定。随机森林分类器的构建主要有数据的随机选取以及候选特征的随机选取2个方面。

数据的随机选取

在原始数据集N个样本中进行有放回的抽样,构造样本大小也为N的子决策树数据集,同1个子决策树数据集的元素可以重复,不同子决策树数据集的元素也可以重复。如下图所示。

候选特征的随机选取

与子决策树数据集的随机选取相似,在子决策树分类过程中从M个原始特征中随机选取m个特征,然后再从m(m远小于M)个特征中选取最优的特征, 如下图所示。

2.鸢尾花分类预测

利用Scikit-learn里面的RF实现鸢尾花分类的代码如下。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

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

# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(X_train, y_train)

# 预测
rf_pred = rf_model.predict(X_test)
# 评估
rf_accuracy = accuracy_score(y_test, rf_pred)
print(f'Random Forest Accuracy: {rf_accuracy}')

四.NB

1.原理

朴素贝叶斯分类器(Naive Bayes,NB)的基础是贝叶斯决策理论,假设样本之间的特征相互独立。

朴素贝叶斯的算法原理是:训练样本集X=\left \{ x_{1} ,x_{2},...,x_{n}\right \},类别集合Y=\left \{ y_{1} ,y_{2},...,y_{n}\right \} ,样本特征集合T=\left \{ t_{1} ,t_{2},...,t_{n}\right \},对于待分类样本x_{i},计算x_{i}出现 的条件下,各个类别出现的概率,概率最大的类别即为x_{i}所属的类别。

2.鸢尾花分类预测

利用Scikit-learn里面的NB实现鸢尾花分类的代码如下。

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

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

# 训练朴素贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 预测
y_pred = nb_model.predict(X_test)
# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

;