常见机器学习算法汇总

潦草gallery 2024-09-20 15:01:01 阅读 76

目录

一、KNN算法

二、逻辑回归

 三、朴素贝叶斯

四、支持向量机

 五、决策树

六、回归树 

 七、随机森林

 八、聚类算法

1、K-Means聚类算法

2、层次聚类算法

3、DBSCAN

 九、降维算法

1、主成分分析(PCA)

2、线性判别分析(LDA)

总结


一、KNN算法

        K-近邻(K-Nearest Neighbors,KNN)算法是一种基本的分类和回归算法,通过测量不同特征值之间的距离来进行分类或回归。

Python + scikit-learn 示例代码:

<code>from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import classification_report

from sklearn.preprocessing import scale

# 加载数据集

iris = load_iris()

X = iris.data

y = iris.target

# 数据预处理 (归一化)

X = scale(X)

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建KNN分类器实例

knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型

knn.fit(X_train, y_train)

# 预测测试集结果

y_pred = knn.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred))

# 输出:

# precision recall f1-score support

# 0 1.00 1.00 1.00 10

# 1 1.00 1.00 1.00 9

# 2 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

二、逻辑回归

        逻辑回归(Logistic Regression)是一种广泛使用的分类算法,主要用于二分类问题,但也可以扩展到多分类问题。它通过使用逻辑函数(通常是Sigmoid函数)将线性回归的输出映射到0和1之间,从而预测一个事件发生的概率。

        Sigmoid 函数数学表达式为:

S(x)=\frac{1}{1+e^{-x}}

Python + scikit-learn 示例代码:

<code>from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report, accuracy_score

from sklearn import metrics

from sklearn.ensemble import ExtraTreesClassifier

# 加载数据集

iris = load_iris()

X = iris.data # 为了简化示例,只使用前两个特征

y = iris.target

# 特征选择

model = ExtraTreesClassifier()

model.fit(X, y)

# 特征重要度

arr = model.feature_importances_

sorted_pairs = sorted(enumerate(arr), key=lambda x: x[1], reverse=True)

# 选择特征重要度最大的三个元素

indices = [index for index, value in sorted_pairs[:3]]

X = X[:, indices]

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归分类器实例

logistic = LogisticRegression(solver='liblinear') # 使用liblinear优化器code>

# 训练模型

logistic.fit(X_train, y_train)

# 预测测试集结果

y_pred = logistic.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 输出:

# precision recall f1-score support

# setosa 1.00 1.00 1.00 10

# versicolor 1.00 1.00 1.00 9

# virginica 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

三、朴素贝叶斯

        朴素贝叶斯(Naive Bayes)算法是一种基于贝叶斯定理和特征条件独立性假设的分类算法。它的核心思想是,对于给定的样本,计算各个类别的后验概率,并选择概率最大的类别作为预测结果。

        贝叶斯定理的数学表达:

  

P(C|X)=\frac{P(X|C)P(C)}{P(X)}

        其中,C为类型,X为特征,P(C|X)为后验概率,P(X|C)为似然概率,P(C)为类型的先验概率,P(X)为特征的边缘概率。

Python + scikit-learn 示例代码:

<code>from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import GaussianNB

from sklearn.metrics import classification_report

# 加载数据集

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)

# 创建朴素贝叶斯分类器实例

nb = GaussianNB()

# 训练模型

nb.fit(X_train, y_train)

# 预测测试集结果

y_pred = nb.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 输出:

# precision recall f1-score support

# setosa 1.00 1.00 1.00 10

# versicolor 1.00 1.00 1.00 9

# virginica 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

 备注:朴素贝叶斯算法在实际应用中通常不需要对数据进行归一化处理,因为算法是基于概率的,而特征的尺度不会影响概率计算。

四、支持向量机

        支持向量机(Support Vector Machine, SVM)是一种强大的分类算法,用于解决分类和回归问题。SVM的核心思想是在特征空间中找到一个最优超平面,以最大化不同类别之间的边界(间隔)。

        SVM通过核函数来处理非线性可分的数据。核函数可以将数据映射到更高维的空间,在这个高维空间中,数据可能变得线性可分。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等。

Python + scikit-learn 示例代码:

from sklearn import datasets

from sklearn.model_selection import train_test_split

from sklearn.svm import SVC

from sklearn.metrics import classification_report

# 加载数据集

iris = datasets.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)

# 创建SVM分类器实例,使用RBF核

svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')code>

# 训练模型

svm_model.fit(X_train, y_train)

# 预测测试集结果

y_pred = svm_model.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 输出:

# precision recall f1-score support

# setosa 1.00 1.00 1.00 10

# versicolor 1.00 1.00 1.00 9

# virginica 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

 五、决策树

        决策树(Decision Tree)是一种直观的分类和回归工具,它通过一系列的问题将数据分割成越来越小的子集,直到满足特定的条件,最终达到基本的决策规则。

        决策树的构建过程及特征选择和数据分割,目的是创造一个模型,该模型能够根据输入特征的值沿着树的分支向下移动,最终到达叶子节点,并给出预测结果。

Python + scikit-learn 示例代码:

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import classification_report

# 加载数据集

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_clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)code>

# 训练模型

tree_clf.fit(X_train, y_train)

# 预测测试集结果

y_pred = tree_clf.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 输出:

# precision recall f1-score support

# setosa 1.00 1.00 1.00 10

# versicolor 1.00 1.00 1.00 9

# virginica 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

六、回归树 

        回归树(Regression Tree)是一种决策树的变体,用于解决回归问题。它通过将数据集分割为不同的区域来预测连续值的输出。与用于分类的决策树不同,回归树的每个叶子节点包含一个连续值,通常是该节点内训练样本目标值的平均值。

        回归树通过最小化平方误差或其他损失函数来确定最佳的分割点,从而构建树结构,以实现对连接值的预测。

 Python + scikit-learn 示例代码:

from sklearn.datasets import make_regression

from sklearn.tree import DecisionTreeRegressor

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

# 生成合成回归数据集

X, y = make_regression(n_samples=1000, n_features=10, noise=0.4)

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建回归树模型实例

tree_reg = DecisionTreeRegressor(random_state=42)

# 训练模型

tree_reg.fit(X_train, y_train)

# 预测测试集结果

y_pred = tree_reg.predict(X_test)

# 计算均方误差(MSE)

mse = mean_squared_error(y_test, y_pred)

print(f'Mean Squared Error: {mse}')

# 计算R^2分数

r2_score = tree_reg.score(X_test, y_test)

print(f'R^2 Score: {r2_score}')

# 输出:

# Mean Squared Error: 13416.236171060344

# R^2 Score: 0.33999441862626123

 七、随机森林

        随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并结合这些树的预测结果来进行分类或回归。

        每个决策树在训练过程中都会对不同的子样本集合进行训练,并且在每个节点分裂时只考虑一部分随机选择的特征,由此减少模型之间的相关性,提供模型的泛化能力和抗噪音能力。

Python + scikit-learn 示例代码:

from sklearn.datasets import load_iris

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split

from sklearn.metrics import classification_report

# 加载数据集

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)

# 创建随机森林分类器实例

rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型

rf_clf.fit(X_train, y_train)

# 预测测试集结果

y_pred = rf_clf.predict(X_test)

# 打印分类报告

print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 输出:

# precision recall f1-score support

# setosa 1.00 1.00 1.00 10

# versicolor 1.00 1.00 1.00 9

# virginica 1.00 1.00 1.00 11

# accuracy 1.00 30

# macro avg 1.00 1.00 1.00 30

# weighted avg 1.00 1.00 1.00 30

 随机森林的参数可能需要根据具体问题进行调整,以获得最优的性能。此外,随机森林也可以用于回归问题,只需将分类器替换为 RandomForestRegressor 即可。

 八、聚类算法

        聚类算法是无监督学习的一种方法,用于将数据集中的样本划分为若干个组别或“簇”,使得同一个簇内的样本相似度高,而不同簇内的样本相似度低。

1、K-Means聚类算法

        K-Means 是最常用的聚类算法之一,通过迭代选择簇中心和重新分配样本到最近的簇中心,直到满足停止条件。

示例代码:

from sklearn.datasets import make_blobs

from sklearn.cluster import KMeans

import matplotlib.pyplot as plt

# 生成合成聚类数据集

X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 创建 K-Means 对象

kmeans = KMeans(n_clusters=4)

# 训练模型

kmeans.fit(X)

# 预测簇标签

capture = kmeans.labels_

# 可视化聚类结果

plt.scatter(X[:, 0], X[:, 1], c=capture, s=50, cmap='viridis')code>

centers = kmeans.cluster_centers_

plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)code>

plt.show()

输出:

2、层次聚类算法

        层次聚类通过创建一个簇的层次结构来进行聚类,可以是凝聚的(自底向上)或分裂的(自顶向下)

示例代码:

<code>from sklearn.cluster import AgglomerativeClustering

# 生成合成聚类数据集

X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 创建层次聚类对象

agglo = AgglomerativeClustering(n_clusters=4)

# 训练模型

agglo.fit(X)

# 预测簇标签

hierarchical_labels = agglo.labels_

# 可视化聚类结果

plt.scatter(X[:, 0], X[:, 1], c=hierarchical_labels, s=50, cmap='viridis')code>

plt.show()

输出:

3、DBSCAN

        DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是基于密度的聚类算法,能够发现任意形状的簇,并对噪声点具有良好的鲁棒性。

示例代码:

<code>from sklearn.cluster import DBSCAN

# 生成合成聚类数据集

X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 创建 DBSCAN 对象

dbscan = DBSCAN(eps=0.5, min_samples=5)

# 训练模型

dbscan.fit(X)

# 预测簇标签

dbscan_labels = dbscan.labels_

# 可视化聚类结果

plt.scatter(X[:, 0], X[:, 1], c=dbscan_labels, s=50, cmap='viridis')code>

plt.show()

 输出:

注意事项:

在实际应用中,选择合适的聚类算法和参数(如 K-Means 中的 <code>n_clusters,DBSCAN 中的 eps 和 min_samples)通常需要对数据集进行探索性分析。聚类数(簇的数量)往往是一个重要的超参数,可以通过肘部法则(Elbow Method)、轮廓系数(Silhouette Coefficient)等方法辅助决定。聚类算法对初始条件和数据的尺度敏感,可能需要进行数据标准化。

 九、降维算法

        降维算法用于减少数据集中的特征数量,同时尽可能保留原始数据的重要信息。这有助于提高计算效率,减少存储空间,避免维度灾难和过拟合。

1、主成分分析(PCA)

        PCA是一种统计方法,通过正交变换将数据转换到新的坐标系,使得在这个新坐标系上的方差最大化。

示例代码:

from sklearn.decomposition import PCA

from sklearn.datasets import make_blobs

# 生成合成数据集

X, _ = make_blobs(n_samples=100, centers=3, cluster_std=1.06, random_state=0)

# 创建PCA对象

pca = PCA(n_components=2)

# 执行降维

X_reduced = pca.fit_transform(X)

# 可视化降维结果

import matplotlib.pyplot as plt

print(f'X-shape: {X.shape}')

print('PCA-result:')

plt.scatter(X_reduced[:, 0], X_reduced[:, 1])

plt.show()

 输出:

2、线性判别分析(LDA)

        LDA不仅是一种降维技术,还是一种监督学习的分类技术,它寻找最佳的线性组合来最大化类别之间的分离度。

示例代码:

<code>from sklearn.datasets import make_classification

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 生成合成分类数据集

X, y = make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=0, random_state=42)

# 创建LDA对象

lda = LinearDiscriminantAnalysis(n_components=1)

# 执行降维

X_lda = lda.fit_transform(X, y)

# 可视化降维结果

print(f'X-shape: {X.shape}; y-shape: {y.shape}; X_lda-shape: {X_lda.shape}')

plt.scatter(X_lda, y)

plt.show()

 输出:

 PCA(主成分分析)和 LDA(线性判别分析)降维算法对比:

对比维度 PCA(主成分分析) LDA(线性判别分析)
降维类型 无监督降维 有监督降维
数据假设 数据符合高斯分布

数据符合高斯分布,

类别协方差矩阵相同

降维目标

最大化数据的方

差,去除数据冗余

最大化类间散度与

最小化类内散度的

比值

维度限制

理论上无限制,但

实际中通常降到特

征数的某个百分比

降维最多到类别数减

分类能力

不直接用于分类,

但降维后的数据可

用于分类

专门设计用于分类,

降维后的数据具有

较好的分类性能

投影方向选择

选择样本点投影具

有最大方差的方向

选择分类性能最好

的投影方向

应用场景

数据压缩、噪声过

滤、数据可视化等

模式识别、分类任务

计算复杂度

相对较高,需要计

算协方差矩阵和执

行特征值分解

相对较低,只需计

算类内和类间散度

矩阵

结构解释性

主成分之间正交,

但单个主成分可能

难以解释

投影方向直接关联

于类别差异,解释

性较强


总结

        在实际应用中,选择哪种学习算法取决于问题的性质、数据的可用性和质量、以及你希望模型达到的目标。

        如果有大量的标记数据,监督学习可能是最佳选择;如果数据大部分是未标记的,无监督学习或半监督学习可能更合适。

       降维算法常用于数据可视化和降维,而聚类算法常用于发现数据中的固有群体。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。