省流版:
本文介绍机器学习中的回归算法:逻辑回归、KNN、SVM、随机森林和XGBoost。作为机器学习的有监督学习方法,分类模型是最重要也是最常见的一类算法,在数据分析等岗位的笔试面试中都是常客,非常值得深入研究!
内容很多,创作不易,如果对你有帮助的话还请三连支持~
有监督学习——分类算法:目的是根据输入的特征将数据分为不同的类别,从而对数据进行分类
逻辑回归
原理:逻辑回归模型基于线性回归模型,通过对线性组合进行非线性映射,将结果映射到0和1之间的概率值,表示某个样本属于某个类别的概率。
公式:
sigmoid激活函数,其中h(x)是样本x属于正类的概率,θ是模型参数
- sigmoid激活函数的输出值始终在0和1之间,而且当输入为0时,输出为0.5。在逻辑回归模型中,sigmoid函数将线性方程的输出转换为属于0到1之间的概率值,为我们提供了一个 评估样本是否属于某个分类的工具。
- siemoi激活函数的优点是它可以对输入信号进行非线性映射和压缩,使输入信号更具表达力。但是,缺点是它产生了“梯度消失”问题,因为在极端值(远离0)处斜率接近0,这意味着梯度也会很小,从而导致训练变慢或停止。
损失函数:
-
- 定义:交叉熵损失函数。
- 推导方法:根据函数图像理解
- 给定y=1时,损失函数为-log(p),估计出来的概率p越小,损失函数越大,当概率p取0(即预估的分类结果y=0)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是1);
- 给定y=0时,损失函数为-log(1-p),估计出来的概率p越大,损失函数越大,当概率p取1(即预估的分类结果y=1)时,loss值是趋近于正无穷的,表明我们分错了(实际分类结果是1)
Python代码:
Python
# 导入所需的库
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 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('模型准确率:', accuracy)
K近邻(KNN)
原理:
- 如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,则该样本也属于这个类别。
- 分类问题:KNN通过计算样本与训练集中所有样本的距离,并选择距离最近的K个样本来确定样本的类别。
- 回归问题:KNN通过计算最近邻的平均值来预测目标变量的值。
计算方法
- 选择距离度量方法:通常使用欧氏距离(两点直线距离)或曼哈顿距离(沿轴的距离)等作为距离度量方法。
- 计算距离:对于每个待预测的样本,计算它与训练集中所有样本的距离。
- 选择最近的K个样本:根据计算得到的距离,选择距离最近的K个样本。
- 投票或平均:对于分类问题,采用多数投票的方式确定样本的类别;对于回归问题,采用这K个样本的平均值作为预测值。
Python
# 导入所需的库
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_classifier = KNeighborsClassifier(n_neighbors=3)
# 使用训练数据拟合模型
knn_classifier.fit(X_train, y_train)
# 使用模型进行预测
y_pred = knn_classifier.predict(X_test)
# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)
(文中部分内容来自GPT4.0生成,对我个人而言这是最重要的生产力工具之一,详细的使用教程可以参见下面这篇博客:GPT4.0使用教程)
支持向量机(SVM)
原理:
在分类问题中,支持向量机的目标是找到一个超平面,将不同类别的样本分隔开,同时使得间隔(margin)最大化。支持向量机的核心思想是利用支持向量(即距离超平面最近的样本点)来构建分类决策边界。
计算方法:
- 选择核函数:支持向量机可以使用不同的核函数来处理非线性分类问题,常用的核函数包括线性核、多项式核、高斯核等。
- 构建优化问题:支持向量机的优化问题通常是一个凸优化问题,其目标是最大化间隔,并且满足约束条件,即使得样本点被正确地分类。
- 求解优化问题:可以使用优化算法(如SMO算法、梯度下降等)来求解支持向量机的优化问题,得到最优的分类超平面和支持向量。
- 预测:利用训练得到的模型,对新的样本进行分类预测,根据样本到超平面的距离来判断其所属类别。
核函数的作用
- 将数据映射到高维空间: 核函数将原始输入空间中的数据映射到一个更高维的特征空间中,使得原本线性不可分的问题变得线性可分。这种映射通常是非线性的,因此可以将低维空间中复杂的数据结构映射到高维空间中的简单结构。
- 构建非线性决策边界: 在高维特征空间中,线性分类器(如超平面)能够更容易地将数据分开,从而构建一个非线性决策边界。这使得 SVM 能够处理非线性分类问题,并且具有很强的泛化能力。
- 避免计算高维空间的复杂性: 尽管核函数将数据映射到了高维空间,但 SVM 的优化问题仍然是在原始输入空间中求解的。核函数的巧妙之处在于它们通过内积计算的方式,避免了显式地计算高维特征空间中的数据点,从而减少了计算的复杂性。
SVM怎么解决多分类问题?
支持向量机(Support Vector Machine,SVM)最初是用于解决二分类问题的,但可以通过一些技巧扩展到多分类问题。下面是一些常用的方法:
- 一对一(One-vs-One)方法: 这种方法将每个类别的样本分为一组,然后构建一对一的二分类器。也就是说,对于K个类别,将会构建K*(K-1)/2个分类器。当需要进行分类时,每个分类器投票给一个类别,最终选择得票最多的类别作为样本的分类结果。
- 一对其余(One-vs-Rest)方法: 这种方法将每个类别的样本作为一个类别,而其他所有类别的样本作为另一个类别。然后构建K个二分类器,每个分类器都是将一个类别的样本与其他所有类别的样本进行区分。在预测时,选择具有最高置信度的类别作为样本的分类结果。
- 多类别SVM: 一些SVM库和算法可以直接处理多分类问题。例如,LibSVM库中的多类别分类器就支持直接处理多分类问题。这些算法在内部实现了类似于一对一或者一对其余的策略,但是更高效并且对参数调整更加友好。
Python
# 导入所需的库
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 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('模型准确率:', accuracy)
随机森林
原理:
随机森林由多个决策树组成,每个决策树都是基于随机抽取的样本和随机选择的特征进行训练的。最终的分类或回归结果是基于所有决策树的投票或平均得到的。
什么是决策树
- 决策树算法是一种基于树形结构的分类和预测模型。
- 决策树的每个节点代表一种决策,每个分支代表一个可能的结果。
- 通过计算不同的属性值和分类标签之间的信息增益或者基尼指数,决策树算法能够自动检测出最相关的属性并以此来判断分类标签。
计算方法:
- 随机抽样训练样本:从原始训练数据集中随机抽取一定比例的样本,用于训练每棵决策树。
- 随机选择特征:对于每棵决策树的每个节点,随机选择一定数量的特征进行分裂。
- 构建决策树:利用随机抽样的训练样本和随机选择的特征,构建多棵决策树。每棵树都会根据特征的信息增益或基尼系数等准则进行分裂,直到达到停止条件为止。
- 集成预测:对于分类任务,采用多数投票的方式;对于回归任务,采用平均值的方式,将所有决策树的预测结果进行集成,得到最终的预测结果。
两处随机
- 在构建森林的时候每一棵树用一个随机抽样的数据集
- 在构建树的过程中每次分裂都使用特征的一个随机子集。
随机森林不需要标准化
随机森林算法不受输入特征的尺度影响,因为它是基于决策树的集成学习算法。决策树的分裂点并不依赖于特征的尺度,而是根据数据的不纯度来选择最佳的分裂点。因此,对特征进行标准化或归一化不会对随机森林的性能产生明显影响。
XGBoost和随机森林区别
XGBoost | 随机森林 | |
---|---|---|
基础学习器 | 梯度提升决策树,每棵树的构建是通过迭代拟合残差 | 多棵决策树,每棵树独立建立,通过随机选择特征和样本来构建不同的树,然后将它们的结果进行集成 |
集成方式 | 加法模型,通过组合多个弱学习器得到一个强大的模型。每个弱学习器都是在前面学习器的基础上,通过梯度下降的方式来最小化损失函数。 | 随机森林采用投票或平均的方式对多棵决策树的结果进行集成,对于分类问题采用多数投票,对于回归问题采用平均值。 |
参数 | 学习率、树的深度、子采样比例等 | 决策树的数量、每棵树的最大深度等 |
性能 | 更适用大规模数据、高维稀疏数据 | 更适用于相对低维、特征较少 |
Python
# 导入所需的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 加载示例数据集
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)
# 创建随机森林分类器对象
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
# 使用训练数据拟合模型
rf_classifier.fit(X_train, y_train)
# 使用模型进行预测
y_pred = rf_classifier.predict(X_test)
# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)
XGBoost
原理:
通过迭代地训练决策树模型,并利用梯度下降的方法来最小化损失函数。在每一轮迭代中,XGBoost 首先计算出当前模型的梯度和二阶导数,然后构建一个新的决策树模型来拟合这些梯度和二阶导数,以减小损失函数。最终,多个决策树模型的预测结果进行加权平均得到最终的预测结果。
计算方法:
-
- 初始化预测值:首先,将所有样本的预测值初始化为一个常数,通常选择训练数据中的目标变量的平均值。
- 迭代训练决策树:通过多轮迭代,每轮迭代都训练一个新的决策树模型,以最小化损失函数。
- 计算损失函数的一阶和二阶导数:对于给定的目标变量和当前模型的预测值,计算损失函数的一阶导数(梯度)和二阶导数(Hessian矩阵)。
- 构建决策树模型:基于损失函数的一阶和二阶导数,构建一个新的决策树模型,使得在每个叶子节点上的值最小化损失函数。
- 更新预测值:利用新构建的决策树模型更新所有样本的预测值。
- 重复迭代:重复以上步骤,直到达到预定的迭代次数,或者达到损失函数的停止条件。
XGBoost和随机森林区别
XGBoost | 随机森林 | |
---|---|---|
基础学习器 | 梯度提升决策树,每棵树的构建是通过迭代拟合残差 | 多棵决策树,每棵树独立建立,通过随机选择特征和样本来构建不同的树,然后将它们的结果进行集成 |
集成方式 | 加法模型,通过组合多个弱学习器得到一个强大的模型。每个弱学习器都是在前面学习器的基础上,通过梯度下降的方式来最小化损失函数。 | 随机森林采用投票或平均的方式对多棵决策树的结果进行集成,对于分类问题采用多数投票,对于回归问题采用平均值。 |
参数 | 学习率、树的深度、子采样比例等 | 决策树的数量、每棵树的最大深度等 |
性能 | 更适用大规模数据、高维稀疏数据 | 更适用于相对低维、特征较少 |
boosting算法属于串行,为什么xgboost可以并行训练
-
- 特征并行:将特征按照列进行切分,每个处理器负责处理一部分特征,可以加速特征的处理过程。
- 数据并行:将数据按照行进行切分,每个处理器负责处理一部分数据,可以加速模型的训练过程。
- 基学习器并行:Xgboost算法支持多线程训练,可以同时训练多个基学习器,加快训练速度。
- 分布式训练:Xgboost算法支持分布式训练,可以将数据分布在多台机器上进行训练,进一步加速训练速度。
xgboost怎么解决样本不均衡问题
-
- 采样方法:欠采样或过采样
- 调整样本权重:
调整样本权重
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假设 X_train, y_train 是训练集的特征和标签
# X_test, y_test 是测试集的特征和标签
# 将数据转换为 DMatrix 格式
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置样本权重
# 假设客户流失的样本权重为 5,客户不流失的样本权重为 1
weight = [5 if label == 1 else 1 for label in y_train]
# 定义参数
params = {
'objective': 'binary:logistic',
'eval_metric': 'error',
# 设置正例的权重
'scale_pos_weight': sum(y_train == 0) / sum(y_train == 1),
}
# 训练模型
bst = xgb.train(params, dtrain, num_boost_round=100, evals=[(dtest, 'test')], early_stopping_rounds=10, verbose_eval=False)
# 在测试集上进行预测
y_pred = bst.predict(dtest)
y_pred_binary = [1 if p > 0.5 else 0 for p in y_pred]
# 计算准确率
accuracy = accuracy_score(y_test, y_pred_binary)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
Python:
# 导入所需的库
import xgboost as xgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载示例数据集
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)
# 构建 XGBoost 分类器对象
xgb_classifier = xgb.XGBClassifier()
# 使用训练数据拟合模型
xgb_classifier.fit(X_train, y_train)
# 使用模型进行预测
y_pred = xgb_classifier.predict(X_test)
# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print('模型准确率:', accuracy)
总结
本期内容主要介绍了回归算法。作为有监督算法的一种,回归算法是最常见、最重要也是在业务场景中使用的最多的一类机器学习算法,在保研考研复试和数据分析等岗位面试中经常出现,非常值得深入研究。
文中部分内容来自GPT4.0生成,对我个人而言这是最重要的生产力工具之一,详细的使用教程可以参见下面这篇博客:
GPT4.0使用教程