常见机器学习算法汇总
潦草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 函数数学表达式为:
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)算法是一种基于贝叶斯定理和特征条件独立性假设的分类算法。它的核心思想是,对于给定的样本,计算各个类别的后验概率,并选择概率最大的类别作为预测结果。
贝叶斯定理的数学表达:
其中,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(线性判别分析) |
降维类型 | 无监督降维 | 有监督降维 |
数据假设 | 数据符合高斯分布 | 数据符合高斯分布,
类别协方差矩阵相同
|
降维目标 | 最大化数据的方
差,去除数据冗余
| 最大化类间散度与
最小化类内散度的
比值
|
维度限制 | 理论上无限制,但
实际中通常降到特
征数的某个百分比
| 降维最多到类别数减
一
|
分类能力 | 不直接用于分类,
但降维后的数据可
用于分类
| 专门设计用于分类,
降维后的数据具有
较好的分类性能
|
投影方向选择 | 选择样本点投影具
有最大方差的方向
| 选择分类性能最好
的投影方向
|
应用场景 | 数据压缩、噪声过
滤、数据可视化等
| 模式识别、分类任务
等
|
计算复杂度 | 相对较高,需要计
算协方差矩阵和执
行特征值分解
| 相对较低,只需计
算类内和类间散度
矩阵
|
结构解释性 | 主成分之间正交,
但单个主成分可能
难以解释
| 投影方向直接关联
于类别差异,解释
性较强
|
总结
在实际应用中,选择哪种学习算法取决于问题的性质、数据的可用性和质量、以及你希望模型达到的目标。
如果有大量的标记数据,监督学习可能是最佳选择;如果数据大部分是未标记的,无监督学习或半监督学习可能更合适。
降维算法常用于数据可视化和降维,而聚类算法常用于发现数据中的固有群体。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。