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_split
numpy/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])