文章目录
- 一、分类算法
- 1、K近邻算法(K-Nearest Neighbors, KNN)
- 2、支持向量机(Support Vector Machine, SVM)
- 3、决策树(Decision Tree)
- 二、回归算法
- 4、线性回归(Linear Regression)
- 三、集成学习算法
- 5、随机森林(Random Forest)
- 6、AdaBoost(Adaptive Boosting)
- 四、其他常用模型
- 7、朴素贝叶斯
- 8、K均值聚类
- 9、PCA降维
- 10、神经网络
- 参考
scikit-learn是一个广泛使用的Python机器学习库,提供了大量的算法和工具用于数据预处理、模型训练、模型评估等。
一、分类算法
1、K近邻算法(K-Nearest Neighbors, KNN)
- 原理:基于实例的学习,通过测量不同数据点之间的距离进行分类。
- 作用:用于分类和回归问题,通过找到训练数据集中与新数据点最相似的k个样本,并根据这些样本的标签进行预测。
- 公式:无特定公式,但核心在于距离的计算,如欧式距离 (d(x,y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2})。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建KNN分类器,设置近邻数为3
knn = KNeighborsClassifier(n_neighbors=3)# 训练模型
knn.fit(X_train, y_train)# 预测
y_pred = knn.predict(X_test)# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
# 输出 Accuracy: 1.0
2、支持向量机(Support Vector Machine, SVM)
- 原理:在特征空间上找到一个最佳超平面,使得正负样本之间的边界最大化。
- 作用:主要用于二分类问题,也可通过组合多个SVM解决多分类问题。
- 公式:超平面方程 (w^Tx + b = 0),其中 (w) 是权重向量,(b) 是偏置项。优化问题通常表达为 (\min_{w,b} \frac{1}{2}||w||^2) s.t. (y_i(w^Tx_i + b) \geq 1),其中 (y_i) 是样本标签。
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建SVM分类器
svm = SVC(kernel='linear') # 线性核SVM# 训练模型
svm.fit(X_train, y_train)# 预测
y_pred = svm.predict(X_test)# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
# 输出 Accuracy: 1.0
3、决策树(Decision Tree)
- 原理:通过树形结构对数据进行分类,每个节点代表一个特征属性上的判断条件。
- 作用:直观易理解的分类模型,能够处理数值和分类数据。
- 公式:无特定公式,但构建过程中涉及信息熵和信息增益的计算,如信息熵 (H(X) = -\sum_{x \in X} P(x) \log_2 P(x))。
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score # 加载数据
iris = load_iris()
X, y = iris.data, iris.target # 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建决策树分类器
dtree = DecisionTreeClassifier(random_state=42) # 训练模型
dtree.fit(X_train, y_train) # 预测
y_pred = dtree.predict(X_test) # 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
# 输出 Accuracy: 1.0
二、回归算法
4、线性回归(Linear Regression)
- 原理:利用回归分析确定两种或多种变量间相互依赖的定量关系。
- 作用:预测连续数值的输出,如房价预测、销售额预测等。
- 公式:线性回归方程 (y = wx + b),其中 (w) 是权重系数,(b) 是截距项。
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, accuracy_score# 生成模拟的回归数据集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建线性回归模型
linear_regression = LinearRegression()# 训练模型
linear_regression.fit(X_train, y_train) # 使用训练数据拟合模型# 进行预测
y_pred = linear_regression.predict(X_test)# 评估模型:计算均方误差(Mean Squared Error, MSE)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
# 输出 Mean Squared Error: 0.010420222653186971
三、集成学习算法
5、随机森林(Random Forest)
- 原理:通过构建多棵决策树并结合它们的输出来提高预测精度和稳定性。
- 作用:用于分类和回归问题,能够减少模型的方差,提高预测性能。
- 公式:无特定公式,但涉及决策树的构建和集成。
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 生成模拟的回归数据集
X, y = make_regression(n_samples=100, n_features=4, noise=0.1, random_state=42)# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建随机森林回归模型
random_forest = RandomForestRegressor(n_estimators=100, random_state=42) # 设置树的数量为100# 训练模型
random_forest.fit(X_train, y_train) # 使用训练数据拟合模型# 进行预测
y_pred = random_forest.predict(X_test)# 评估模型:计算均方误差(Mean Squared Error, MSE)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
6、AdaBoost(Adaptive Boosting)
- 原理:通过组合多个弱分类器来创建一个强分类器,每个弱分类器针对之前分类器错误分类的样本进行训练。
- 作用:提高分类准确率,尤其适用于不平衡数据集。
- 公式:涉及权重更新和错误率计算等步骤,具体公式较复杂。
from sklearn.ensemble import AdaBoostRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.tree import DecisionTreeRegressor# 生成模拟的回归数据集
X, y = make_regression(n_samples=100, n_features=100, noise=0.1, random_state=42)# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# AdaBoost通常基于决策树等弱学习器,这里我们使用决策树回归器作为基学习器
base_estimator = DecisionTreeRegressor(max_depth=3, random_state=42)# 创建AdaBoost回归模型,设置基学习器和提升迭代次数
adaboost = AdaBoostRegressor(estimator=base_estimator, n_estimators=100, random_state=42)# 训练模型
adaboost.fit(X_train, y_train) # 使用训练数据拟合模型# 进行预测
y_pred = adaboost.predict(X_test)
# 评估模型:计算均方误差(Mean Squared Error, MSE)
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
四、其他常用模型
7、朴素贝叶斯
- 原理:朴素贝叶斯算法是基于贝叶斯定理的一种分类方法。它假设特征之间相互独立(即特征条件独立性假设),从而简化联合概率的计算。
- 作用:该算法主要用于分类问题,如文本分类、垃圾邮件识别等。由于其简单性和在某些领域的有效性,朴素贝叶斯被广泛使用。
- 公式:
- 贝叶斯定理:(P(B|A) = \frac{P(A|B)P(B)}{P(A)})
- 朴素贝叶斯分类器的后验概率公式:(P(Y=y_k|X=x) = \frac{P(Y=y_k)\prod_{i=1}{n}P(X_i=x_i|Y=y_k)}{\sum_{y_j}P(Y=y_j)\prod_{i=1}{n}P(X_i=x_i|Y=y_j)})
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建朴素贝叶斯分类器
gnb = GaussianNB()# 训练模型
gnb.fit(X_train, y_train)# 预测
y_pred = gnb.predict(X_test)# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
8、K均值聚类
- 原理:K均值聚类是一种无监督学习算法,它将数据划分为K个簇,使得同一簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。
- 作用:该算法广泛应用于数据挖掘、模式识别等领域,用于发现数据中的内在结构和分组。
- 公式:
- 欧式距离公式(用于计算数据点之间的距离):(d(x_i, x_j) = \sqrt{\sum_{k=1}^{m}(x_{ki} - x_{kj})^2})
- K均值聚类的目标是最小化每个簇内数据点到簇中心的距离之和。
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 创建K均值聚类模型
kmeans = KMeans(n_clusters=4)# 训练模型
kmeans.fit(X)# 预测聚类标签
labels = kmeans.predict(X)# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='x')
plt.show()
9、PCA降维
- 原理:PCA(主成分分析)是一种通过正交变换将原始数据转换为一系列线性无关的变量(即主成分)的降维方法。
- 作用:PCA主要用于高维数据的降维处理,以便于可视化、去噪、加速机器学习算法等。通过减少数据的维度,可以降低计算的复杂性并提高模型的泛化能力。
- 公式:
- 协方差矩阵:用于衡量不同特征之间的相关性。
- 特征值和特征向量:通过求解协方差矩阵的特征值和特征向量来确定主成分的方向。
- 主成分得分:将数据投影到主成分上得到的值。
(注:PCA的具体数学公式较为复杂,涉及矩阵运算、特征值分解等,这里仅提供了概念性的描述。)
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
print(X)
# 创建PCA模型,设置要降到的维度为2
pca = PCA(n_components=2)# 对数据进行PCA降维
X_pca = pca.fit_transform(X)# 可视化降维后的数据
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, edgecolor='k', s=150)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA on Iris Dataset')
plt.show()
10、神经网络
- 原理:神经网络是模拟人脑神经元连接方式的算法模型,通过多个神经元的组合和连接来学习和表示复杂的数据关系。
- 作用:神经网络广泛应用于分类、回归、聚类、降维等多种机器学习任务。由于其强大的学习和表示能力,神经网络在图像识别、语音识别、自然语言处理等领域取得了显著成果。
- 公式:
- 神经元的输出公式:(y = f(\sum_{i}w_ix_i + b)),其中 (w_i) 是权重,(x_i) 是输入,(b) 是偏置项,(f) 是激活函数。
- 常见的激活函数包括Sigmoid、ReLU(Rectified Linear Unit)、Tanh等,每种激活函数都有其特定的数学公式。
- 神经网络的训练通常使用反向传播算法(Backpropagation),该算法涉及复杂的梯度计算和权重更新过程。
(注:由于神经网络的复杂性和多样性,这里仅提供了基本的原理和公式概述。)
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建多层感知机分类器
mlp = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, random_state=42)# 训练模型
mlp.fit(X_train, y_train)# 预测
y_pred = mlp.predict(X_test)# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
参考
- https://scikit-learn.org/