机器学习经典任务
📅 2026/7/7 6:07:33
👁️ 阅读次数
📝 编程学习
sklearn 把数学公式、损失计算、梯度下降、迭代优化、评估指标全部底层封装,你只调用高层 API,不用手写求导、循环迭代。
- 不用手动写二元交叉熵、MSE 损失;
- 不用手动写梯度下降更新权重;
- 不用手写 K-Means 距离求和、PCA 特征分解; 全部藏在
.fit()内部自动执行。
下面分 4 套代码逐段拆解,每一行代码底层在做什么、封装内部逻辑一并讲清。
公共导入统一说明
python
运行
import numpy as np import pandas as pd import matplotlib.pyplot as plt import joblib from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_splitnumpy/pandas:数值、表格数据处理matplotlib:可视化joblib:保存训练后的模型 / 预处理工具(保存学到的权重、均值方差)StandardScaler:标准化封装类,内部实现 x′=σx−μtrain_test_split:数据集划分封装,随机打乱、分层抽样逻辑内置
任务 1:二分类(逻辑回归)逐行全解析
python
运行
from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # 1. 加载内置数据集(封装好的数据集读取接口) data = load_breast_cancer() X, y = data.data, data.target # X:样本特征矩阵 [569,30] 30项体检指标 # y:标签 0=良性,1=恶性(监督学习必备真实标签) # 2. 划分训练集、测试集(封装抽样逻辑) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=2026, stratify=y ) # test_size=0.3:30%做测试集,70%训练 # stratify=y:分层划分,保证训练/测试良恶性比例一致 # random_state:固定随机种子,结果可复现 # 底层:随机打乱索引,切割数据,封装完成,不用自己写循环划分 # 3. 标准化预处理(封装均值方差计算) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # fit():仅在训练集计算每个特征均值μ、标准差σ(底层遍历全部样本统计) # transform():套用μ、σ缩放数据 # fit_transform = fit + transform 合并一步 # 关键点:测试集绝对不能fit,防止数据泄露 # 4. 实例化模型(只是创建空模型,还没学习权重) model = LogisticRegression(max_iter=1000) # 内部封装:线性组合z=wx+b + sigmoid激活输出0~1概率 # max_iter=1000:最大迭代次数,防止训练没收敛 # 5. 核心训练接口 fit()【封装全部学习逻辑】 model.fit(X_train, y_train) # fit内部自动循环执行整套学习流程(全部封装,你看不见): # 1. 前向计算:wx+b → sigmoid 得到预测概率y_hat # 2. 计算二元交叉熵损失(内置损失公式) # 3. 求梯度,梯度下降更新权重w、偏置b # 4. 反复迭代,直到损失收敛或达到max_iter # 你只需要调用一行,不用手写循环、损失、梯度 # 6. 预测接口 predict/predict_proba(封装推理计算) y_pred = model.predict(X_test) # predict:内部阈值0.5,概率>0.5输出1,否则0,输出类别0/1 # model.predict_proba(X_test) 输出 [良性概率,恶性概率] # 7. 评估指标(封装公式计算) print("=====二分类评估=====") print(f"准确率:{accuracy_score(y_test, y_pred):.3f}") # accuracy_score:封装公式 正确样本/总样本 print("混淆矩阵:\n", confusion_matrix(y_test, y_pred)) # 封装统计:TP TN FP FN四类样本数量 print(classification_report(y_test, y_pred)) # 封装精确率、召回率、F1分数全套计算 # 8. 模型持久化(保存训练学到的w、b、scaler均值方差) joblib.dump(model, "binary_cls.pkl") joblib.dump(scaler, "scaler_binary.pkl") # 推理:新数据必须先用同一个scaler标准化,再丢模型 new_sample = scaler.transform([X_test[0]]) res = model.predict(new_sample)[0] print("单样本预测:", "恶性" if res == 1 else "良性")任务 2:回归(线性回归)逐行解析
python
运行
from sklearn.datasets import load_diabetes from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 1. 加载回归数据集,y是连续数值(血糖指标) data = load_diabetes() X, y = data.data, data.target # 2. 划分训练、测试集,回归不用分层stratify X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=2026 ) # 3. 标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 4. 实例线性回归模型 reg = LinearRegression() # 封装公式 y_hat = w1x1 + w2x2 + ... + b # 5. fit训练(内部封装MSE损失+最小二乘法求解权重) reg.fit(X_train, y_train) # 底层:直接解析解求解最优w、b,无需梯度迭代,同样封装完成 # 6. 预测连续数值 y_pred = reg.predict(X_test) # 7. 评估指标全部封装 print("\n=====回归评估=====") mse = mean_squared_error(y_test, y_pred) # 封装MSE损失公式:1/n Σ(y-y_hat)² rmse = np.sqrt(mse) r2 = r2_score(y_test, y_pred) # R²封装,衡量模型拟合程度 # 8. 保存模型推理 joblib.dump(reg, "reg_model.pkl") joblib.dump(scaler, "scaler_reg.pkl") new_x = scaler.transform([X_test[0]]) print("预测数值:", reg.predict(new_x)[0])任务 3:KMeans 聚类(无监督,无标签 y)逐行解析
python
运行
from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 1. 聚类无标签,只需要特征X iris = load_iris() X = iris.data # 2. 标准化(距离类算法必须) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 3. 实例KMeans,指定分3簇 kmeans = KMeans(n_clusters=3, random_state=2026) # 4. fit_predict 训练+同时输出聚类标签(封装迭代优化) cluster_label = kmeans.fit_predict(X_scaled) # fit内部封装完整聚类逻辑: # 1. 随机初始化簇中心 # 2. 计算每个样本到各中心欧式距离(封装距离公式) # 3. 分配样本到最近簇 # 4. 更新簇中心,最小化总距离(等价损失函数) # 5. 循环直到簇中心不再变化 # 5. 轮廓系数评估(封装聚类效果计算公式) score = silhouette_score(X_scaled, cluster_label) print("\n=====聚类评估=====") print(f"轮廓系数:{score:.3f}") # 6. 新样本预测属于哪一簇 joblib.dump(kmeans, "kmeans.pkl") joblib.dump(scaler, "scaler_kmeans.pkl") new_x = scaler.transform([X[0]]) print("新样本所属簇:", kmeans.predict(new_x)[0])任务 4:PCA 降维(无监督)逐行解析
python
运行
from sklearn.datasets import load_iris from sklearn.decomposition import PCA # 1. 数据 iris = load_iris() X, y = iris.data, iris.target # 2. PCA对尺度敏感,必须标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 3. 实例PCA,降到2维 pca = PCA(n_components=2) # 4. fit_transform:训练投影矩阵+降维转换 X_pca = pca.fit_transform(X_scaled) # fit内部封装特征值分解,寻找方差最大投影方向 # 目标函数:最小重构误差(等价损失),全部底层封装 # 5. 评估方差解释率(封装计算每个维度保留信息占比) print("\n=====PCA降维信息=====") print("各维度方差占比:", pca.explained_variance_ratio_) print("总保留信息:", sum(pca.explained_variance_ratio_)) # 6. 可视化降维后数据 plt.scatter(X_pca[:,0], X_pca[:,1], c=y) plt.title("PCA 2维可视化") plt.show() # 7. 保存降维器,新数据直接transform joblib.dump(pca, "pca.pkl") joblib.dump(scaler, "scaler_pca.pkl") new_x = scaler.transform([X[0]]) print("降维后2维向量:", pca.transform(new_x)[0])
编程学习
技术分享
实战经验