监督学习入门线性回归与分类在深度学习和大模型出现之前机器学习就已经在解决大量真实世界的问题了。这一篇的目标是让你真正理解监督学习的工作原理而不仅仅是会调用API。1.1 一、什么是监督学习带答案的练习题监督学习完整流程——从训练数据到预测输出的五个核心步骤1.1.1 先从直觉出发想象你在教一个孩子学认字。你的做法是拿出一张张卡片每张上面印着一个字你告诉孩子这个字念什么是什么意思。孩子看了几百张卡片之后遇到新的字就能猜出大概是什么意思。这就是监督学习的核心逻辑给机器看大量有答案的例子让它自己找规律然后用学到的规律来回答新问题。**监督Supervised**的含义就在这里——训练数据每条都带有答案标签相当于有老师在监督和纠正。带答案的训练数据 (房子面积80平方米) → 答案房价200万 (房子面积120平方米) → 答案房价280万 (房子面积60平方米) → 答案房价160万 ... 学习后给新数据 (房子面积100平方米) → 模型预测约240万相比之下传统编程的思路是程序员写规则计算机执行规则。比如要识别垃圾邮件你可能会写“如果邮件包含’免费领取’且发件人不在通讯录里标记为垃圾邮件”。但这种规则很快就会失效——垃圾邮件发送者会不断变换措辞。监督学习让计算机自己找规律给它看数千条已标注的例子计算机能发现比人工规则更全面、更鲁棒的特征。1.1.2 什么时候用回归什么时候用分类监督学习分两大类判断标准很简单看你要预测的东西是连续的数值还是离散的类别。问题类型要预测的是什么用什么算法例子回归Regression连续数值线性回归、随机森林回归房价200万、280万、温度25℃、销量500件分类Classification离散类别逻辑回归、决策树垃圾邮件是/否、猫狗鸟三类、情感正/负/中性判断口诀预测出来的东西能在数轴上找到位置吗能的话用回归不能的话用分类。1.2 二、线性回归最简单的回归模型回归 vs 分类——监督学习的两大任务类型对比1.2.1 为什么从线性回归开始线性回归不只是一个简单的入门算法它是理解整个机器学习的钥匙。神经网络中的每一个神经元本质上就是在做线性回归再加一个激活函数。从线性回归出发你能看清楚机器学习最核心的三个要素模型、损失函数、优化。1.2.2 用直线拟合数据的直觉设想你手里有一批房价数据每套房子的面积平方米和对应的售价万元。你把这些数据点画在坐标纸上发现一个规律面积越大价格越高而且基本成正比。线性回归做的事情就是找一条直线让它尽量穿过这些数据点——不是穿过每一个点做不到因为数据有噪声而是让直线和所有数据点的总体距离最小。为什么用平方误差而不是直接用误差之和如果直接用误差之和正误差和负误差会相互抵消结果没有意义。平方之后所有误差变成正数大误差被惩罚得更重误差为2时平方误差是4误差为1时只有1——让模型更努力地避免离群点的巨大误差线性回归与神经网络的关系线性回归是神经网络最简单的特例没有隐藏层没有激活函数只有输入直接连到输出。一个有100个输入特征的线性回归等价于一个只有输入层和输出层的神经网络输出层没有激活函数。理解这个联系你就能理解神经网络为什么能学习复杂关系通过堆叠多个线性变换加非线性激活函数逐层学习越来越抽象的特征表示。1.2.3 线性回归代码实战这段代码在做什么生成模拟的面积-房价数据用线性回归拟合然后评估模型好坏并可视化结果。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportmean_squared_error,r2_score# 生成示例数据面积 → 房价np.random.seed(42)# reshape(-1, 1) 解释# np.random.uniform() 生成的是一维数组 (200,)# sklearn 要求输入是二维数组 (200, 1)即200行、每行1个特征# -1 是自动计算行数的意思areanp.random.uniform(50,200,200).reshape(-1,1)price2.5*areanp.random.normal(0,20,(200,1))50# 划分训练集和测试集80%训练20%测试X_train,X_test,y_train,y_testtrain_test_split(area,price,test_size0.2,random_state42)# 训练模型modelLinearRegression()model.fit(X_train,y_train)# 预测y_predmodel.predict(X_test)# 评估msemean_squared_error(y_test,y_pred)r2r2_score(y_test,y_pred)print(f均方误差MSE:{mse:.2f})# 越小越好0表示完美print(fR²分数:{r2:.4f})# 越接近1越好表示模型解释了多少数据变化print(f斜率面积每增加1平方米价格增加:{model.coef_[0][0]:.4f}万元)print(f截距:{model.intercept_[0]:.4f}万元)你应该看到类似这样的输出均方误差MSE: 405.83 R²分数: 0.9856 斜率面积每增加1平方米价格增加: 2.4937 万元 截距: 51.3842 万元R²接近10.9856说明线性模型很好地捕捉到了面积和房价的关系。斜率约2.49接近我们设定的真实斜率2.5说明模型学习正确。线性回归的数学本质y w₁x₁ w₂x₂ ... wₙxₙ b训练目标找到最优的 w权重和 b偏置使预测误差均方误差最小。1.3 三、逻辑回归分类任务的基础1.3.1 为什么不能直接用线性回归做分类假设你想根据肿瘤大小判断是否为恶性0良性1恶性。用线性回归会得到一个连续值——可能是0.3也可能是1.7甚至是-0.2。这些数字不能直接解释为是/否而且概率只能在0到1之间线性回归的输出可以超出这个范围。更深的问题是分类问题里你更想要的是一个概率——某个样本属于正类的可能性有多大这就引出了Sigmoid函数的需求。1.3.2 Sigmoid函数把任意数值压缩到(0,1)Sigmoid函数的形状就像一个S当输入很大时特征强烈指向正类输出接近1高概率是正类当输入很小时特征强烈指向负类输出接近0低概率是正类当输入为0时两边势均力敌输出正好是0.5这样逻辑回归就把任意实数范围的线性输出压缩成0到1之间的概率完美适合分类任务。名字叫回归但实际上是分类模型——这是个历史遗留的命名问题。1.3.3 逻辑回归代码实战这段代码在做什么加载乳腺癌数据集569个样本30个特征二分类良性/恶性标准化后训练逻辑回归模型并打印详细评估报告。fromsklearn.linear_modelimportLogisticRegressionfromsklearn.datasetsimportload_breast_cancerfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportaccuracy_score,classification_reportfromsklearn.model_selectionimporttrain_test_split# 加载乳腺癌数据集二分类良性/恶性dataload_breast_cancer()X,ydata.data,data.target# 数据标准化把所有特征缩放到均值为0、方差为1# 为什么要标准化逻辑回归对特征尺度敏感# 如果有的特征是[0,1]有的是[0,1000]大尺度特征会主导学习过程scalerStandardScaler()X_scaledscaler.fit_transform(X)# 划分数据X_train,X_test,y_train,y_testtrain_test_split(X_scaled,y,test_size0.2,random_state42)# 训练clfLogisticRegression(max_iter1000)clf.fit(X_train,y_train)# 评估y_predclf.predict(X_test)print(f准确率:{accuracy_score(y_test,y_pred):.4f})print(\n分类报告:)print(classification_report(y_test,y_pred,target_namesdata.target_names))你应该看到类似这样的输出准确率: 0.9649 分类报告: precision recall f1-score support malignant 0.95 0.95 0.95 40 benign 0.97 0.97 0.97 74 accuracy 0.96 114准确率96.5%说明逻辑回归在这个医疗数据集上效果非常好。注意两个类别的召回率都在95%以上——对医疗诊断来说召回率漏诊率的反面尤为重要。1.4 四、支持向量机SVM找最宽的分界线1.4.1 为什么要最大化间隔逻辑回归找到的是一条能正确分开数据的线但满足条件的线可以有无数条。SVM的洞察是这些线里离两侧数据点都最远的那条线对新数据的泛化能力最强。直觉想象桌上散落着红豆和绿豆你要用一把尺子把它们分开。有无数种放法但SVM要找那把离两侧豆子都最远的放法——这条线两侧的空白区域越宽越好这就是最大间隔。宽间隔意味着即使来了稍微有噪声的新数据也不容易被分错容错能力更强。核方法有时红豆和绿豆混在一起直线根本分不开。核方法的思路是把平面折弯成三维空间让原来分不开的数据在高维空间里变得线性可分。fromsklearn.svmimportSVCfromsklearn.datasetsimportmake_classification# 生成二分类数据X,ymake_classification(n_samples500,n_features2,n_redundant0,random_state42)X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 训练SVMRBF核处理非线性问题# C惩罚系数C越大越不允许分错容易过拟合越小容错性更好# gammascale自动计算的合理默认值svmSVC(kernelrbf,C1.0,gammascale)svm.fit(X_train,y_train)print(fSVM准确率:{svm.score(X_test,y_test):.4f})SVM的优势高维数据表现好文本分类、对小数据集有效、有理论保证最大间隔SVM的局限大数据集训练慢、对特征尺度敏感需要标准化、参数调优比较麻烦1.5 五、特征工程传统ML的核心竞争力1.5.1 为什么特征工程如此重要传统机器学习有一个著名的说法“垃圾进垃圾出Garbage in, garbage out”。这是传统ML与深度学习的根本区别之一传统ML需要人工提取特征深度学习能自动学习特征。一个用户是否会流失直接看注册日期和用户ID是没用的但距上次登录天数和近一个月消费频率就是有价值的特征——这种从原始数据构造有意义特征的过程需要人脑来设计。好的特征工程可以让简单模型超越复杂模型。importpandasaspd# 示例电商用户特征工程dfpd.DataFrame({user_id:[1,2,3,4,5],register_date:[2023-01-01,2023-06-15,2024-01-20,2022-12-01,2024-03-01],last_purchase:[2024-01-01,2024-02-01,2024-03-01,2023-12-01,2024-03-15],total_orders:[50,3,12,100,1],total_amount:[5000,300,1200,15000,80]})df[register_date]pd.to_datetime(df[register_date])df[last_purchase]pd.to_datetime(df[last_purchase])# 特征工程从原始字段构造新特征reference_datepd.Timestamp(2024-04-01)df[days_since_register](reference_date-df[register_date]).dt.days# 注册多久了df[days_since_purchase](reference_date-df[last_purchase]).dt.days# 多久没购买了df[avg_order_value]df[total_amount]/df[total_orders]# 客单价df[purchase_frequency]df[total_orders]/df[days_since_register]# 购买频率print(df[[user_id,days_since_register,days_since_purchase,avg_order_value,purchase_frequency]])你应该看到一个表格展示5个用户的特征包括注册天数、最后购买距今天数、客单价和购买频率。这些特征比原始的注册日期和总金额对预测用户行为更有价值。1.6 六、多分类问题现实中很多问题有多个类别不是简单的是/否。fromsklearn.datasetsimportload_iris# 鸢尾花数据集3类setosa/versicolor/virginicairisload_iris()X,yiris.data,iris.target X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 逻辑回归处理多分类# multi_classmultinomial同时考虑所有类别的概率Softmax方式fromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportclassification_report clfLogisticRegression(multi_classmultinomial,max_iter1000)clf.fit(X_train,y_train)print(f多分类准确率:{clf.score(X_test,y_test):.4f})print(classification_report(y_test,clf.predict(X_test),target_namesiris.target_names))你应该看到准确率约97%三个类别都有较高的精确率和召回率。小结算法适用场景优点缺点适合用于线性回归连续值预测简单、可解释、训练快只能拟合线性关系房价、销售额预测逻辑回归二/多分类输出概率、可解释线性决策边界垃圾邮件过滤、医疗诊断SVM高维、小数据集泛化性好、理论完备大数据慢、调参复杂文本分类、图像识别小数据这三个算法都有一个共同的局限线性假设——它们假设数据可以用直线超平面分开或拟合。现实数据往往不满足这个假设。下一篇我们看决策树——一种完全不同的思路通过非线性的分割来处理更复杂的数据边界。