机器学习教程¶
一、机器学习基础知识¶
1.1 什么是机器学习¶
机器学习是一种让计算机通过数据学习并自动改进性能的技术。它通过算法从数据中提取模式和规律,从而进行预测或决策。
1.2 机器学习的类型¶
机器学习主要分为三种类型:
- 监督学习:通过标注数据进行训练,常用于分类和回归任务
- 无监督学习:通过未标注数据进行训练,常用于聚类和降维任务
- 强化学习:通过与环境交互进行学习,常用于游戏和机器人控制
1.3 机器学习的基本流程¶
- 数据收集:获取相关数据
- 数据预处理:清洗和转换数据
- 特征工程:选择和提取有用特征
- 模型选择:选择合适的算法
- 模型训练:使用训练数据进行模型训练
- 模型评估:使用测试数据评估模型性能
- 模型优化:调整模型参数以提高性能
- 部署与监控:将模型应用于实际场景并持续监控
二、模型评估方法与准则¶
2.1 评估指标¶
评估模型性能的指标有很多,选择合适的指标取决于具体的任务和数据集。
常用的评估指标包括:
- 准确率(Accuracy)
- 精确率(Precision)
- 召回率(Recall)
- F1分数(F1 Score)
- ROC曲线和AUC值
- 均方误差(Mean Squared Error, MSE)
- 平均绝对误差(Mean Absolute Error, MAE)
- 平均绝对百分误差 MAPE
- R²(决定系数)
分类任务指标¶
- 准确率(Accuracy):正确预测的样本数占总样本数的比例。
- 精确率(Precision):预测为正类的样本中实际为正类的比例。
- 召回率(Recall):实际为正类的样本中被正确预测为正类的比例。
- F1分数(F1 Score):精确率和召回率的调和平均数。
- ROC曲线和AUC值:评估分类模型在不同阈值下的性能。
混淆矩阵(Confusion Matrix)¶
混淆矩阵是用于评估分类模型性能的工具,显示了实际类别与预测类别的对比情况。对于二分类问题,混淆矩阵通常包含以下四个部分:
预测为正类 (Positive) | 预测为负类 (Negative) | |
---|---|---|
实际为正类 (Positive) | True Positive (TP) | False Negative (FN) |
实际为负类 (Negative) | False Positive (FP) | True Negative (TN) |
准确率(Accuracy)¶
其中,TP(True Positive)表示真正例,TN(True Negative)表示真反例,FP(False Positive)表示假正例,FN(False Negative)表示假反例。
精确率(Precision)¶
召回率(Recall)¶
F1分数(F1 Score)¶
ROC曲线和AUC值¶
ROC曲线(Receiver Operating Characteristic Curve)是通过改变分类阈值绘制的真阳性率(TPR)与假阳性率(FPR)之间的关系图。AUC(Area Under the Curve)值表示ROC曲线下的面积,范围在0到1之间,值越大表示模型性能越好。
回归任务指标¶
- 均方误差(Mean Squared Error, MSE):预测值与实际值之间差异的平方的平均值。
- 平均绝对误差(Mean Absolute Error, MAE):预测值与实际值之间差异的绝对值的平均值。
- 平均绝对百分误差 MAPE:预测值与实际值之间差异的绝对值占实际值的百分比的平均值。
- R²(决定系数):衡量模型解释数据变异的能力。
均方误差(Mean Squared Error, MSE)¶
其中,\(y_i\) 是实际值,\(\hat{y}_i\) 是预测值,\(n\) 是样本数量。
平均绝对误差(Mean Absolute Error, MAE)¶
平均绝对百分误差(Mean Absolute Percentage Error, MAPE)¶
R²(决定系数)¶
其中,\(\bar{y}\) 是实际值的均值。
不平衡数据集处理¶
对于不平衡数据集,单一的准确率可能会误导模型性能评估。此时,精确率、召回率和F1分数等指标更为重要。
2.2 交叉验证¶
交叉验证是一种评估模型性能的技术,通过将数据集划分为多个子集,轮流使用其中一个子集作为测试集,其余子集作为训练集。常见的交叉验证方法有:
- K折交叉验证(K-Fold Cross-Validation)
- 留一法交叉验证(Leave-One-Out Cross-Validation)
- 分层K折交叉验证(Stratified K-Fold Cross-Validation)
K折交叉验证(K-Fold Cross-Validation)¶
K折交叉验证将数据集划分为K个子集,轮流使用每个子集作为测试集,其余子集作为训练集。最终的模型性能是K次评估结果的平均值。
留一法交叉验证(Leave-One-Out Cross-Validation)¶
留一法交叉验证是K折交叉验证的特例,其中K等于样本数量。每次使用一个样本作为测试集,其余样本作为训练集。适用于小数据集,但计算成本较高。
分层K折交叉验证(Stratified K-Fold Cross-Validation)¶
分层K折交叉验证在划分数据集时,保持各类样本的比例与原始数据集一致,适用于分类任务中的不平衡数据集。
2.3 模型选择与调优¶
选择合适的模型和调优模型参数是提高模型性能的关键步骤。常用的方法包括:
- 网格搜索(Grid Search)
- 随机搜索(Random Search)
- 贝叶斯优化(Bayesian Optimization)
- 超参数调优(Hyperparameter Tuning)
网格搜索(Grid Search)¶
网格搜索通过定义一组超参数的取值范围,遍历所有可能的组合,找到性能最优的参数组合。适用于参数空间较小的情况。
随机搜索(Random Search)¶
随机搜索从定义的超参数空间中随机采样一定数量的参数组合,评估其性能。适用于参数空间较大的情况,计算效率较高。
贝叶斯优化(Bayesian Optimization)¶
贝叶斯优化通过构建代理模型,利用已有的评估结果指导下一次的参数选择,逐步逼近最优参数组合。适用于计算成本较高的情况。
超参数调优(Hyperparameter Tuning)¶
超参数调优是指调整模型的超参数(如学习率、正则化参数等)以优化模型性能。可以结合上述方法进行调优。
2.4 模型解释性¶
模型解释性是指理解和解释模型的决策过程,帮助用户信任和使用模型。常用的方法包括:
- 特征重要性(Feature Importance)
- 局部解释模型(LIME)
- SHAP值(SHapley Additive exPlanations)
特征重要性(Feature Importance)¶
特征重要性评估每个特征对模型预测的贡献,常用于树模型。可以通过查看特征重要性排名,了解哪些特征对模型影响最大。
局部解释模型(LIME)¶
LIME通过在局部区域拟合简单模型,解释复杂模型的预测结果。适用于任何类型的模型,帮助理解单个预测的原因。
SHAP值(SHapley Additive exPlanations)¶
SHAP值基于博弈论,量化每个特征对预测结果的贡献。提供全局和局部的解释,适用于各种模型类型。
2.5 模型部署¶
什么是模型部署?¶
- 训练阶段:你在本地用数据训练出模型(比如 sklearn、PyTorch、TensorFlow)。
- 部署阶段:让别人能使用模型,通常通过:
- 本地调用(Python 脚本或 Notebook)
- 打包 API 服务(Flask/FastAPI/Triton)
- 容器化 & 云部署(Docker + Kubernetes + 云服务)
- 前端/移动端集成(ONNX/TensorRT/TF Lite)
1、本地部署¶
适合学习和小规模测试。
方式:直接保存模型,再加载调用。
import joblib
from sklearn.linear_model import LogisticRegression
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 保存模型
joblib.dump(model, "model.pkl")
# 加载模型
loaded_model = joblib.load("model.pkl")
print(loaded_model.predict(X_test))
2、API 服务化部署¶
API 服务化部署.
FastAPI 部署¶
from fastapi import FastAPI
import joblib
app = FastAPI()
model = joblib.load("model.pkl")
@app.post("/predict")
def predict(features: list[float]):
pred = model.predict([features])
return {"prediction": int(pred[0])}
uvicorn app:app --reload
3、容器化部署¶
当你需要在不同机器上运行,或部署到云端时,使用 Docker。
Dockerfile 示例
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t ml-api .
docker run -p 8000:8000 ml-api
4、云端部署¶
常见选择¶
- AWS Sagemaker:官方托管服务,支持自动伸缩。
- Google Vertex AI:适合 TensorFlow、PyTorch。
- Azure ML:企业友好。
- Hugging Face Spaces:免费快速搭建。
- Render/Heroku:快速 Web 服务部署。
Hugging Face Spaces 示例(Gradio)¶
import gradio as gr
import joblib
model = joblib.load("model.pkl")
def predict(features):
return int(model.predict([features])[0])
iface = gr.Interface(fn=predict, inputs="text", outputs="label")
iface.launch()
5、高性能推理¶
当模型较大时,需要优化:
- ONNX Runtime(跨平台推理)
- TensorRT(NVIDIA GPU 加速)
- Triton Inference Server(大规模部署)
- vLLM(大模型推理优化)
三、KNN算法¶
KNN(K-Nearest Neighbors)算法是一种基于实例的监督学习算法,常用于分类和回归任务。其基本思想是通过计算样本之间的距离,找到与待预测样本最相似的K个邻居,根据邻居的类别或数值进行预测。
3.1 KNN算法原理¶
KNN算法的主要步骤包括:
- 选择合适的K值(邻居数量)
- 计算待预测样本与训练样本之间的距离(常用欧氏距离、曼哈顿距离等)
- 找到距离最近的K个邻居
- 根据邻居的类别或数值进行预测(分类任务中采用多数投票法,回归任务中采用平均值)
距离度量方法¶
- 欧氏距离(Euclidean Distance):
- 曼哈顿距离(Manhattan Distance):
- 闵可夫斯基距离(Minkowski Distance):
- 余弦相似度(Cosine Similarity):
3.2 KNN算法优缺点¶
优点¶
- 简单易懂,易于实现
- 无需训练过程,适合小数据集
- 可以处理多分类问题
缺点¶
- 计算复杂度高,适合小数据集
- 对噪声和异常值敏感
- 需要选择合适的K值和距离度量方法
- 维度灾难问题,随着特征数量增加,距离计算效果下降
3.3 KNN算法应用场景¶
KNN算法适用于以下场景:
- 分类任务,如文本分类、图像识别等
- 回归任务,如房价预测、股票价格预测等
- 推荐系统,如电影推荐、商品推荐等
- 异常检测,如信用卡欺诈检测、网络入侵检测等
3.4 KNN算法实现¶
以下是使用Python和Scikit-learn库实现KNN算法的示例代码:
import numpy as np
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,confusion_matrix,ConfusionMatrixDisplay
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 加载数据集
data = load_iris()
X = data.data
y = data.target
print("特征名称:",data.feature_names)
print("目标值:",data.target_names)
# 拆分训练数据和测试数据
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print("训练集形状:",x_train.shape)
print("测试集形状:",x_test.shape)
# 标准化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 训练模型
knn = KNeighborsClassifier(n_neighbors=3,n_jobs=-1)
knn.fit(x_train,y_train)
# 模型评估
y_pred = knn.predict(x_test)
print("混淆矩阵".center(80,"="))
cm = confusion_matrix(y_true=y_test,y_pred=y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
plt.show()
print("分类报告".center(80,"="))
print(classification_report(y_true=y_test,y_pred=y_pred))
KNeighborsClassifier
是 scikit-learn 中基于 k-近邻(k-NN)算法的分类模型,通过计算待预测样本与训练集中最近邻样本的距离进行分类。以下是其核心参数的详细说明:
1. n_neighbors
¶
- 类型:
int
,默认值5
- 作用:指定分类时参考的“最近邻”样本数量(k值)。
- 说明:
- k值越小,模型对噪声越敏感,可能过拟合;k值越大,模型平滑性增强,但可能忽略局部特征。
- 通常通过交叉验证(如网格搜索)选择最优k值。
2. weights
¶
- 类型:
str
或callable
,可选值'uniform'
(默认)、'distance'
或自定义函数 - 作用:指定邻居样本的权重计算方式。
- 说明:
'uniform'
:所有邻居权重相同,直接按多数投票分类。'distance'
:权重与距离成反比(距离越近权重越大),即weight = 1 / distance
。callable
:自定义权重函数,输入距离数组,返回对应的权重数组。
3. algorithm
¶
- 类型:
str
,可选值'auto'
(默认)、'ball_tree'
、'kd_tree'
、'brute'
- 作用:指定计算最近邻的算法。
- 说明:
'auto'
:根据数据规模和维度自动选择(小数据用'brute'
,高维数据用树结构)。'brute'
:暴力搜索(遍历所有样本计算距离),适用于低维小数据集。'kd_tree'
/'ball_tree'
:基于树结构的高效搜索(KD树适合低维数据,Ball树适合高维数据)。
4. leaf_size
¶
- 类型:
int
,默认值30
- 作用:树结构(
kd_tree
/ball_tree
)的叶节点大小。 - 说明:
- 叶节点越小,树结构越复杂,查询速度越快但内存占用更高;反之则相反。
- 仅在
algorithm='kd_tree'
或'ball_tree'
时生效。
5. p
¶
- 类型:
int
,默认值2
- 作用:Minkowski距离的幂次参数(仅当
metric='minkowski'
时生效)。 - 说明:
p=1
:等价于曼哈顿距离(L1距离):|x1 - x2| + |y1 - y2|
。p=2
:等价于欧几里得距离(L2距离):√[(x1-x2)² + (y1-y2)²]
。p>2
:高阶 Minkowski 距离,如p=∞
时接近切比雪夫距离。
6. metric
¶
- 类型:
str
或callable
,默认值'minkowski'
- 作用:指定距离度量方式。
- 常用取值:
'euclidean'
:欧几里得距离(等价于metric='minkowski'
且p=2
)。'manhattan'
:曼哈顿距离(等价于metric='minkowski'
且p=1
)。'chebyshev'
:切比雪夫距离(max(|x1-x2|, |y1-y2|)
)。'cosine'
:余弦相似度(常用于文本分类等稀疏数据)。'precomputed'
:输入为预计算的距离矩阵(此时X
需是n_samples x n_samples
的距离矩阵)。
7. metric_params
¶
- 类型:
dict
,可选(默认None
) - 作用:传递给距离度量函数的额外参数(如自定义距离函数的参数)。
8. n_jobs
¶
- 类型:
int
,可选(默认None
) - 作用:指定并行计算的线程数。
- 说明:
None
:使用1个线程;-1
:使用所有可用CPU核心;n
:使用n
个核心。- 加速邻居搜索和预测过程(训练阶段无并行)。
参数使用示例¶
from sklearn.neighbors import KNeighborsClassifier
# 初始化模型:k=5,距离权重,欧几里得距离,并行计算
knn = KNeighborsClassifier(
n_neighbors=5,
weights='distance',
metric='euclidean',
n_jobs=-1
)
关键参数总结¶
- 核心调优参数:
n_neighbors
(k值)、weights
(权重方式)、metric
(距离度量)。 - 效率相关参数:
algorithm
(搜索算法)、leaf_size
(树结构参数)、n_jobs
(并行)。
根据数据规模(样本量、维度)和分布选择合适参数,通常需结合交叉验证优化。
3.5 KNN算法调优¶
KNN算法的性能受K值和距离度量方法的影响。可以通过交叉验证和网格搜索等方法调优K值,选择最佳的距离度量方法(如欧氏距离、曼哈顿距离等)以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_neighbors': np.arange(1, 20)}
# 创建KNN模型
knn = KNeighborsClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(knn, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_knn = grid_search.best_estimator_
best_knn.fit(X_train, y_train)
# 预测
y_pred = best_knn.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
3.6 KNN算法扩展¶
KNN算法可以与其他技术结合使用,如加权KNN(根据距离加权邻居的贡献)、局部敏感哈希(加速高维数据的邻居搜索)等,以提高算法的性能和适用性。
四、逻辑回归算法¶
逻辑回归(Logistic Regression)是一种广泛应用于分类任务的统计模型,特别适用于二分类问题。它通过估计事件发生的概率来进行分类决策。尽管名称中包含“回归”,但逻辑回归实际上是一种分类算法。
4.1 逻辑回归算法原理¶
逻辑回归是一种广泛应用于二分类问题的监督学习算法,其核心原理包括以下几个关键部分:
- 线性组合与Sigmoid函数
- 线性组合:逻辑回归首先将输入特征进行线性组合,形成一个线性方程:\(z = w_1x_1 + w_2x_2 + \ldots + w_nx_n + b\),其中\(w_i\)为权重,\(b\)为偏置项,\(x_i\)为输入特征。
- Sigmoid函数:将线性组合的结果\(z\)代入Sigmoid函数,将其映射到0到1之间的概率值:\(p = \frac{1}{1 + e^{-z}}\)。\(p\)表示样本属于正类的概率。
- 决策边界与阈值
- 决策边界:通过Sigmoid函数,逻辑回归定义了一个决策边界,通常是一个线性超平面,用于区分不同类别。
- 阈值设定:设定一个阈值(如0.5),当预测概率\(p\)大于等于阈值时,判定为正类;否则为负类。
- 损失函数与优化
- 交叉熵损失:逻辑回归使用交叉熵损失函数衡量预测概率与真实标签的差异: $ L(y, \hat{y}) = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] $
- 优化算法:通过梯度下降、牛顿法等优化算法,最小化损失函数,求解最优的权重\(w\)和偏置\(b\)。
- 概率解释与模型评估
- 概率输出:逻辑回归不仅输出类别预测,还提供概率估计,便于理解模型的置信度。
- 评估指标:使用准确率、精确率、召回率、F1分数、ROC曲线和AUC值等指标评估模型性能。
逻辑回归通过最大化似然函数来估计模型参数,常用的优化算法包括梯度下降和牛顿法。分类决策通常基于概率阈值(如0.5),即当 \(P(Y=1|X) > 0.5\) 时预测为正类,否则为负类。
4.2 逻辑回归算法优缺点¶
优点¶
- 简单易懂,易于实现
- 计算效率高,适合大规模数据集
- 输出概率值,便于解释和理解
- 可以处理多分类问题(通过一对多或一对一策略)
缺点¶
- 只能处理线性可分问题,非线性关系需特征工程
- 对异常值敏感,可能影响模型性能
- 需要较大的样本量以获得稳定的参数估计
4.3 逻辑回归算法应用场景¶
逻辑回归算法适用于以下场景:
- 二分类任务,如垃圾邮件检测、疾病预测等
- 多分类任务,如手写数字识别、图像分类等
- 风险评估,如信用评分、欺诈检测等
- 市场营销,如客户流失预测、用户行为分析等
4.4 逻辑回归算法实现¶
以下是使用Python和Scikit-learn库实现逻辑回归算法的示例代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = (data.target == 2).astype(int) # 二分类任务,将类别2作为正类
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建逻辑回归模型
log_reg = LogisticRegression()
# 训练模型
log_reg.fit(X_train, y_train)
# 预测
y_pred = log_reg.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
参数详解¶
- penalty
- 作用:指定正则化类型。
- 可选值:
'l1'
(L1正则化)、'l2'
(L2正则化,默认值)、'elasticnet'
(弹性网正则化)、'none'
(无正则化)。 - 说明:
- L1正则化倾向于产生稀疏权重,适用于特征选择。
- L2正则化能防止过拟合,适用于特征间存在相关性的情况。
- 弹性网正则化结合了L1和L2正则化。
- C
- 作用:正则化强度的倒数,值越小,正则化强度越大。
- 默认值:
1.0
。 - 取值范围:正浮点数。
- dual
- 作用:选择求解原始问题还是对偶问题。
- 可选值:
True
或False
(默认值)。 - 说明:仅当
penalty='l2'
且solver='liblinear'
时有效。若样本数大于特征数,建议设为False
。
- solver
- 作用:选择优化算法。
- 可选值:
'newton-cg'
:牛顿法。'lbfgs'
:拟牛顿法(默认值)。'liblinear'
:坐标下降法。'sag'
:随机平均梯度下降法。'saga'
:SAGA算法。
- 说明:
'liblinear'
适用于小数据集,支持L1正则化。'sag'
和'saga'
适用于大数据集。'newton-cg'
、'lbfgs'
仅支持L2正则化。
- max_iter
- 作用:最大迭代次数。
- 默认值:
100
。 - 说明:若模型未收敛,可适当增大该值。
- multi_class
- 作用:多分类策略。
- 可选值:
'ovr'
:一对其余(One-vs-Rest)。'multinomial'
:多项式回归。'auto'
:自动选择。
- 说明:
'multinomial'
适用于多分类问题,需solver
支持。
- class_weight
- 作用:类别权重。
- 可选值:
None
:所有类别的权重相同。'balanced'
:自动调整权重以平衡类别频率。- 字典:手动指定类别权重。
- 说明:用于处理类别不平衡问题。
- fit_intercept
- 作用:是否计算截距。
- 可选值:
True
(默认值)或False
。 - 说明:若设为
False
,则模型不包含截距项。
- random_state
- 作用:随机数生成器的种子。
- 默认值:
None
。 - 说明:用于保证结果的可重复性。
- tol
- 作用:收敛阈值。
- 默认值:
1e-4
。 - 说明:当损失函数的变化小于该值时,停止迭代。
- warm_start
- 作用:是否使用前一次训练的结果作为初始化。
- 可选值:
True
或False
(默认值)。 - 说明:若设为
True
,可继续训练模型。
- n_jobs
- 作用:并行计算的CPU数量。
- 默认值:
None
。 - 说明:若设为
-1
,则使用所有可用的CPU。 使用示例参数选择建议from sklearn.linear_model import LogisticRegression 创建模型实例 model = LogisticRegression( penalty='l2', 使用L2正则化 C=1.0, 正则化强度 solver='lbfgs', 使用L-BFGS优化算法 max_iter=100, 最大迭代次数 multi_class='auto', 自动选择多分类策略 class_weight='balanced' 平衡类别权重 ) 训练模型 model.fit(X_train, y_train) 预测 y_pred = model.predict(X_test)
- 小数据集:使用
solver='liblinear'
或'lbfgs'
。 - 大数据集:使用
solver='sag'
或'saga'
。 - 特征选择:使用
penalty='l1'
。 - 类别不平衡:设置
class_weight='balanced'
或手动指定权重。 通过合理设置这些参数,可以优化模型的性能和泛化能力。
4.5 逻辑回归算法调优¶
逻辑回归算法的性能受正则化参数和特征选择的影响。可以通过交叉验证和网格搜索等方法调优正则化参数(如L1、L2正则化),选择最佳的特征子集以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'C': [0.01, 0.1, 1, 10, 100], 'penalty': ['l1', 'l2']}
# 创建逻辑回归模型
log_reg = LogisticRegression(solver='liblinear') # 'liblinear' 支持 L1 正则化
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(log_reg, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_log_reg = grid_search.best_estimator_
best_log_reg.fit(X_train, y_train)
# 预测
y_pred = best_log_reg.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
4.6 逻辑回归算法扩展¶
逻辑回归算法可以与其他技术结合使用,如多项式逻辑回归(处理非线性关系)、正则化技术(防止过拟合)等,以提高算法的性能和适用性。
五、朴素贝叶斯算法¶
朴素贝叶斯(Naive Bayes)算法是一种基于贝叶斯定理的概率分类算法,适用于文本分类、垃圾邮件检测等任务。其核心思想是假设特征之间相互独立,从而简化计算过程。
5.1 朴素贝叶斯算法原理¶
朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。
贝叶斯定理¶
贝叶斯定理描述了在已知相关证据下,事件发生的概率,公式为:
其中:
- \(P(Y)\):先验概率,类别\(Y\)的初始概率。
- \(P(X|Y)\):似然概率,给定类别\(Y\)时特征\(X\)出现的概率。
- \(P(X)\):证据概率,特征\(X\)出现的总概率。
- \(P(Y|X)\):后验概率,给定特征\(X\)时类别\(Y\)的概率。
1. 疾病诊断¶
背景:某罕见疾病的患病率为1%(先验概率\(P(患病)=0.01\))。检测方法的准确率为:
- 患病者检测阳性的概率(似然\(P(阳性|患病)=0.99\))。
- 未患病者检测阳性的概率(\(P(阳性|未患病)=0.05\))。
问题:若某人检测阳性,实际患病的概率是多少(后验概率\(P(患病|阳性)\))?
计算:
- 全概率公式计算\(P(阳性)\):
- 应用贝叶斯定理:
结论:检测阳性后,实际患病概率约为16.7%,说明罕见病的阳性检测可能存在较高误诊率。
2. 垃圾邮件过滤¶
背景:已知垃圾邮件占邮件总数的30%(\(P(垃圾邮件)=0.3\))。特征词“免费”在垃圾邮件中出现的概率为50%(\(P(免费|垃圾邮件)=0.5\)),在正常邮件中出现的概率为5%(\(P(免费|正常邮件)=0.05\))。 问题:若某邮件包含“免费”,它是垃圾邮件的概率是多少?
计算:
- 计算\(P(免费)\):
- 应用贝叶斯定理:
结论:包含“免费”的邮件有81.1%的概率是垃圾邮件,有助于分类决策。
通过以上例子,可以看出贝叶斯定理如何通过先验概率和新证据,更新对事件概率的判断,从而在实际问题中做出更准确的决策。
特征条件独立假设¶
算法假设所有特征在给定类别下相互独立,即:
这一假设简化了计算,但现实中特征往往存在依赖关系。
算法步骤¶
- 计算先验概率:统计训练数据中每个类别的频率,得到\(P(Y)\)。
- 计算条件概率:对每个类别\(Y\),计算每个特征\(X\)的条件概率\(P(X|Y)\)。
- 计算后验概率:利用贝叶斯定理,结合先验概率和条件概率,计算给定特征下每个类别的后验概率\(P(Y|X)\)。
- 分类决策:选择后验概率最大的类别作为预测结果。
5.2 朴素贝叶斯算法优缺点¶
优点¶
- 简单易懂,易于实现
- 计算效率高,适合大规模数据集
- 对小样本数据表现良好
- 能处理多分类问题
缺点¶
- 假设特征独立,实际应用中可能不成立
- 对零概率问题敏感,需使用平滑技术
- 不能捕捉特征之间的复杂关系
5.3 朴素贝叶斯算法应用场景¶
朴素贝叶斯算法适用于以下场景:
- 文本分类,如垃圾邮件检测、情感分析等
- 医疗诊断,如疾病预测等
- 市场营销,如客户细分、用户行为分析等
- 推荐系统,如电影推荐、商品推荐等
5.4 朴素贝叶斯算法实现¶
以下是使用Python和Scikit-learn库实现朴素贝叶斯算法的示例代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建朴素贝叶斯模型
nb = GaussianNB()
# 训练模型
nb.fit(X_train, y_train)
# 预测
y_pred = nb.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
5.5 朴素贝叶斯算法调优¶
朴素贝叶斯算法的性能受特征选择和数据预处理的影响。可以通过选择相关特征、处理缺失值和异常值等方法提高模型性能。
from sklearn.feature_selection import SelectKBest, chi2
# 特征选择
selector = SelectKBest(chi2, k=2) # 选择前2个最佳特征
X_train_selected = selector.fit_transform(X_train, y_train)
X_test_selected = selector.transform(X_test)
# 使用选择的特征训练模型
nb.fit(X_train_selected, y_train)
# 预测
y_pred = nb.predict(X_test_selected)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
SelectKBest
和chi2
是scikit-learn库中用于特征选择的重要工具,主要用于从数据集中选择与目标变量最相关的K个特征。
SelectKBest¶
- 功能:
SelectKBest
是一个基于统计度量的单变量特征选择类,它选择与目标变量最相关的K个特征。 - 参数:
score_func
:用于评估特征相关性的函数,如卡方检验(chi2
)、F检验(f_classif
)、互信息(mutual_info_classif
)等。k
:要选择的特征数量。
- 用法:
from sklearn.feature_selection import SelectKBest 使用卡方检验作为评估函数,选择前K个最佳特征 selector = SelectKBest(score_func=chi2, k=10) X_new = selector.fit_transform(X, y)
chi2¶
- 功能:
chi2
函数用于计算特征与目标变量之间的卡方统计量和p值,适用于分类问题,要求特征值为非负数。 - 输出:返回每个特征的卡方统计量和p值,卡方统计量越大,表示特征与目标变量的相关性越强。
- 用法:
from sklearn.feature_selection import chi2 scores, pvalues = chi2(X, y)
示例¶
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, chi2
加载数据
iris = load_iris()
X, y = iris.data, iris.target
使用SelectKBest和chi2选择前2个最佳特征
selector = SelectKBest(score_func=chi2, k=2)
X_new = selector.fit_transform(X, y)
输出所选特征的索引
selected_features = selector.get_support(indices=True)
print("Selected features indices:", selected_features)
注意事项¶
- 数据预处理:在使用
chi2
之前,确保特征值为非负数,可能需要进行标准化或离散化处理。 - 特征相关性:
SelectKBest
基于单变量统计度量,可能忽略特征之间的交互作用。 - K值选择:通过交叉验证或可视化得分曲线确定最佳的K值。
通过合理使用SelectKBest
和chi2
,可以有效降低数据维度,提高模型训练效率和预测性能。
5.6 朴素贝叶斯算法扩展¶
朴素贝叶斯算法可以与其他技术结合使用,如多项式朴素贝叶斯(处理文本数据)、贝叶斯网络(捕捉特征之间的关系)等,以提高算法的性能和适用性。
六、决策树模型¶
决策树(Decision Tree)是一种基于树形结构的监督学习算法,适用于分类和回归任务。其核心思想是通过一系列的决策规则将数据划分为不同的类别或数值范围。
6.1 决策树模型原理¶
决策树模型是一种基于树状结构的监督学习算法,用于分类和回归任务。其原理主要包括以下步骤:
模型结构¶
- 根节点:树的起点,包含所有样本数据,是第一个特征判断的起点。
- 内部节点:表示对某个特征的判断条件,每个内部节点会根据特征值分裂为多个子节点。
- 分支:连接节点的线段,代表特征判断的结果。
- 叶子节点:树的终点,输出最终的预测结果。
特征选择¶
- 目标:选择最优特征进行节点分裂,以提高子节点的纯度。
- 衡量指标:
- 信息熵:度量数据集的不确定性,熵值越低,纯度越高。
- 信息增益:基于熵的计算,选择信息增益最大的特征进行分裂。
- 基尼指数:衡量数据集的不纯度,基尼指数越小,纯度越高。
信息熵(Entropy)¶
- 定义:信息熵是度量样本集合纯度的指标,表示数据的混乱程度。熵值越小,数据纯度越高。
- 公式:
- \(Ent(D) = -\sum_{k=1}^{|y|} p_k \log_2 p_k\)
- 其中,\(p_k\)是样本集合\(D\)中第\(k\)类样本所占的比例。
- 作用:在决策树算法中,信息熵用于计算节点的纯度,选择最优特征进行划分。
信息增益(Information Gain)¶
- 定义:信息增益是使用某个特征对数据集进行划分后,信息熵的减少量。信息增益越大,说明该特征对分类的贡献越大。
- 公式:
- \(Gain(D, a) = Ent(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|} Ent(D^v)\)
- 其中,\(a\)是特征,\(V\)是特征\(a\)的可能取值个数,\(D^v\)是特征\(a\)取值为\(v\)的样本子集。
- 作用:在ID3决策树算法中,选择信息增益最大的特征作为划分依据。
基尼指数(Gini Index)¶
- 定义:基尼指数是度量数据集不纯度的指标,表示从数据集中随机抽取两个样本类别标记不一致的概率。基尼指数越小,数据纯度越高。
- 公式:
- \(Gini(D) = 1 - \sum_{k=1}^{|y|} p_k^2\)
- 其中,\(p_k\)是样本集合\(D\)中第\(k\)类样本所占的比例。
- 作用:在CART(分类与回归树)决策树算法中,选择基尼指数最小的特征进行划分。
总结¶
- 信息熵和基尼指数:都是衡量数据纯度的指标,值越小,纯度越高8。
- 信息增益:用于衡量特征划分对纯度提升的效果,值越大,特征的分类能力越强。
- 应用场景:
- ID3算法:使用信息增益选择特征。
- C4.5算法:使用信息增益率(信息增益与特征固有值的比值)选择特征。
- CART算法:使用基尼指数选择特征。
树的生成¶
- 初始节点:将所有样本视为初始节点。
- 最优分割:计算每个特征的最优分割点,选择提升纯度最大的分割方式。
- 递归分裂:根据最优分割点将数据集划分为子集,递归地对子集重复上述过程。
- 停止条件:当子节点足够“纯”或满足预设条件(如达到最大深度、样本数小于阈值)时停止分裂。
剪枝处理¶
- 目的:防止过拟合,提高模型泛化能力。
- 方法:
- 预剪枝:在树的生长过程中设定指标,达到指标时停止生长。
- 后剪枝:先充分生长,再合并相邻叶节点,减少树的复杂度。
决策树模型通过递归地选择最优特征进行分裂,构建树状结构,实现对数据的分类或回归。其优点是易于理解和解释,但对连续字段和时间序列数据处理能力较弱。
6.2 决策树模型优缺点¶
优点¶
- 易于理解和解释,直观展示决策过程
- 计算效率高,适合大规模数据集
- 能处理多分类问题
- 能处理缺失值和异常值
- 可处理数值型和类别型特征
缺点¶
- 容易过拟合,需剪枝等技术防止
- 对噪声敏感,可能影响模型性能
- 不能捕捉特征之间的复杂关系
- 决策边界为轴平行,可能不适合某些数据分布
6.3 决策树模型应用场景¶
决策树模型适用于以下场景:
- 分类任务,如客户细分、信用评分等
- 回归任务,如房价预测、销售预测等
- 风险评估,如欺诈检测、信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
6.4 决策树模型实现¶
以下是使用Python和Scikit-learn库实现决策树模型的示例代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建决策树模型
dt = DecisionTreeClassifier()
# 训练模型
dt.fit(X_train, y_train)
# 预测
y_pred = dt.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
6.5 决策树模型调优¶
决策树模型的性能受树的深度和划分标准的影响。可以通过交叉验证和网格搜索等方法调优树的深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'max_depth': np.arange(1, 10), 'min_samples_split': [2, 5, 10]}
# 创建决策树模型
dt = DecisionTreeClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(dt, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_dt = grid_search.best_estimator_
best_dt.fit(X_train, y_train)
# 预测
y_pred = best_dt.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
6.6 决策树模型扩展¶
决策树模型可以与其他技术结合使用,如随机森林(集成多棵决策树)、梯度提升树(提升弱分类器)等,以提高算法的性能和适用性。
七、随机森林分类模型¶
随机森林(Random Forest)是一种集成学习算法,通过构建多棵决策树并结合其预测结果来提高模型的性能和稳定性。随机森林适用于分类和回归任务,具有较强的抗过拟合能力。
7.1 随机森林分类模型原理¶
随机森林通过以下步骤构建模型:
- 从原始数据集中有放回地抽取多个子样本集(Bootstrap采样)。
- 对每个子样本集训练一棵决策树,在每个节点划分时随机选择部分特征进行分裂。
- 对于分类任务,通过多数投票法结合所有决策树的预测结果;对于回归任务,通过平均值结合预测结果。
7.2 随机森林分类模型优缺点¶
优点¶
- 抗过拟合能力强,适合高维数据
- 计算效率高,适合大规模数据集
- 能处理多分类问题
- 能处理缺失值和异常值
- 提供特征重要性评估
缺点¶
- 模型复杂,难以解释
- 训练时间较长,尤其是树的数量较多时
- 对于某些数据分布,可能不如单棵决策树表现
7.3 随机森林分类模型应用场景¶
随机森林分类模型适用于以下场景:
- 分类任务,如客户细分、信用评分等
- 回归任务,如房价预测、销售预测等
- 风险评估,如欺诈检测、信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
- 图像分类,如手写数字识别、物体检测等
- 文本分类,如垃圾邮件检测、情感分析等
7.4 随机森林分类模型实现¶
以下是使用Python和Scikit-learn库实现随机森林分类模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建随机森林模型
rf = RandomForestClassifier(n_estimators=100) # 使用100棵树
# 训练模型
rf.fit(X_train, y_train)
# 预测
y_pred = rf.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
7.5 随机森林分类模型调优¶
随机森林分类模型的性能受树的数量和深度等参数的影响。可以通过交叉验证和网格搜索等方法调优树的数量、最大深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_estimators': [50, 100, 200], 'max_depth': np.arange(1, 10), 'min_samples_split': [2, 5, 10]}
# 创建随机森林模型
rf = RandomForestClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(rf, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_rf = grid_search.best_estimator_
best_rf.fit(X_train, y_train)
# 预测
y_pred = best_rf.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
7.6 随机森林分类模型扩展¶
随机森林分类模型可以与其他技术结合使用,如梯度提升树(提升弱分类器)、极端随机树(增加随机性)等,以提高算法的性能和适用性。
八、回归树模型¶
回归树(Regression Tree)是一种基于树形结构的监督学习算法,适用于回归任务。其核心思想是通过一系列的决策规则将数据划分为不同的数值范围,从而进行数值预测。
8.1 回归树模型原理¶
回归树通过递归地选择最优特征进行数据划分,构建一棵树形结构。每个节点表示一个特征,每个分支表示该特征的取值范围,每个叶节点表示一个数值预测结果。常用的划分标准包括均方误差(Mean Squared Error, MSE)和平均绝对误差(Mean Absolute Error, MAE)。
8.2 回归树模型优缺点¶
优点¶
- 易于理解和解释,直观展示决策过程
- 计算效率高,适合大规模数据集
- 能处理缺失值和异常值
- 可处理数值型和类别型特征
缺点¶
- 容易过拟合,需剪枝等技术防止
- 对噪声敏感,可能影响模型性能
- 不能捕捉特征之间的复杂关系
- 决策边界为轴平行,可能不适合某些数据分布
8.3 回归树模型应用场景¶
回归树模型适用于以下场景: - 回归任务,如房价预测、销售预测等 - 风险评估,如信用风险评估等 - 医疗诊断,如疾病严重程度预测等 - 市场营销,如用户行为分析、客户流失预测等
8.4 回归树模型实现¶
以下是使用Python和Scikit-learn库实现回归树模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.datasets import load_boston
# 加载数据集
data = load_boston()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建回归树模型
rt = DecisionTreeRegressor()
# 训练模型
rt.fit(X_train, y_train)
# 预测
y_pred = rt.predict(X_test)
# 评估模型
print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
print("Mean Absolute Error:", mean_absolute_error(y_test, y_pred))
8.5 回归树模型调优¶
回归树模型的性能受树的深度和划分标准的影响。可以通过交叉验证和网格搜索等方法调优树的深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'max_depth': np.arange(1, 10), 'min_samples_split': [2, 5, 10]}
# 创建回归树模型
rt = DecisionTreeRegressor()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(rt, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_rt = grid_search.best_estimator_
best_rt.fit(X_train, y_train)
# 预测
y_pred = best_rt.predict(X_test)
# 评估模型
print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
print("Mean Absolute Error:", mean_absolute_error(y_test, y_pred))
8.6 回归树模型扩展¶
回归树模型可以与其他技术结合使用,如随机森林回归(集成多棵回归树)、梯度提升回归(提升弱回归器)等,以提高算法的性能和适用性。
九、GBDT模型¶
GBDT(Gradient Boosting Decision Tree)是一种集成学习算法,通过构建多棵决策树并结合其预测结果来提高模型的性能和稳定性。GBDT适用于分类和回归任务,具有较强的抗过拟合能力。
9.1 GBDT模型原理¶
GBDT通过以下步骤构建模型:
- 初始化模型,通常使用常数值(如均值)作为初始预测值。
- 计算当前模型的残差(真实值与预测值之差)。
- 训练一棵决策树拟合残差,得到新的弱学习器。
- 将新弱学习器的预测结果加权累加到当前模型中。
- 重复步骤2-4,直到达到预定的树数量或其他停止条件。
9.2 GBDT模型优缺点¶
优点¶
- 抗过拟合能力强,适合高维数据
- 计算效率高,适合大规模数据集
- 能处理多分类问题
- 能处理缺失值和异常值
- 提供特征重要性评估
缺点¶
- 模型复杂,难以解释
- 训练时间较长,尤其是树的数量较多时
- 对于某些数据分布,可能不如单棵决策树表现
9.3 GBDT模型应用场景¶
GBDT模型适用于以下场景:
- 分类任务,如客户细分、信用评分等
- 回归任务,如房价预测、销售预测等
- 风险评估,如欺诈检测、信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
- 图像分类,如手写数字识别、物体检测等
- 文本分类,如垃圾邮件检测、情感分析等
9.4 GBDT模型实现¶
以下是使用Python和Scikit-learn库实现GBDT模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建GBDT模型
gbdt = GradientBoostingClassifier(n_estimators=100) # 使用100棵树
# 训练模型
gbdt.fit(X_train, y_train)
# 预测
y_pred = gbdt.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
9.5 GBDT模型调优¶
GBDT模型的性能受树的数量和深度等参数的影响。可以通过交叉验证和网格搜索等方法调优树的数量、最大深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_estimators': [50, 100, 200], 'max_depth': np.arange(1, 10), 'min_samples_split': [2, 5, 10]}
# 创建GBDT模型
gbdt = GradientBoostingClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(gbdt, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_gbdt = grid_search.best_estimator_
best_gbdt.fit(X_train, y_train)
# 预测
y_pred = best_gbdt.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
9.6 GBDT模型扩展¶
GBDT模型可以与其他技术结合使用,如XGBoost(极端梯度提升)、LightGBM(轻量级梯度提升)等,以提高算法的性能和适用性。
十、XGBoost模型¶
XGBoost(Extreme Gradient Boosting)是一种高效的梯度提升决策树(GBDT)实现,广泛应用于分类和回归任务。它通过优化计算效率和模型性能,成为许多机器学习竞赛中的首选算法。
10.1 XGBoost模型原理¶
XGBoost基于GBDT的原理,通过以下步骤构建模型:
- 初始化模型,通常使用常数值(如均值)作为初始预测值。
- 计算当前模型的残差(真实值与预测值之差)。
- 训练一棵决策树拟合残差,得到新的弱学习器。
- 将新弱学习器的预测结果加权累加到当前模型中。
- 重复步骤2-4,直到达到预定的树数量或其他停止条件。
10.2 XGBoost模型优缺点¶
优点¶
- 高效的计算性能,适合大规模数据集
- 抗过拟合能力强,适合高维数据
- 能处理多分类问题
- 能处理缺失值和异常值
- 提供特征重要性评估
- 支持并行计算和分布式计算
缺点¶
- 模型复杂,难以解释
- 训练时间较长,尤其是树的数量较多时
- 对于某些数据分布,可能不如单棵决策树表现
10.3 XGBoost模型应用场景¶
XGBoost模型适用于以下场景:
- 分类任务,如客户细分、信用评分等
- 回归任务,如房价预测、销售预测等
- 风险评估,如欺诈检测、信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
- 图像分类,如手写数字识别、物体检测等
- 文本分类,如垃圾邮件检测、情感分析等
10.4 XGBoost模型实现¶
以下是使用Python和XGBoost库实现XGBoost模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from xgboost import XGBClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建XGBoost模型
xgb = XGBClassifier(n_estimators=100) # 使用100棵树
# 训练模型
xgb.fit(X_train, y_train)
# 预测
y_pred = xgb.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
10.5 XGBoost模型调优¶
XGBoost模型的性能受树的数量和深度等参数的影响。可以通过交叉验证和网格搜索等方法调优树的数量、最大深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_estimators': [50, 100, 200], 'max_depth': np.arange(1, 10), 'learning_rate': [0.01, 0.1, 0.2], 'subsample': [0.6, 0.8, 1.0]}
# 创建XGBoost模型
xgb = XGBClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(xgb, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_xgb = grid_search.best_estimator_
best_xgb.fit(X_train, y_train)
# 预测
y_pred = best_xgb.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
10.6 XGBoost模型扩展¶
XGBoost模型可以与其他技术结合使用,如LightGBM(轻量级梯度提升)、CatBoost(处理类别特征)等,以提高算法的性能和适用性。 - 'minkowski'
:闵可夫斯基距离(默认值,
十一、LightGBM模型¶
LightGBM(Light Gradient Boosting Machine)是一种高效的梯度提升决策树(GBDT)实现,广泛应用于分类和回归任务。它通过优化计算效率和模型性能,成为许多机器学习竞赛中的首选算法。
11.1 LightGBM模型原理¶
LightGBM基于GBDT的原理,通过以下步骤构建模型:
- 初始化模型,通常使用常数值(如均值)作为初始预测值。
- 计算当前模型的残差(真实值与预测值之差)。
- 训练一棵决策树拟合残差,得到新的弱学习器。
- 将新弱学习器的预测结果加权累加到当前模型中。
- 重复步骤2-4,直到达到预定的树数量或其他停止条件。
11.2 LightGBM模型优缺点¶
优点¶
- 高效的计算性能,适合大规模数据集
- 抗过拟合能力强,适合高维数据
- 能处理多分类问题
- 能处理缺失值和异常值
- 提供特征重要性评估
- 支持并行计算和分布式计算
- 采用基于直方图的决策树算法,减少内存使用
- 支持类别特征,减少预处理工作
缺点¶
- 模型复杂,难以解释
- 训练时间较长,尤其是树的数量较多时
- 对于某些数据分布,可能不如单棵决策树表现
11.3 LightGBM模型应用场景¶
LightGBM模型适用于以下场景:
- 分类任务,如客户细分、信用评分等
- 回归任务,如房价预测、销售预测等
- 风险评估,如欺诈检测、信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
- 图像分类,如手写数字识别、物体检测等
- 文本分类,如垃圾邮件检测、情感分析等
11.4 LightGBM模型实现¶
以下是使用Python和LightGBM库实现LightGBM模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from lightgbm import LGBMClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建LightGBM模型
lgbm = LGBMClassifier(n_estimators=100) # 使用100棵树
# 训练模型
lgbm.fit(X_train, y_train)
# 预测
y_pred = lgbm.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
11.5 LightGBM模型调优¶
LightGBM模型的性能受树的数量和深度等参数的影响。可以通过交叉验证和网格搜索等方法调优树的数量、最大深度、最小样本分裂数等参数,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'n_estimators': [50, 100, 200], 'max_depth': np.arange(1, 10), 'learning_rate': [0.01, 0.1, 0.2], 'subsample': [0.6, 0.8, 1.0]}
# 创建LightGBM模型
lgbm = LGBMClassifier()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(lgbm, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_lgbm = grid_search.best_estimator_
best_lgbm.fit(X_train, y_train)
# 预测
y_pred = best_lgbm.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
11.6 LightGBM模型扩展¶
LightGBM模型可以与其他技术结合使用,如XGBoost(极端梯度提升)、CatBoost(处理类别特征)等,以提高算法的性能和适用性。 其计算公式为:(d(p, q) = \left( \sum_{i=1}^{n} |p_i - q_i|^r \right)^{1
十二、支持向量机模型¶
支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,广泛应用于分类和回归任务。其核心思想是通过寻找最优超平面,将不同类别的数据点分开,从而实现分类。
12.1 支持向量机模型原理¶
支持向量机通过以下步骤构建模型:
- 选择一个合适的核函数,将数据映射到高维空间,以便在该空间中找到线性可分的超平面。
- 通过最大化类别间的间隔(Margin),找到最优超平面。
- 使用支持向量(距离超平面最近的样本点)来确定超平面的位置。
- 对于非线性可分的数据,使用软间隔(Soft Margin)技术,允许部分样本点位于错误的一侧。
12.2 支持向量机模型优缺点¶
优点¶
- 在高维空间中表现良好,适合复杂数据
- 能处理非线性分类问题
- 对小样本数据表现良好
- 具有较强的泛化能力
缺点¶
- 计算复杂度高,训练时间较长
- 对参数选择和核函数敏感
- 对噪声和异常值敏感
- 不能直接处理多分类问题,需使用一对多或一对一策略
12.3 支持向量机模型应用场景¶
支持向量机模型适用于以下场景:
- 分类任务,如文本分类、图像识别等
- 回归任务,如房价预测、股票价格预测等
- 风险评估,如信用风险评估等
- 医疗诊断,如疾病预测等
- 市场营销,如用户行为分析、客户流失预测等
- 生物信息学,如基因表达数据分析等
12.4 支持向量机模型实现¶
以下是使用Python和Scikit-learn库实现支持向量机模型的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建支持向量机模型
svm = SVC(kernel='rbf') # 使用径向基函数(RBF)核
# 训练模型
svm.fit(X_train, y_train)
# 预测
y_pred = svm.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
12.5 支持向量机模型调优¶
支持向量机模型的性能受核函数和参数选择的影响。可以通过交叉验证和网格搜索等方法调优核函数类型、正则化参数C和核函数参数gamma等,以提高模型性能。
from sklearn.model_selection import GridSearchCV
# 定义参数范围
param_grid = {'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1], 'kernel': ['linear', 'rbf', 'poly']}
# 创建支持向量机模型
svm = SVC()
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(svm, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters:", grid_search.best_params_)
# 使用最佳参数训练模型
best_svm = grid_search.best_estimator_
best_svm.fit(X_train, y_train)
# 预测
y_pred = best_svm.predict(X_test)
# 评估模型
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
12.6 支持向量机模型扩展¶
支持向量机模型可以与其他技术结合使用,如核方法(如多项式核、径向基函数核等)、集成学习(如Bagging、Boosting等)等,以提高算法的性能和适用性。
十三、聚类算法¶
聚类(Clustering)是一种无监督学习方法,用于将数据集划分为若干个簇,使得同一簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。常见的聚类算法包括K均值(K-Means)、层次聚类(Hierarchical Clustering)和DBSCAN等。
13.1 聚类算法原理¶
- K均值算法通过迭代优化簇中心位置,将数据点分配到最近的簇中心,直到簇中心不再变化。
- 层次聚类通过构建树形结构(树状图)来表示数据点之间的层次关系,可以是自底向上(凝聚型)或自顶向下(分裂型)。
- DBSCAN通过密度连接的方式识别簇,能够发现任意形状的簇,并能处理噪声点。
13.2 聚类算法优缺点¶
优点¶
- 能发现数据中的潜在结构和模式
- 不需要预先标注数据,适用于无监督学习
- 适用于大规模数据集
缺点¶
- 聚类结果受初始参数和算法选择影响较大
- 可能难以解释聚类结果
- 对噪声和异常值敏感
- 需要预先指定簇的数量(如K均值)
13.3 聚类算法应用场景¶
聚类算法适用于以下场景: - 客户细分,如市场营销中的客户分类 - 图像分割,如医学图像处理中的组织分割 - 文本挖掘,如文档分类和主题发现 - 异常检测,如网络安全中的入侵检测 - 社交网络分析,如社区发现 - 生物信息学,如基因表达数据分析
13.4 聚类算法实现¶
以下是使用Python和Scikit-learn库实现K均值聚类算法的示例代码
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载数据集
data = load_iris()
X = data.data
# 创建K均值模型
kmeans = KMeans(n_clusters=3, random_state=42)
# 训练模型
kmeans.fit(X)
# 预测簇标签
y_kmeans = kmeans.predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-Means Clustering')
plt.show()
13.5 聚类算法调优¶
聚类算法的性能受初始参数和算法选择的影响。可以通过调整簇的数量(如K均值中的K值)、距离度量方式(如欧氏距离、曼哈顿距离等)和算法参数(如DBSCAN中的eps和min_samples)等,以提高聚类效果。
from sklearn.metrics import silhouette_score
# 计算轮廓系数评估聚类效果
silhouette_avg = silhouette_score(X, y_kmeans)
print("Silhouette Score:", silhouette_avg)
13.6 聚类算法扩展¶
聚类算法可以与其他技术结合使用,如降维(如PCA、t-SNE等)以提高聚类效果,或与分类算法结合进行半监督学习等。
十四、降维算法¶
降维(Dimensionality Reduction)是一种数据预处理技术,用于减少数据集的特征数量,同时尽可能保留数据的主要信息。常见的降维算法包括主成分分析(PCA)、线性判别分析(LDA)和t-SNE等。
14.1 降维算法原理¶
- 主成分分析(PCA)通过线性变换将数据投影到新的坐标系中,使得投影后的数据方差最大化,从而实现降维。
- 线性判别分析(LDA)通过寻找能够最大化类间距离和最小化类内距离的投影方向,实现降维和分类。
- t-SNE通过非线性映射将高维数据嵌入到低维空间,保留数据的局部结构,适用于可视化高维数据。
14.2 降维算法优缺点¶
优点¶
- 减少数据维度,降低计算复杂度
- 去除冗余和噪声,提高模型性能
- 便于数据可视化和解释
缺点¶
- 可能丢失部分信息,影响模型性能
- 需要选择合适的降维方法和参数
- 对数据分布和结构敏感,可能不适用于所有数据集
14.3 降维算法应用场景¶
降维算法适用于以下场景: - 数据预处理,如特征选择和特征提取 - 数据可视化,如高维数据的二维或三维展示 - 噪声过滤,如去除数据中的冗余信息 - 提高模型性能,如减少过拟合风险 - 图像处理,如图像压缩和特征提取 - 自然语言处理,如文本表示和主题建模
14.4 降维算法实现¶
以下是使用Python和Scikit-learn库实现主成分分析(PCA)的示例代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 创建PCA模型,降至2维
pca = PCA(n_components=2)
# 训练模型
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
# 可视化降维结果
plt.scatter(X_train_pca[:, 0], X_train_pca[:, 1], c=y_train, s=50, cmap='viridis')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA Result')
plt.show()
14.5 降维算法调优¶
降维算法的性能受方法选择和参数设置的影响。可以通过调整降维后的维度数量、选择不同的降维方法(如PCA、LDA、t-SNE等)和参数(如t-SNE中的perplexity和learning_rate)等,以提高降维效果。
# 输出PCA解释的方差比例
print("Explained variance ratio:", pca.explained_variance_ratio_)
14.6 降维算法扩展¶
降维算法可以与其他技术结合使用,如聚类(如K均值、DBSCAN等)以提高聚类效果,或与分类算法结合进行特征选择等。