
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 我想学python了 其他栏目: iOS项目总结大全 其他栏目: iOS UI 文章目录监督学习全景——回归、分类与损失函数一、机器学习的三种范式二、监督学习的两个大类回归与分类三、损失函数告诉模型你错得多离谱3.1 回归损失MSE 与 MAE3.2 分类损失交叉熵最重要3.3 二分类交叉熵 BCE四、数据集划分为什么不能用考题当练习册五、第一个完整流程sklearn 三行建模为什么必须做标准化六、监督学习的完整工作流七、常见坑与注意事项八、本篇小结监督学习全景——回归、分类与损失函数承上上一篇《微积分基础》我们掌握了「怎么更新参数」的数学工具。本篇本篇进入阶段 3先把机器学习的整张地图铺开回归 vs 分类、损失函数、数据集划分。启下下一篇《线性回归与梯度下降》从零手写第一个模型把本篇的概念全部落地。学完这一节你能动手做判断一个任务是回归还是分类并选对损失函数正确划分 train/val/test避免数据泄漏导致上线就崩用 sklearn 的 fit/predict/score 三件套跑通完整流程学完数学基础我们正式进入机器学习。这一篇不急着讲具体算法而是先把整张地图铺开——你要知道机器学习在解决什么问题、有哪些问题类型、用什么标准衡量好坏。地图清楚了后面每棵树才好种。而且有一个重要事实要提前说明大语言模型的预训练本质就是一个超大规模的分类任务预测下一个 token 属于词表里的哪一类。所以这一篇看似基础实则是理解大模型的地基。一、机器学习的三种范式范式数据形式目标典型任务监督学习有标签(x, y)学 x→y 的映射房价预测、垃圾邮件识别无监督学习只有x找数据内在结构聚类、降维、异常检测强化学习环境反馈奖励学最优决策序列游戏 AI、RLHF本篇聚焦监督学习——它是理解神经网络最直接的路径。至于无监督你只要知道大模型的预训练在海量无标注文本上预测下一个词本质上是自监督学习即用数据本身构造标签下一个词就是标签属于监督与无监督之间的巧妙折中。二、监督学习的两个大类回归与分类importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_regression,make_classification# 回归预测连续数值Xr,yrmake_regression(n_samples80,n_features1,noise12,random_state0)# 分类预测离散类别Xc,ycmake_classification(n_samples80,n_features2,n_redundant0,n_clusters_per_class1,random_state0)fig,axesplt.subplots(1,2,figsize(12,4))axes[0].scatter(Xr[:,0],yr,s25,alpha0.7)axes[0].set_title(Regression: predict a continuous value)axes[0].set_xlabel(feature);axes[0].set_ylabel(target)axes[1].scatter(Xc[:,0],Xc[:,1],cyc,cmapcoolwarm,s25,edgecolork)axes[1].set_title(Classification: predict a discrete label)axes[1].set_xlabel(feature 1);axes[1].set_ylabel(feature 2)plt.tight_layout();plt.show()回归 Regression分类 Classification输出连续值房价 328.5 万离散类别猫/狗/鸟输出层1 个神经元无激活N 个神经元 softmax常用损失MSE / MAE交叉熵 Cross-Entropy评估指标RMSE、MAE、R²Accuracy、F1、AUC大模型的输出层是分类词表 5 万个词 5 万类分类问题输出 5 万个 logits 过 softmax 变成概率。所以 GPT 严格来说是一个50000 类分类器只不过它每次输出一个词然后自回归地接下去。三、损失函数告诉模型你错得多离谱损失函数是训练的方向盘。没有它模型不知道该往哪调。3.1 回归损失MSE 与 MAEy_truenp.array([100.0,200.0,300.0])y_prednp.array([110.0,180.0,330.0])# MSE均方误差msenp.mean((y_pred-y_true)**2)print(MSE :,mse)# (100400900)/3 466.7# RMSE均方根误差量纲与原始值一致更好解释print(RMSE:,np.sqrt(mse))# ≈ 21.6 万和房价同单位# MAE平均绝对误差print(MAE :,np.mean(np.abs(y_pred-y_true)))# (102030)/3 20.0# 手算验证print(手算 MSE:,((110-100)**2(180-200)**2(330-300)**2)/3)MSE 对大误差惩罚更重平方放大所以对异常值敏感MAE 更稳健但导数不连续在 0 处不可导。工程上通常先试 MSE异常值多就换 MAE 或 Huber。3.2 分类损失交叉熵最重要defcross_entropy(y_true_onehot,y_pred_prob):y_pred_probnp.clip(y_pred_prob,1e-12,1.0)return-np.sum(y_true_onehot*np.log(y_pred_prob))# 三分类真实类别是第 0 类y_truenp.array([1,0,0])print(预测很准 :,round(cross_entropy(y_true,[0.9,0.06,0.04]),4))# 0.105print(预测一般 :,round(cross_entropy(y_true,[0.5,0.3,0.2]),4))# 0.693print(预测很糟 :,round(cross_entropy(y_true,[0.1,0.7,0.2]),4))# 2.303为什么分类不用 MSE两个原因分类输出是概率经过 sigmoid/softmaxMSE 配 sigmoid 会导致梯度在饱和区趋近 0学不动交叉熵只关心正确类别的概率梯度信号更强更干净。3.3 二分类交叉熵 BCEdefbce(y_true,y_pred):y_true ∈ {0,1}y_pred 是预测为正类的概率y_prednp.clip(y_pred,1e-12,1-1e-12)return-(y_true*np.log(y_pred)(1-y_true)*np.log(1-y_pred))print(真实1预测 0.9 :,round(bce(1,0.9),4))# 0.105 猜对了损失小print(真实1预测 0.1 :,round(bce(1,0.1),4))# 2.303 猜反了损失大print(真实0预测 0.1 :,round(bce(0,0.1),4))# 0.105四、数据集划分为什么不能用考题当练习册fromsklearn.model_selectionimporttrain_test_splitfromsklearn.datasetsimportload_iris X,yload_iris(return_X_yTrue)# 先分出测试集20%剩下的再分训练/验证75% / 25%X_train_full,X_test,y_train_full,y_testtrain_test_split(X,y,test_size0.2,random_state42,stratifyy)X_train,X_val,y_train,y_valtrain_test_split(X_train_full,y_train_full,test_size0.25,random_state42,stratifyy)print(ftrain{len(X_train)}val{len(X_val)}test{len(X_test)})集合用途能不能用来调参训练集 train更新参数学习✅验证集 val调超参、早停、选模型⚠️ 间接用了测试集 test最终评估泛化能力❌ 绝对不能stratifyy很重要保证划分后各类别比例一致。如果测试集里某个类一个样本都没有评估就失真了。注意random_state固定随机种子保证实验可复现。做机器学习最痛苦的事之一就是结果无法复现。五、第一个完整流程sklearn 三行建模sklearn 的 API 设计极其统一记住这个套路能打天下fromsklearn.datasetsimportload_irisfromsklearn.linear_modelimportLogisticRegressionfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportmake_pipelinefromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_report X,yload_iris(return_X_yTrue)X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42,stratifyy)# 管道先标准化再逻辑回归modelmake_pipeline(StandardScaler(),LogisticRegression(max_iter200))model.fit(X_train,y_train)# ① 训练predmodel.predict(X_test)# ② 预测print(accuracy:,accuracy_score(y_test,pred))print(classification_report(y_test,pred))fit/predict/score三件套是 sklearn 的全部精髓。换成随机森林、SVM、XGBoost代码一模一样——只改make_pipeline里那一行的模型名。为什么必须做标准化fromsklearn.preprocessingimportStandardScaler X_demonp.array([[1.0,5000.0],[2.0,6000.0],[3.0,7000.0]])print(原始:\n,X_demo)print(标准化后:\n,StandardScaler().fit_transform(X_demo).round(3))如果特征 A 范围是 0~1特征 B 范围是 0~10000梯度下降会被大尺度特征主导收敛极慢甚至不收敛。标准化让每个特征均值 0、标准差 1。关键规则scaler 只能在训练集上fit然后transform到验证/测试集。在测试集上重新 fit 属于数据泄漏——考试前偷看了答案的分布。scalerStandardScaler()X_train_sscaler.fit_transform(X_train)# 只在训练集 fitX_test_sscaler.transform(X_test)# 测试集只 transform六、监督学习的完整工作流1. 明确问题是回归还是分类输出是什么 ↓ 2. 收集与清洗数据去重、补缺失、处理异常值Pandas 的活 ↓ 3. 探索性分析 EDA看分布、看相关性、看标签是否均衡Matplotlib 的活 ↓ 4. 特征工程标准化/归一化、编码类别变量、构造新特征 ↓ 5. 划分 train / val / test ↓ 6. 选模型 训练fit ↓ 7. 评估在 val 上看指标画学习曲线诊断过拟合/欠拟合 ↓ 8. 调参学习率、正则强度、模型容量…在 val 上选 ↓ 9. 最终在 test 上跑一次报告结果 ↓ 10. 上线 / 保存模型joblib / pickle保存与加载importjoblib joblib.dump(model,iris_model.pkl)loadedjoblib.load(iris_model.pkl)print(加载后预测:,loaded.predict(X_test[:3]))七、常见坑与注意事项坑现象解决数据泄漏测试集指标虚高上线就崩scaler 只在 train fit时序数据按时间切分标签不平衡99% 是负类全预测负类也有 99% 准确率用 F1/AUC采样或加权忘了标准化模型不收敛StandardScaler放进 pipelinerandom_state不固定每次结果不一样所有随机处设种子用测试集调参泛化评估失真调参用验证集测试集最后只用一次类别特征没编码报错could not convert string to floatOneHotEncoder/LabelEncoder八、本篇小结监督学习分回归连续值MSE和分类离散类别交叉熵两大类大模型输出层就是超大规模分类。损失函数是方向盘回归用 MSE/MAE分类用交叉熵/BCE分类用 MSE 会梯度饱和学不动。数据集三分train 学参数、val 选超参、test 只做最终评估绝不能拿测试集调参。标准化是梯度类模型的刚需且必须用 pipeline 避免数据泄漏。sklearn 的fit/predict/score三件套统一了所有传统机器学习模型的用法。下一篇线性回归与梯度下降我们不用 sklearn从零用 NumPy 手写一个线性回归自己实现梯度下降自己算损失曲线最后和 sklearn 的结果对比验证。这是你第一次完整地从零训练一个模型。本篇是《大模型开发从 0 到 1》专栏第 17 篇阶段 3「机器学习基础」第 1 篇。专栏文章按「分类专栏」归类顺序学习体验最佳。