当前位置: 首页 > news >正文

机器学习算法以及code实现

目录

名词解释

监督学习

回归算法

线性回归

岭回归

Lasso回归

随机森林回归

XGBoost

分类算法

逻辑回归

SVM(支持向量机)

决策树

随机森林

集成算法boosting

无监督学习

聚类算法

K-Means

DBSCAN

降维算法

PCA(主成分分析)


名词解释

监督学习:输入数据有特征有标签,即有标准答案。
无监督学习:输入数据有特征无标签,即无标准答案。
半监督学习:降低数据标记的难度。
强化学习:自动进行决策。
数据归一化:消除特征量纲影响(如 “身高(cm)” 和 “体重(kg)”),加速梯度下降等优化算法的收敛。
数据标准化:适用于特征服从正态分布的场景,同样消除量纲,对异常值更鲁棒(如 SVM、逻辑回归常用)。
数据增强:通过 “人工生成新样本” 扩展数据集(如对图像旋转、裁剪、加噪声,对文本同义词替换)。
验证集:用于 “调整模型超参数” 的数据集(如选择决策树的深度、正则化系数),占总数据的 10%-20%。
交叉验证:将数据集分成 k 份(如 k=5),轮流用 k-1 份做训练集、1 份做验证集,最终取 k 次结果的平均值。
特征编码:将 “非数值特征”(如文本、类别)转换为数值形式,供模型输入。
损失函数:衡量 “模型预测值” 与 “真实标签” 差异的函数,是模型训练的 “优化目标”(最小化损失)。
代价函数:损失函数在 “整个训练集” 上的平均值(损失函数是单样本的误差,代价函数是全样本的平均误差)。
梯度下降:最常用的优化算法,通过 “计算代价函数对参数的梯度”,沿梯度负方向更新参数(参数 = 参数 - 学习率 × 梯度),逐步最小化代价函数。
学习率:梯度下降中控制 “参数更新步长” 的超参数(参数 = 参数 - LR× 梯度)。分类任务评价指标
精确率:分类任务中,“预测为正类的样本中,实际为正类的比例”(公式:TP/(TP+FP)),衡量 “预测正类的准确性”。
召回率:分类任务中,“实际为正类的样本中,被预测为正类的比例”(公式:TP/(TP+FN)),衡量 “正类的覆盖能力”。
F1-score:精确率和召回率的 “调和平均数”(公式:2×Precision×Recall/(Precision+Recall)),综合两者性能。
混淆矩阵:用矩阵形式展示分类模型的预测结果,行代表 “实际类别”,列代表 “预测类别”,包含 TP(真正)、TN(真负)、FP(假正)、FN(假负)。
ROC曲线:以 “假正率(FPR=FP/(FP+TN))” 为横轴,“真正率(TPR=Recall)” 为纵轴,通过调整分类阈值绘制的曲线。
AUC曲线:ROC 曲线下的面积,取值范围 [0.5,1],0.5 代表随机猜测,1 代表完美分类。回归任务评价指标
均方误差:MSE
均方根误差:RMSE
平均绝对误差:MAE
决定系数:R^2
平均绝对百分比误差:MAPE聚类任务评价指标
调整兰德指数:ARI
调整互信息:AMI
纯度:Purity
Fowlkes-Mallow分数
轮廓系数
Calinski-Harabasz指数
Davies-Bouldin指数归一化和标准化的区别归一化:这种⽅法鲁棒性较差,只适合传统精确⼩数据场景。标准化:如果出现异常点,由于具有⼀定数据量,少量的异常点对于平均值的影响并不⼤,从⽽⽅差改变较⼩。交叉验证是一种模型评估方法,通过将数据集分成多个子集,多次训练和验证,从而更全面地评估模型的泛化能力,减少单次划分带来的随机性。
交叉验证是一种模型评估方法,通过将数据集分成多个子集,多次训练和验证,从而更全面地评估模型的泛化能力,减少单次划分带来的随机性。L1 正则化:稀疏化,特征选择
L2 正则化:权重衰减,防止过拟合

监督学习

回归算法

线性回归

定义:假设 “输出与输入特征呈线性关系”(Y = W₁X₁ + W₂X₂ + ... + b),通过最小化 “均方误差” 求解参数 W 和 b。

作用:解决连续值预测问题(如预测销量、温度),是最简单的回归模型。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing  # 加州房价数据集(替代波士顿房价)
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')# 使用 macOS 系统必装的中文字体
plt.rcParams["font.family"] = ["Heiti TC"]  # 黑体-简(macOS 系统默认预装)
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def linear_regression_pipeline(test_size=0.3, random_state=42, plot=True):"""线性回归完整流程函数:加载数据→预处理→训练→评估→可视化参数:test_size: 测试集占比(默认0.3)random_state: 随机种子(确保结果可复现,默认42)plot: 是否绘制可视化图表(默认True)返回:model: 训练好的线性回归模型metrics: 包含评估指标的字典(训练R²、测试R²、MSE、RMSE)"""# 1. 加载数据集(加州房价:特征包括平均收入、房龄等,目标是房价中位数)data = fetch_california_housing()X, y = data.data, data.targetfeature_names = data.feature_names# 打印数据集基本信息print(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"目标值范围:[{y.min():.2f}, {y.max():.2f}]\n")# 2. 数据划分:训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)# 3. 特征标准化(使系数更具可比性)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 4. 训练线性回归模型model = LinearRegression()model.fit(X_train_scaled, y_train)# 5. 预测与评估y_pred_train = model.predict(X_train_scaled)y_pred_test = model.predict(X_test_scaled)# 计算评估指标metrics = {"train_r2": r2_score(y_train, y_pred_train),"test_r2": r2_score(y_test, y_pred_test),"mse": mean_squared_error(y_test, y_pred_test),"rmse": np.sqrt(mean_squared_error(y_test, y_pred_test))}# 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"偏置项(截距):{model.intercept_:.4f}")print("特征系数(权重):")for name, coef in zip(feature_names, model.coef_):print(f"  {name}: {coef:.4f}")  # 系数正负表示影响方向print(f"\n===== 评估指标 =====")print(f"训练集R²分数:{metrics['train_r2']:.4f}")print(f"测试集R²分数:{metrics['test_r2']:.4f}")print(f"测试集MSE:{metrics['mse']:.4f}")print(f"测试集RMSE:{metrics['rmse']:.4f}\n")# 6. 可视化(若开启)if plot:# 图1:真实值vs预测值(测试集)plt.figure(figsize=(14, 6))plt.subplot(1, 2, 1)plt.scatter(y_test, y_pred_test, alpha=0.6, color='b', label='预测值 vs 真实值')plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想线(y_pred=y_true)')plt.xlabel('真实房价($100k)')plt.ylabel('预测房价($100k)')plt.title('测试集:真实值 vs 预测值')plt.legend()# 图2:特征重要性(系数绝对值)plt.subplot(1, 2, 2)coef_abs = np.abs(model.coef_)sns.barplot(x=feature_names, y=coef_abs)plt.title('特征重要性(系数绝对值)')plt.xlabel('特征名称')plt.ylabel('系数绝对值(影响程度)')plt.xticks(rotation=45)plt.tight_layout()  # 调整子图间距plt.show()return model, metrics# 调用函数执行线性回归流程
if __name__ == "__main__":trained_model, evaluation_metrics = linear_regression_pipeline(test_size=0.2,  # 测试集占20%random_state=123,plot=True)

岭回归

定义:在 linear regression 基础上加入 “L2 正则化项”(惩罚参数 W 的平方和),避免过拟合。

作用:适用于特征多重共线性(如 “身高” 和 “体重” 高度相关)的场景,让参数更稳定。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing  # 加州房价数据集
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')# 使用 macOS 系统必装的中文字体
plt.rcParams["font.family"] = ["Heiti TC"]  # 黑体-简(macOS 系统默认预装)
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def ridge_regression_pipeline(alpha=1.0, test_size=0.3, random_state=42, plot=True):"""岭回归完整流程函数:加载数据→预处理→训练→评估→可视化参数:alpha: 正则化强度,值越大惩罚越强(默认1.0)test_size: 测试集占比(默认0.3)random_state: 随机种子(确保结果可复现,默认42)plot: 是否绘制可视化图表(默认True)返回:model: 训练好的岭回归模型metrics: 包含评估指标的字典(训练R²、测试R²、MSE、RMSE)"""# 1. 加载数据集data = fetch_california_housing()X, y = data.data, data.targetfeature_names = data.feature_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"目标值范围:[{y.min():.2f}, {y.max():.2f}]\n")# 2. 数据划分X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)# 3. 特征标准化scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 4. 训练岭回归模型model = Ridge(alpha=alpha, random_state=random_state)model.fit(X_train_scaled, y_train)# 5. 预测与评估y_pred_train = model.predict(X_train_scaled)y_pred_test = model.predict(X_test_scaled)metrics = {"train_r2": r2_score(y_train, y_pred_train),"test_r2": r2_score(y_test, y_pred_test),"mse": mean_squared_error(y_test, y_pred_test),"rmse": np.sqrt(mean_squared_error(y_test, y_pred_test))}# 打印模型参数和评估结果print(f"===== 模型参数 (alpha={alpha}) =====")print(f"偏置项(截距):{model.intercept_:.4f}")print("特征系数(权重):")for name, coef in zip(feature_names, model.coef_):print(f"  {name}: {coef:.4f}")print(f"\n===== 评估指标 =====")print(f"训练集R²分数:{metrics['train_r2']:.4f}")print(f"测试集R²分数:{metrics['test_r2']:.4f}")print(f"测试集MSE:{metrics['mse']:.4f}")print(f"测试集RMSE:{metrics['rmse']:.4f}\n")# 6. 可视化if plot:plt.figure(figsize=(14, 6))# 图1:真实值 vs 预测值plt.subplot(1, 2, 1)plt.scatter(y_test, y_pred_test, alpha=0.6, color='b', label='预测值 vs 真实值')plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想线(y_pred=y_true)')plt.xlabel('真实房价($100k)')plt.ylabel('预测房价($100k)')plt.title('测试集:真实值 vs 预测值')plt.legend()# 图2:特征重要性(系数绝对值)plt.subplot(1, 2, 2)coef_abs = np.abs(model.coef_)sns.barplot(x=feature_names, y=coef_abs)plt.title('特征重要性(系数绝对值)')plt.xlabel('特征名称')plt.ylabel('系数绝对值(影响程度)')plt.xticks(rotation=45)plt.tight_layout()plt.show()return model, metrics# 调用函数执行岭回归流程
if __name__ == "__main__":trained_model, evaluation_metrics = ridge_regression_pipeline(alpha=1.0,       # 正则化强度test_size=0.2,   # 测试集占20%random_state=123,plot=True)

Lasso回归

定义:在 linear regression 基础上加入 “L1 正则化项”(惩罚参数 W 的绝对值和),可实现特征选择。

作用:不仅避免过拟合,还能让部分不重要特征的参数变为 0,自动剔除冗余特征。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def lasso_regression_pipeline(alpha=0.1, test_size=0.3, random_state=42, plot=True):"""Lasso回归完整流程函数:加载数据→预处理→训练→评估→可视化参数:alpha: 正则化强度,值越大惩罚越强(默认0.1)test_size: 测试集占比(默认0.3)random_state: 随机种子(确保结果可复现)plot: 是否绘制可视化图表(默认True)返回:model: 训练好的Lasso回归模型metrics: 包含评估指标的字典(训练R²、测试R²、MSE、RMSE)"""# 1. 加载数据集data = fetch_california_housing()X, y = data.data, data.targetfeature_names = data.feature_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"目标值范围:[{y.min():.2f}, {y.max():.2f}]\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)# 3. 特征标准化(Lasso对特征尺度敏感)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 4. 训练Lasso回归模型model = Lasso(alpha=alpha, random_state=random_state, max_iter=10000)model.fit(X_train_scaled, y_train)# 5. 预测y_pred_train = model.predict(X_train_scaled)y_pred_test = model.predict(X_test_scaled)# 6. 评估指标metrics = {"train_r2": r2_score(y_train, y_pred_train),"test_r2": r2_score(y_test, y_pred_test),"mse": mean_squared_error(y_test, y_pred_test),"rmse": np.sqrt(mean_squared_error(y_test, y_pred_test))}# 打印模型参数print(f"===== 模型参数 (alpha={alpha}) =====")print(f"偏置项(截距):{model.intercept_:.4f}")print("特征系数(权重):")for name, coef in zip(feature_names, model.coef_):print(f"  {name}: {coef:.4f}")print(f"\n===== 评估指标 =====")print(f"训练集R²分数:{metrics['train_r2']:.4f}")print(f"测试集R²分数:{metrics['test_r2']:.4f}")print(f"测试集MSE:{metrics['mse']:.4f}")print(f"测试集RMSE:{metrics['rmse']:.4f}\n")# 7. 可视化if plot:plt.figure(figsize=(14, 6))# 图1:真实值 vs 预测值plt.subplot(1, 2, 1)plt.scatter(y_test, y_pred_test, alpha=0.6, color='b', label='预测值 vs 真实值')plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想线')plt.xlabel('真实房价($100k)')plt.ylabel('预测房价($100k)')plt.title('测试集:真实值 vs 预测值')plt.legend()# 图2:特征重要性(系数绝对值)plt.subplot(1, 2, 2)coef_abs = np.abs(model.coef_)sns.barplot(x=feature_names, y=coef_abs)plt.title('特征重要性(系数绝对值)')plt.xlabel('特征名称')plt.ylabel('系数绝对值')plt.xticks(rotation=45)plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":lasso_model, lasso_metrics = lasso_regression_pipeline(alpha=0.01,      # 正则化强度(较小值类似线性回归)test_size=0.2,random_state=123,plot=True)

随机森林回归

定义:由多个 “随机生成的决策树” 组成,通过 “投票(分类)” 或 “平均(回归)” 得到最终结果。

作用:解决决策树过拟合问题,鲁棒性强,可输出特征重要性,是工业界常用模型。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def random_forest_regression_pipeline(n_estimators=100, max_depth=None,test_size=0.3, random_state=42, plot=True):"""随机森林回归完整流程函数:加载数据→划分→训练→评估→可视化参数:n_estimators: 树的数量(默认100)max_depth: 每棵树的最大深度(默认None表示不限制)test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的随机森林回归模型metrics: 包含评估指标的字典(训练R²、测试R²、MSE、RMSE)"""# 1. 加载数据集data = fetch_california_housing()X, y = data.data, data.targetfeature_names = data.feature_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"目标值范围:[{y.min():.2f}, {y.max():.2f}]\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)# 3. 训练随机森林回归模型(RF 不需要标准化)model = RandomForestRegressor(n_estimators=n_estimators,max_depth=max_depth,random_state=random_state,n_jobs=-1  # 使用所有CPU核心)model.fit(X_train, y_train)# 4. 预测y_pred_train = model.predict(X_train)y_pred_test = model.predict(X_test)# 5. 评估指标metrics = {"train_r2": r2_score(y_train, y_pred_train),"test_r2": r2_score(y_test, y_pred_test),"mse": mean_squared_error(y_test, y_pred_test),"rmse": np.sqrt(mean_squared_error(y_test, y_pred_test))}# 6. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"树的数量: {n_estimators}")print(f"每棵树最大深度: {max_depth if max_depth is not None else '不限制'}")print(f"\n===== 评估指标 =====")print(f"训练集R²分数:{metrics['train_r2']:.4f}")print(f"测试集R²分数:{metrics['test_r2']:.4f}")print(f"测试集MSE:{metrics['mse']:.4f}")print(f"测试集RMSE:{metrics['rmse']:.4f}\n")# 7. 可视化if plot:plt.figure(figsize=(14, 6))# 图1:真实值 vs 预测值plt.subplot(1, 2, 1)plt.scatter(y_test, y_pred_test, alpha=0.6, color='b', label='预测值 vs 真实值')plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想线')plt.xlabel('真实房价($100k)')plt.ylabel('预测房价($100k)')plt.title('测试集:真实值 vs 预测值')plt.legend()# 图2:特征重要性plt.subplot(1, 2, 2)importances = model.feature_importances_sns.barplot(x=feature_names, y=importances)plt.title('随机森林特征重要性')plt.xlabel('特征名称')plt.ylabel('重要性分数')plt.xticks(rotation=45)plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":rf_model, rf_metrics = random_forest_regression_pipeline(n_estimators=200,   # 树的数量max_depth=10,       # 控制树深度防止过拟合test_size=0.2,random_state=123,plot=True)

XGBoost

定义:GBDT 的优化版本,加入正则化、并行计算、缺失值处理等功能,训练效率和精度更高。

作用:Kaggle 竞赛常用模型,工业界广泛用于推荐系统、风控建模等场景。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
from xgboost import XGBRegressor
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def xgboost_regression_pipeline(n_estimators=100, learning_rate=0.1,max_depth=3, test_size=0.3, random_state=42, plot=True):"""XGBoost回归完整流程函数:加载数据→划分→训练→评估→可视化参数:n_estimators: 树的数量(默认100)learning_rate: 学习率(默认0.1)max_depth: 每棵树的最大深度(默认3)test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的XGBoost回归模型metrics: 包含评估指标的字典(训练R²、测试R²、MSE、RMSE)"""# 1. 加载数据集data = fetch_california_housing()X, y = data.data, data.targetfeature_names = data.feature_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"目标值范围:[{y.min():.2f}, {y.max():.2f}]\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)# 3. 训练XGBoost回归模型model = XGBRegressor(objective='reg:squarederror',  # 回归任务损失函数n_estimators=n_estimators,learning_rate=learning_rate,max_depth=max_depth,random_state=random_state,n_jobs=-1)model.fit(X_train, y_train)# 4. 预测y_pred_train = model.predict(X_train)y_pred_test = model.predict(X_test)# 5. 评估指标metrics = {"train_r2": r2_score(y_train, y_pred_train),"test_r2": r2_score(y_test, y_pred_test),"mse": mean_squared_error(y_test, y_pred_test),"rmse": np.sqrt(mean_squared_error(y_test, y_pred_test))}# 6. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"树的数量: {n_estimators}")print(f"学习率: {learning_rate}")print(f"每棵树最大深度: {max_depth}")print(f"\n===== 评估指标 =====")print(f"训练集R²分数:{metrics['train_r2']:.4f}")print(f"测试集R²分数:{metrics['test_r2']:.4f}")print(f"测试集MSE:{metrics['mse']:.4f}")print(f"测试集RMSE:{metrics['rmse']:.4f}\n")# 7. 可视化if plot:plt.figure(figsize=(14, 6))# 图1:真实值 vs 预测值plt.subplot(1, 2, 1)plt.scatter(y_test, y_pred_test, alpha=0.6, color='b', label='预测值 vs 真实值')plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='理想线')plt.xlabel('真实房价($100k)')plt.ylabel('预测房价($100k)')plt.title('测试集:真实值 vs 预测值')plt.legend()# 图2:特征重要性plt.subplot(1, 2, 2)importances = model.feature_importances_sns.barplot(x=feature_names, y=importances)plt.title('XGBoost特征重要性')plt.xlabel('特征名称')plt.ylabel('重要性分数')plt.xticks(rotation=45)plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":xgb_model, xgb_metrics = xgboost_regression_pipeline(n_estimators=200,learning_rate=0.05,max_depth=5,test_size=0.2,random_state=123,plot=True)

分类算法

逻辑回归

定义:将线性回归的输出通过 “Sigmoid 函数” 映射到 [0,1],表示 “属于某类的概率”,用于二分类。

作用:解决二分类问题(如判断用户是否流失、邮件是否为垃圾邮件),可解释性强。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def logistic_regression_pipeline(C=1.0, test_size=0.3, random_state=42, plot=True):"""逻辑回归分类完整流程函数:加载数据→预处理→训练→评估→可视化参数:C: 正则化强度的倒数,值越小正则化越强(默认1.0)test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的逻辑回归分类模型metrics: 包含评估指标的字典"""# 1. 加载数据集(乳腺癌分类数据)data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names[:5]} ...(共{len(feature_names)}个特征)")print(f"类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"类别分布:{np.bincount(y)}(0={class_names[0]}, 1={class_names[1]})\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state, stratify=y)# 3. 特征标准化(逻辑回归对特征尺度敏感)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 4. 训练逻辑回归模型model = LogisticRegression(C=C, random_state=random_state, max_iter=10000)model.fit(X_train_scaled, y_train)# 5. 预测y_pred = model.predict(X_test_scaled)y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]  # 正类概率# 6. 评估指标metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred),"recall": recall_score(y_test, y_pred),"f1": f1_score(y_test, y_pred)}# 7. 打印模型参数和评估结果print(f"===== 模型参数 (C={C}) =====")print(f"偏置项(截距):{model.intercept_[0]:.4f}")print("前10个特征系数(权重):")for name, coef in zip(feature_names[:10], model.coef_[0][:10]):print(f"  {name}: {coef:.4f}")print("...")print(f"\n===== 评估指标 =====")print(f"准确率(Accuracy):{metrics['accuracy']:.4f}")print(f"精确率(Precision):{metrics['precision']:.4f}")print(f"召回率(Recall):{metrics['recall']:.4f}")print(f"F1分数:{metrics['f1']:.4f}\n")print("===== 分类报告 =====")print(classification_report(y_test, y_pred, target_names=class_names))# 8. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:混淆矩阵plt.subplot(1, 2, 1)cm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",xticklabels=class_names, yticklabels=class_names)plt.xlabel("预测标签")plt.ylabel("真实标签")plt.title("混淆矩阵")# 图2:特征重要性(系数绝对值)plt.subplot(1, 2, 2)coef_abs = np.abs(model.coef_[0])top_idx = np.argsort(coef_abs)[-10:]  # 取绝对值最大的10个特征sns.barplot(x=coef_abs[top_idx], y=feature_names[top_idx])plt.title("特征重要性(系数绝对值 Top 10)")plt.xlabel("系数绝对值")plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":lr_model, lr_metrics = logistic_regression_pipeline(C=0.1,           # 正则化强度(较小值正则化更强)test_size=0.2,random_state=123,plot=True)

SVM(支持向量机)

定义:找到 “最优超平面”,使两类样本到超平面的 “间隔最大”,通过核函数处理非线性问题。

作用:小数据集上分类效果好,可处理高维数据(如图像特征),但大数据量下训练慢。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def svm_classification_pipeline(C=1.0, kernel='rbf', gamma='scale',test_size=0.3, random_state=42, plot=True):"""SVM分类完整流程函数:加载数据→预处理→训练→评估→可视化参数:C: 正则化强度的倒数,值越小正则化越强(默认1.0)kernel: 核函数类型,可选 'linear', 'poly', 'rbf', 'sigmoid'(默认'rbf')gamma: 核系数(默认'scale')test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的SVM分类模型metrics: 包含评估指标的字典"""# 1. 加载数据集(乳腺癌分类数据)data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names[:5]} ...(共{len(feature_names)}个特征)")print(f"类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"类别分布:{np.bincount(y)}(0={class_names[0]}, 1={class_names[1]})\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state, stratify=y)# 3. 特征标准化(SVM对特征尺度敏感)scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)# 4. 训练SVM分类模型model = SVC(C=C, kernel=kernel, gamma=gamma, probability=True, random_state=random_state)model.fit(X_train_scaled, y_train)# 5. 预测y_pred = model.predict(X_test_scaled)y_pred_proba = model.predict_proba(X_test_scaled)[:, 1]  # 正类概率# 6. 评估指标metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred),"recall": recall_score(y_test, y_pred),"f1": f1_score(y_test, y_pred)}# 7. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"C: {C}, kernel: {kernel}, gamma: {gamma}")print(f"\n===== 评估指标 =====")print(f"准确率(Accuracy):{metrics['accuracy']:.4f}")print(f"精确率(Precision):{metrics['precision']:.4f}")print(f"召回率(Recall):{metrics['recall']:.4f}")print(f"F1分数:{metrics['f1']:.4f}\n")print("===== 分类报告 =====")print(classification_report(y_test, y_pred, target_names=class_names))# 8. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:混淆矩阵plt.subplot(1, 2, 1)cm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",xticklabels=class_names, yticklabels=class_names)plt.xlabel("预测标签")plt.ylabel("真实标签")plt.title("混淆矩阵")# 图2:SVM没有直接的特征重要性,我们用前两个特征绘制决策边界plt.subplot(1, 2, 2)X_train_vis = X_train_scaled[:, :2]  # 只取前两个特征做可视化X_test_vis = X_test_scaled[:, :2]# 训练一个新的SVM模型,只用两个特征svm_vis = SVC(C=C, kernel=kernel, gamma=gamma, probability=True, random_state=random_state)svm_vis.fit(X_train_vis, y_train)# 绘制决策边界h = 0.02x_min, x_max = X_train_vis[:, 0].min() - 1, X_train_vis[:, 0].max() + 1y_min, y_max = X_train_vis[:, 1].min() - 1, X_train_vis[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))Z = svm_vis.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.coolwarm)plt.scatter(X_test_vis[:, 0], X_test_vis[:, 1], c=y_test, cmap=plt.cm.coolwarm, s=50, edgecolors='k')plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title(f"SVM决策边界 (kernel={kernel})")plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":svm_model, svm_metrics = svm_classification_pipeline(C=1.0,kernel='rbf',test_size=0.2,random_state=123,plot=True)

决策树

定义:以 “树状结构” 分裂特征(如 “年龄 > 30?”“收入 > 5 万?”),每个叶子节点对应一个预测结果。

作用:可用于分类和回归,可解释性极强(能清晰看到决策逻辑),但易过拟合。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def decision_tree_classification_pipeline(max_depth=None, criterion='gini',test_size=0.3, random_state=42, plot=True):"""决策树分类完整流程函数:加载数据→划分→训练→评估→可视化参数:max_depth: 树的最大深度(默认None表示不限制)criterion: 分裂节点的评价标准,可选 'gini'(基尼不纯度)或 'entropy'(信息熵)test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的决策树分类模型metrics: 包含评估指标的字典"""# 1. 加载数据集(乳腺癌分类数据)data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names[:5]} ...(共{len(feature_names)}个特征)")print(f"类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"类别分布:{np.bincount(y)}(0={class_names[0]}, 1={class_names[1]})\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state, stratify=y)# 3. 训练决策树分类模型(决策树不需要标准化)model = DecisionTreeClassifier(criterion=criterion,max_depth=max_depth,random_state=random_state)model.fit(X_train, y_train)# 4. 预测y_pred = model.predict(X_test)# 5. 评估指标metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred),"recall": recall_score(y_test, y_pred),"f1": f1_score(y_test, y_pred)}# 6. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"分裂标准: {criterion}")print(f"最大深度: {max_depth if max_depth is not None else '不限制'}")print(f"\n===== 评估指标 =====")print(f"准确率(Accuracy):{metrics['accuracy']:.4f}")print(f"精确率(Precision):{metrics['precision']:.4f}")print(f"召回率(Recall):{metrics['recall']:.4f}")print(f"F1分数:{metrics['f1']:.4f}\n")print("===== 分类报告 =====")print(classification_report(y_test, y_pred, target_names=class_names))# 7. 可视化if plot:plt.figure(figsize=(18, 10))# 图1:混淆矩阵plt.subplot(1, 2, 1)cm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",xticklabels=class_names, yticklabels=class_names)plt.xlabel("预测标签")plt.ylabel("真实标签")plt.title("混淆矩阵")# 图2:决策树结构(只画前几层,避免过大)plt.subplot(1, 2, 2)plot_tree(model,feature_names=feature_names,class_names=class_names,filled=True,rounded=True,fontsize=10)plt.title("决策树结构")plt.tight_layout()plt.show()# 图3:特征重要性plt.figure(figsize=(10, 6))importances = model.feature_importances_indices = np.argsort(importances)[::-1]sns.barplot(x=importances[indices], y=feature_names[indices])plt.title("特征重要性")plt.xlabel("重要性分数")plt.ylabel("特征名称")plt.show()return model, metrics# 调用函数
if __name__ == "__main__":dt_model, dt_metrics = decision_tree_classification_pipeline(max_depth=5,          # 限制树深度防止过拟合criterion='gini',test_size=0.2,random_state=123,plot=True)

随机森林

定义:由多个 “随机生成的决策树” 组成,通过 “投票(分类)” 或 “平均(回归)” 得到最终结果。

作用:解决决策树过拟合问题,鲁棒性强,可输出特征重要性,是工业界常用模型。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def random_forest_classification_pipeline(n_estimators=100, max_depth=None,criterion='gini', test_size=0.3, random_state=42, plot=True):"""随机森林分类完整流程函数:加载数据→划分→训练→评估→可视化参数:n_estimators: 树的数量(默认100)max_depth: 每棵树的最大深度(默认None表示不限制)criterion: 分裂节点的评价标准,可选 'gini' 或 'entropy'test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的随机森林分类模型metrics: 包含评估指标的字典"""# 1. 加载数据集(乳腺癌分类数据)data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names[:5]} ...(共{len(feature_names)}个特征)")print(f"类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"类别分布:{np.bincount(y)}(0={class_names[0]}, 1={class_names[1]})\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state, stratify=y)# 3. 训练随机森林分类模型(不需要标准化)model = RandomForestClassifier(n_estimators=n_estimators,max_depth=max_depth,criterion=criterion,random_state=random_state,n_jobs=-1  # 使用所有CPU核心)model.fit(X_train, y_train)# 4. 预测y_pred = model.predict(X_test)# 5. 评估指标metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred),"recall": recall_score(y_test, y_pred),"f1": f1_score(y_test, y_pred)}# 6. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"树的数量: {n_estimators}")print(f"最大深度: {max_depth if max_depth is not None else '不限制'}")print(f"分裂标准: {criterion}")print(f"\n===== 评估指标 =====")print(f"准确率(Accuracy):{metrics['accuracy']:.4f}")print(f"精确率(Precision):{metrics['precision']:.4f}")print(f"召回率(Recall):{metrics['recall']:.4f}")print(f"F1分数:{metrics['f1']:.4f}\n")print("===== 分类报告 =====")print(classification_report(y_test, y_pred, target_names=class_names))# 7. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:混淆矩阵plt.subplot(1, 2, 1)cm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",xticklabels=class_names, yticklabels=class_names)plt.xlabel("预测标签")plt.ylabel("真实标签")plt.title("混淆矩阵")# 图2:特征重要性plt.subplot(1, 2, 2)importances = model.feature_importances_indices = np.argsort(importances)[::-1]sns.barplot(x=importances[indices], y=feature_names[indices])plt.title("随机森林特征重要性")plt.xlabel("重要性分数")plt.ylabel("特征名称")plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":rf_model, rf_metrics = random_forest_classification_pipeline(n_estimators=200,   # 树的数量max_depth=8,        # 限制树深度防止过拟合criterion='gini',test_size=0.2,random_state=123,plot=True)

集成算法boosting

Boosting 是一种 集成学习(Ensemble Learning) 策略,它通过迭代的方式训练一系列弱学习器(Weak Learner),并将它们加权组合成一个强学习器(Strong Learner)。

作用

  1. 多个弱学习器组合后,可以达到很高的泛化能力
  2. 在分类、回归、排序等任务中常取得 SOTA(State-of-the-Art)结果
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix, classification_report
from xgboost import XGBClassifier
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def boosting_classification_pipeline(n_estimators=100, learning_rate=0.1,max_depth=3, test_size=0.3, random_state=42, plot=True):"""Boosting集成学习(XGBoost)完整流程函数:加载数据→划分→训练→评估→可视化参数:n_estimators: 弱分类器(树)的数量(默认100)learning_rate: 学习率(默认0.1)max_depth: 每棵树的最大深度(默认3)test_size: 测试集占比(默认0.3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的XGBoost分类模型metrics: 包含评估指标的字典"""# 1. 加载数据集(乳腺癌分类数据)data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names[:5]} ...(共{len(feature_names)}个特征)")print(f"类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"类别分布:{np.bincount(y)}(0={class_names[0]}, 1={class_names[1]})\n")# 2. 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state, stratify=y)# 3. 训练XGBoost分类模型(Boosting代表)model = XGBClassifier(objective='binary:logistic',n_estimators=n_estimators,learning_rate=learning_rate,max_depth=max_depth,random_state=random_state,n_jobs=-1)model.fit(X_train, y_train)# 4. 预测y_pred = model.predict(X_test)# 5. 评估指标metrics = {"accuracy": accuracy_score(y_test, y_pred),"precision": precision_score(y_test, y_pred),"recall": recall_score(y_test, y_pred),"f1": f1_score(y_test, y_pred)}# 6. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"树的数量: {n_estimators}")print(f"学习率: {learning_rate}")print(f"每棵树最大深度: {max_depth}")print(f"\n===== 评估指标 =====")print(f"准确率(Accuracy):{metrics['accuracy']:.4f}")print(f"精确率(Precision):{metrics['precision']:.4f}")print(f"召回率(Recall):{metrics['recall']:.4f}")print(f"F1分数:{metrics['f1']:.4f}\n")print("===== 分类报告 =====")print(classification_report(y_test, y_pred, target_names=class_names))# 7. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:混淆矩阵plt.subplot(1, 2, 1)cm = confusion_matrix(y_test, y_pred)sns.heatmap(cm, annot=True, fmt="d", cmap="Blues",xticklabels=class_names, yticklabels=class_names)plt.xlabel("预测标签")plt.ylabel("真实标签")plt.title("混淆矩阵")# 图2:特征重要性plt.subplot(1, 2, 2)importances = model.feature_importances_indices = np.argsort(importances)[::-1]sns.barplot(x=importances[indices], y=feature_names[indices])plt.title("XGBoost特征重要性")plt.xlabel("重要性分数")plt.ylabel("特征名称")plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":boosting_model, boosting_metrics = boosting_classification_pipeline(n_estimators=200,learning_rate=0.05,max_depth=5,test_size=0.2,random_state=123,plot=True)

无监督学习

聚类算法

K-Means

定义:无监督聚类算法,先指定 k 个初始聚类中心,再迭代将样本分配到最近的中心,更新中心位置,直到收敛。

作用:解决简单聚类问题(如用户分群、商品分类),但需提前指定 k 值,对初始中心敏感。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, adjusted_rand_score
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def kmeans_clustering_pipeline(n_clusters=3, random_state=42, plot=True):"""K-Means聚类完整流程函数:加载数据→预处理→聚类→评估→可视化参数:n_clusters: 聚类簇数(默认3)random_state: 随机种子plot: 是否绘制可视化图表(默认True)返回:model: 训练好的K-Means聚类模型metrics: 包含评估指标的字典(轮廓系数、ARI)"""# 1. 加载数据集(鸢尾花数据)data = load_iris()X, y_true = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"真实类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"真实类别分布:{np.bincount(y_true)}\n")# 2. 特征标准化(K-Means对特征尺度敏感)scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 3. 训练K-Means聚类模型model = KMeans(n_clusters=n_clusters, random_state=random_state, n_init='auto')y_pred = model.fit_predict(X_scaled)# 4. 评估指标metrics = {"silhouette_score": silhouette_score(X_scaled, y_pred),  # 轮廓系数"ari": adjusted_rand_score(y_true, y_pred)               # 调整兰德指数(已知真实标签时)}# 5. 打印模型参数和评估结果print(f"===== 模型参数 =====")print(f"聚类簇数: {n_clusters}")print(f"\n===== 评估指标 =====")print(f"轮廓系数(Silhouette Score):{metrics['silhouette_score']:.4f}")print(f"调整兰德指数(ARI):{metrics['ari']:.4f}")print("(ARI越接近1表示聚类结果与真实标签越一致)\n")# 6. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:聚类结果可视化(取前两个特征)plt.subplot(1, 2, 1)plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_pred, cmap='viridis', s=50, alpha=0.8, label='聚类结果')plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],s=200, c='red', marker='X', label='聚类中心')plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title(f'K-Means聚类结果 (K={n_clusters})')plt.legend()# 图2:真实标签 vs 聚类结果对比plt.subplot(1, 2, 2)plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_true, cmap='viridis', s=50, alpha=0.8, label='真实标签')plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title('真实标签分布')plt.legend()plt.tight_layout()plt.show()return model, metrics# 调用函数
if __name__ == "__main__":kmeans_model, kmeans_metrics = kmeans_clustering_pipeline(n_clusters=3,random_state=123,plot=True)

DBSCAN

定义:基于 “密度” 的聚类算法,将 “密度足够高的样本” 划分为同一簇,自动识别噪声点。

作用:无需指定 k 值,能发现任意形状的簇(如环形簇),适用于异常检测(如欺诈交易识别)。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, adjusted_rand_score
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def dbscan_clustering_pipeline(eps=0.5, min_samples=5, plot=True):"""DBSCAN聚类完整流程函数:加载数据→预处理→聚类→评估→可视化参数:eps: 邻域半径(默认0.5)min_samples: 邻域内最小样本数(默认5)plot: 是否绘制可视化图表(默认True)返回:model: 训练好的DBSCAN聚类模型metrics: 包含评估指标的字典(轮廓系数、ARI、簇数、噪声点数)"""# 1. 加载数据集(鸢尾花数据)data = load_iris()X, y_true = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"真实类别:{class_names}")print(f"样本数:{X.shape[0]}, 特征数:{X.shape[1]}")print(f"真实类别分布:{np.bincount(y_true)}\n")# 2. 特征标准化(DBSCAN对特征尺度敏感,必须标准化)scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 3. 训练DBSCAN聚类模型model = DBSCAN(eps=eps, min_samples=min_samples)y_pred = model.fit_predict(X_scaled)  # -1表示噪声点# 4. 统计聚类结果(排除噪声点)unique_labels = np.unique(y_pred)n_clusters = len(unique_labels[unique_labels != -1])  # 有效簇数n_noise = list(y_pred).count(-1)  # 噪声点数cluster_sizes = {label: list(y_pred).count(label) for label in unique_labels}print(f"===== 模型参数 =====")print(f"邻域半径 (eps): {eps}")print(f"邻域最小样本数 (min_samples): {min_samples}")print(f"\n===== 聚类结果统计 =====")print(f"识别的簇数:{n_clusters}")print(f"噪声点数:{n_noise}")print(f"各簇样本数:{cluster_sizes}")# 5. 评估指标(仅对非噪声样本计算)metrics = {}if n_clusters >= 2:  # 至少2个簇才计算轮廓系数X_valid = X_scaled[y_pred != -1]y_valid_pred = y_pred[y_pred != -1]y_valid_true = y_true[y_pred != -1]metrics["silhouette_score"] = silhouette_score(X_valid, y_valid_pred)metrics["ari"] = adjusted_rand_score(y_valid_true, y_valid_pred)print(f"\n===== 评估指标 =====")print(f"轮廓系数(Silhouette Score):{metrics['silhouette_score']:.4f}")print(f"调整兰德指数(ARI):{metrics['ari']:.4f}")print("(ARI越接近1表示聚类结果与真实标签越一致)\n")else:metrics["silhouette_score"] = Nonemetrics["ari"] = Noneprint(f"\n===== 评估指标 =====")print("簇数不足2个,无法计算轮廓系数和ARI\n")# 补充返回关键统计信息metrics["n_clusters"] = n_clustersmetrics["n_noise"] = n_noise# 6. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:DBSCAN聚类结果(前两个特征,噪声点标为黑色)plt.subplot(1, 2, 1)# 为不同簇分配颜色(噪声点用黑色)colors = plt.cm.Spectral(np.linspace(0, 1, n_clusters)) if n_clusters > 0 else []color_map = {label: colors[i] for i, label in enumerate(unique_labels[unique_labels != -1])}color_map[-1] = [0, 0, 0, 1]  # 噪声点黑色# 绘制散点图for label in unique_labels:mask = y_pred == labelplt.scatter(X_scaled[mask, 0], X_scaled[mask, 1],c=[color_map[label]], s=50, alpha=0.8,label=f'簇{label}' if label != -1 else '噪声点')plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title(f'DBSCAN聚类结果 (eps={eps}, min_samples={min_samples})')plt.legend()# 图2:真实标签分布(对比用)plt.subplot(1, 2, 2)for i, class_name in enumerate(class_names):mask = y_true == iplt.scatter(X_scaled[mask, 0], X_scaled[mask, 1],s=50, alpha=0.8, label=class_name)plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title('真实标签分布')plt.legend()plt.tight_layout()plt.show()return model, metrics# 调用函数(示例:调整eps=0.8以更好适配鸢尾花数据)
if __name__ == "__main__":dbscan_model, dbscan_metrics = dbscan_clustering_pipeline(eps=0.8,        # 增大邻域半径,适配鸢尾花数据的特征分布min_samples=5,plot=True)

降维算法

PCA(主成分分析)

定义:无监督降维算法,通过 “线性变换” 将高维特征映射到低维空间,保留数据中 “方差最大” 的信息。

作用:简化模型计算,可视化高维数据(如将 100 维图像特征降为 2 维画图),但可解释性弱。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')# 中文字体设置
plt.rcParams["font.family"] = ["Heiti TC"]  # macOS 黑体
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题def pca_analysis_pipeline(n_components=2, plot=True):"""PCA主成分分析完整流程函数:加载数据→预处理→PCA降维→解释方差分析→可视化参数:n_components: 降维后的维度(默认2,方便可视化)plot: 是否绘制可视化图表(默认True)返回:pca: 训练好的PCA模型X_pca: 降维后的数据explained_variance_ratio: 各主成分解释方差比例"""# 1. 加载数据集(鸢尾花数据)data = load_iris()X, y = data.data, data.targetfeature_names = data.feature_namesclass_names = data.target_namesprint(f"===== 数据集信息 =====")print(f"特征名称:{feature_names}")print(f"类别:{class_names}")print(f"原始数据形状:{X.shape} (样本数, 特征数)\n")# 2. 特征标准化(PCA对特征尺度敏感)scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 3. 训练PCA模型(降维)pca = PCA(n_components=n_components)X_pca = pca.fit_transform(X_scaled)# 4. 解释方差分析explained_variance_ratio = pca.explained_variance_ratio_cumulative_variance_ratio = np.cumsum(explained_variance_ratio)print(f"===== PCA分析结果 =====")print(f"降维后的数据形状:{X_pca.shape}")print(f"各主成分解释方差比例:{explained_variance_ratio.round(4)}")print(f"累计解释方差比例:{cumulative_variance_ratio[-1]:.4f}\n")# 5. 可视化if plot:plt.figure(figsize=(12, 5))# 图1:PCA降维后的散点图(按真实标签着色)plt.subplot(1, 2, 1)for i, class_name in enumerate(class_names):plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1],label=class_name, alpha=0.8, s=60)plt.xlabel(f'主成分1 (解释方差 {explained_variance_ratio[0]:.2%})')plt.ylabel(f'主成分2 (解释方差 {explained_variance_ratio[1]:.2%})')plt.title(f'PCA降维结果 (n_components={n_components})')plt.legend()# 图2:解释方差比例条形图plt.subplot(1, 2, 2)sns.barplot(x=[f'主成分{i+1}' for i in range(n_components)],y=explained_variance_ratio)plt.plot([f'主成分{i+1}' for i in range(n_components)],cumulative_variance_ratio, 'o-', color='red', label='累计解释方差')plt.ylabel('解释方差比例')plt.title('各主成分解释方差比例')plt.xticks(rotation=45)plt.legend()plt.tight_layout()plt.show()return pca, X_pca, explained_variance_ratio# 调用函数
if __name__ == "__main__":pca_model, X_pca, explained_variance_ratio = pca_analysis_pipeline(n_components=2,plot=True)

http://www.dtcms.com/a/428691.html

相关文章:

  • 怎样开自己的网站个人域名可以做网站吗
  • 如何理解“物以类聚,人以群分”?
  • 南通企业网站怎么建设wordpress不用邮箱
  • 企业网站做的好宁波网站制作建设
  • 广州商城网站建设地址wordpress首页不显示整篇文章
  • Tensor Core的MMA与WMMA
  • 大模型计算事实标准--CUDA
  • 网站导航页面模板网络与新媒体就业方向及前景
  • 公司网站 备案南通市建设监理协会网站
  • 洋县住房和城乡建设管理局网站网站中宣传彩页怎么做的
  • 网站群建设进展情况汇报郑州网站开发技术
  • C语言数据结构-堆
  • 网站建设开头营销型网站推广公司
  • 公考刷题资源合集
  • 网站建设与管理专业好找工作吗通辽网站建设
  • QCustomPlot 特定图表类型实战
  • python 将关键数据标注在png图片里
  • python加速方法 对比 numba numb.cuda triton pycuda cupy
  • 常州天狼网站建设二手物品交换网站建设
  • 关于Java的几个小问题
  • 青岛手机网站建设手工制作月饼
  • 国外的哪个网站可以做跳转青岛网站推广途径
  • 湖北省和住房建设厅官方网站山东泰山新闻
  • 营销网站定制公司台州网站设计哪家好
  • C++——基础
  • 回顾首尔 KBW 2025,Sui 的创新与联结周
  • 2025CCPC郑州邀请赛暨河南省赛 B. 随机栈 II 题解
  • 珠海网站建设公商城二次开发
  • 合肥市蜀山区做个网站多少钱电子商务网页制作是什么
  • 做网站推广需要多少费用one dirve做网站