ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

线性回归与线性分类:从原理到实战的机器学习第一课

线性回归与线性分类:从原理到实战的机器学习第一课 这一节我们聊线性回归和线性分类。如果你刚开始接触机器学习大概率是在吴恩达的课程、周志华的西瓜书、或者学校期末复习提纲里反复见到这两个名词。我见过很多初学者一上来就奔着深度学习、神经网络去结果学到一半发现连最基础的梯度下降都没吃透回头又老老实实把线性模型补了一遍。作为过来人我可以很直接地告诉你线性回归和线性分类是机器学习真正落地的第一课没有之一。这篇文章我会把线性回归和线性分类放在一起讲因为它们在数学上其实是同一个套路。你学会了其中一个另一个基本就是换了个输出函数的事。我会从原理、公式、代码到常见坑位全部过一遍结合我实际跑项目时的经验尽量用大白话把里面的“为什么”解释清楚。如果你正在准备期末考试、刷头歌实验或者想自己动手做一个小项目这篇内容都能直接拿来用。1. 为什么要从线性模型开始学机器学习1.1 线性回归和线性分类到底解决了什么问题先明确一个基本认知机器学习的核心任务是让机器从数据里学到一个函数这个函数能把输入映射成输出。根据输出的类型不同任务被分成两大类——回归和分类。回归任务的输出是连续数值。比如预测房价输入是面积、楼层、地段输出是一个具体的价格数字预测气温输入是经纬度、海拔、湿度输出是温度值。线性回归就是假设这个映射关系是一条直线或一个超平面然后用数据去拟合这条线。分类任务的输出是离散标签。比如判断一封邮件是正常还是垃圾邮件输出是“正常”或“垃圾”两个类别识别一张图片里的动物是猫还是狗输出是一个类别标签。线性分类则是用一条直线或超平面把不同类别的数据点分开。我经常跟初学者打一个比方回归像是在猜一个连续的温度计读数分类像在做判断题。两者学习的本质都是“找到一组参数”让模型的预测结果和真实结果尽可能接近。1.2 模型选择的思路两个模型其实是同一个套路很多人把线性回归和逻辑回归当成两个完全独立的模型来学这是很吃亏的。实际上从数学结构看它们是一个家族线性模型。线性模型的一般形式是[ y w_1x_1 w_2x_2 \cdots w_nx_n b ]其中 (x_1, x_2, \dots, x_n) 是特征(w_1, w_2, \dots, w_n) 是权重(b) 是偏置。把整个式子写成矩阵形式就是[ y \mathbf{w}^T \mathbf{x} b ]线性回归做的事情是让这个 (y) 直接作为预测值输出。线性分类则在这个 (y) 外面再套一层函数把输出压缩到某种“类别概率”的空间里最常见的套法就是sigmoid函数。所以你会发现线性分类 线性回归 一个激活函数 一个分类损失函数。理解了这层关系你后面学逻辑回归、softmax回归、甚至神经网络的基础层都会觉得很顺。因为神经网络的一个神经元本质就是一个线性变换加一个非线性激活函数跟逻辑回归的结构几乎一模一样。1.3 线性模型能覆盖多少真实场景有些人觉得线性模型太简单好像只能处理那些刚好能被一条线分开的数据。实际上线性模型在工业界的应用远比想象中广泛。在金融风控领域逻辑回归是信用评分卡的经典算法因为它在准确率可接受的前提下权重具有极强的可解释性——每个特征对结果的影响方向、大小都可以直接看系数得到。在推荐系统里逻辑回归被用来预估点击率特征是用户和物品的交叉组合。在医学统计中线性回归被用来分析因素与指标之间的相关性。甚至在深度学习里最后一层分类层往往就是线性层加softmax。线性模型的优点在于训练快、可解释性强、不容易过拟合在特征量级不大、数据量适中的场景下它的表现往往不输复杂模型。我做过不少项目最后上线时用深度学习还不如一个做过充分特征工程的逻辑回归稳定这种事在业界一点都不新鲜。2. 线性回归的原理拆解与实操要点2.1 从“拟合一条直线”到最小二乘法线性回归最经典的入门案例是一元线性回归也就是用一条直线来拟合二维平面上的点。假设我们有 (m) 个样本 ((x_i, y_i))目标是找一条直线[ h(x) wx b ]使得所有样本点到这条直线的竖直距离的平方和最小。这个“距离的平方和”就是损失函数也叫均方误差MSE[ J(w,b) \frac{1}{2m} \sum_{i1}^{m} (h(x_i) - y_i)^2 ]前面为什么添一个 (\frac{1}{2})纯粹是为了后面求导方便——平方项求导会产生一个2乘以1/2正好抵消。这个细节考试经常考别记错了。最小二乘法这个名字来自“最小化误差的平方”。误差就是预测值与真实值的差平方是为了让正负误差不会相互抵消同时放大较大误差的影响。直观理解就是我不想让任何一个点的预测偏差太大所以对偏差的平方求和作为总代价。当特征只有一个时可以用解析法直接求出最优的 (w) 和 (b)这就是正规方程[ \mathbf{w} (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y} ]注意正规方程在特征维度很高或者 (\mathbf{X}^T\mathbf{X}) 不可逆时会失效而且求逆运算的复杂度大约是 (O(n^3))特征上万的时候就会非常吃力。所以实际工程中更多会使用梯度下降来迭代求解。2.2 梯度下降机器是怎么一步步找到最优参数的梯度下降的思想很朴素你在山顶上要下山每一步都朝着坡度最陡的方向跨一步就能最快到达山脚。数学上“坡度最陡的方向”就是损失函数对参数的梯度导数的负方向。对权重 (w) 的更新公式是[ w : w - \alpha \frac{\partial J}{\partial w} ]其中 (\alpha) 是学习率决定了每一步跨多大。对线性回归损失函数对 (w) 的偏导数可以推导出具体形式[ \frac{\partial J}{\partial w} \frac{1}{m} \sum_{i1}^{m} (h(x_i) - y_i) \cdot x_i ][ \frac{\partial J}{\partial b} \frac{1}{m} \sum_{i1}^{m} (h(x_i) - y_i) ]这两个公式是线性回归梯度下降的核心。你看梯度的大小跟“预测误差”成正比误差越大参数更新越猛误差趋近于0参数就不再变化。这就是“学习”发生的过程。实际使用的时候根据每次更新动用的样本量梯度下降分成三种批量梯度下降BGD每次用所有样本计算梯度稳定但慢适合小数据集。随机梯度下降SGD每次用一个样本计算梯度快但噪声大参数会震荡。小批量梯度下降Mini-batch GD每次用一小批样本计算梯度是工程中最常用的折中方案PyTorch和TensorFlow里的默认训练方式基本都是这种。初学阶段我建议先把批量梯度下降的实现写清楚跑通之后再切到小批量感受一下区别。2.3 多变量回归与模型评估现实中的问题不会只用一个特征。房价预测要考虑面积、朝向、楼层、周边配套销量预测要考虑价格、季节、促销力度、竞品情况。多变量线性回归的公式只是把一元的情况扩展到向量形式损失函数和梯度公式的结构完全不变只是 (x) 变成了向量。多变量回归里有个非常关键的细节特征缩放。如果不同特征的数值范围相差很大比如面积在几十到几百之间而房龄在1到30之间这本身还好但如果一个特征在0到100000之间另一个在0到1之间梯度下降就会走得非常别扭——在数值大的维度上稍微动一下损失变化就很大在数值小的维度上要动很大损失才有反应。结果是参数更新路径呈狭长的锯齿状收敛很慢。解决办法是标准化或归一化。最常用的是Z-score标准化[ x \frac{x - \mu}{\sigma} ]其中 (\mu) 是特征的均值(\sigma) 是标准差。标准化后特征均值为0方差为1梯度下降的收敛速度会快很多。这一步看起来简单但我见过不少新手忘了做然后抱怨模型不收敛。实际上不是模型的问题是数据没处理好。模型训练完怎么评估好不好回归任务最常用的指标是 (R^2)决定系数[ R^2 1 - \frac{SS_{res}}{SS_{tot}} ]其中 (SS_{res}) 是残差平方和(SS_{tot}) 是总平方和。(R^2) 的取值范围一般在0到1之间越接近1说明模型解释了多少比例的数据方差。注意(R^2) 不是“准确率”它只是一个相对拟合优度的度量。用不同数据集训练出来的模型(R^2) 不能直接对比。2.4 正则化当线性模型也开始“背答案”线性模型虽然简单但特征一多照样会过拟合。比如你有100个样本但有500个特征模型完全可以找到一组参数让训练集上的误差变成0但泛化能力很差——换个新数据就彻底崩了。解决过拟合的手段很多正则化是其中最重要的一种。在损失函数后面加一个惩罚项让权重不要太大[ J MSE \lambda \sum_{j1}^{n} w_j^2 ]这叫L2正则化对应的模型叫岭回归Ridge Regression。它的直观作用是让每个特征的权重都变得很小、很均匀模型变得“温顺”。另一种是L1正则化惩罚项是权重绝对值之和[ J MSE \lambda \sum_{j1}^{n} |w_j| ]对应的模型叫套索回归Lasso Regression。L1正则化有个有趣的性质它会把一部分权重变成精确的0。也就是说它自动帮你做了特征选择——不重要的特征权重直接被清零。这在特征数量大、有效特征少的场景下非常有用。(\lambda) 是正则化强度越大惩罚越重模型越简单。怎么选交叉验证把训练集切成几份轮流拿一份当验证集看哪个 (\lambda) 的验证误差最低。我在实际项目中见过很多人一上来就调模型结构其实先把是否标准化、是否加正则化这两个点试一遍效果往往立竿见影。这两个点成本极低收益却很高。3. 线性分类的原理拆解与实操要点3.1 为什么分类不能直接套线性回归有些人会想分类不就是把回归出来的数值映射到类别吗比如预测值大于0.5就算类1小于0.5就算类0直接用线性回归不行吗理论上有一种叫线性概率模型的做法但实际效果很差。原因有三层第一线性回归的输出没有任何约束可能落在-100到100很难解释成概率。 第二线性回归的损失函数假设误差是高斯分布这对0/1标签完全不成立。 第三也是最致命的线性回归在分类问题上的损失函数是非凸的用梯度下降很容易陷入局部最优解。所以我们需要把线性回归的输出过一个sigmoid函数把它压到0到1之间再配合合适的损失函数来做分类。这个模型就是逻辑回归Logistic Regression。3.2 逻辑回归把回归结果变成概率sigmoid函数长这样[ \sigma(z) \frac{1}{1 e^{-z}} ]其中 (z \mathbf{w}^T \mathbf{x} b)。函数图像是S形曲线当 (z) 趋近正无穷时输出趋近1(z) 趋近负无穷时输出趋近0(z0) 时输出为0.5。所以模型的输出可以解释为给定特征 (x)属于类别1的概率[ P(y1 | x) \sigma(\mathbf{w}^T \mathbf{x} b) ]这里有个初学者常问的问题为什么偏偏用sigmoid一方面是因为它的输出范围天然适合概率表达另一方面从指数族分布和对数几率的角度可以推导出当你用线性模型建模对数几率时反推出来的函数就是sigmoid。更深层的原因是它属于广义线性模型在给定假设下是有统计理论支撑的。判断样本属于哪一类看概率是否大于0.5。这个0.5就是一个分类阈值。实际应用中阈值不一定非用0.5。如果垃圾邮件宁可错杀也不放过可以把阈值调低如果误诊的代价很高就把阈值调高。阈值是可调的这一点很多人没意识到。3.3 损失函数为什么选交叉熵逻辑回归的损失函数不是均方误差而是交叉熵[ J(\mathbf{w}) -\frac{1}{m} \sum_{i1}^{m} \left[ y_i \log(p_i) (1 - y_i) \log(1 - p_i) \right] ]为什么不用均方误差从优化角度解释均方误差加上sigmoid之后损失函数关于参数是非凸的存在很多局部极小值梯度下降很难找到全局最优。而交叉熵加上sigmoid的组合整体是凸函数有唯一的最优解梯度下降可以稳定收敛。从直觉上理解交叉熵衡量的是两个概率分布的差异。真实标签是 (y)我们的预测概率是 (p)两者越接近交叉熵越小差距越大惩罚越大。当真实标签是1而预测概率接近0时(\log(p)) 会趋近负无穷损失爆炸这就逼着模型必须修正自己的预测。交叉熵的另一个好处是梯度形式非常简洁。对参数 (\mathbf{w}) 求导后梯度仍然是“误差乘以特征”的形式[ \frac{\partial J}{\partial \mathbf{w}} \frac{1}{m} \sum_{i1}^{m} (p_i - y_i) \mathbf{x}_i ]这个形式和线性回归的梯度几乎一样只是误差从 ((h(x) - y)) 换成了 ((p - y))。这也是为什么我说线性回归和线性分类本质上是一个套路。3.4 决策边界与多分类问题逻辑回归模型中分类决策看的是 (\mathbf{w}^T \mathbf{x} b) 是否大于0因为这个值大于0时sigmoid输出大于0.5。所以决策边界是[ \mathbf{w}^T \mathbf{x} b 0 ]这是一个超平面。在二维平面上就是一条直线在三维空间里是一个平面。如果数据在原始特征空间中不能用一条直线分开逻辑回归直接硬跑肯定是分不了的。这时候常见的做法是引入非线性特征比如多项式特征[ z w_1 x_1 w_2 x_2 w_3 x_1^2 w_4 x_2^2 w_5 x_1 x_2 b ]通过这种方式线性模型在原始空间里仍然是“线性”的但在新的特征空间里可以拟合非线性边界。这就是特征工程的威力所在——很多看似线性模型解决不了的问题做好特征变换后逻辑回归也能胜任。再说多分类。逻辑回归本身是二分类模型处理多分类有两种常见方案第一种是“一对多”One-vs-Rest训练多个二分类器每个分类器负责判断“是不是第i类”最后选择得分最高的类别。sklearn里的LogisticRegression默认就是用这种方式。第二种是softmax回归也叫多项逻辑回归直接一次输出各个类别的概率。softmax函数是sigmoid在多分类上的推广输出向量的每个元素都在0到1之间且和为1。如果类别之间不是互斥的比如一张图片里同时有猫和狗那应该用多个独立的二分类器如果类别互斥比如手写数字0-9softmax是更自然的选择。3.5 分类模型怎么评估分类任务的评估指标比回归丰富得多因为涉及到“判断对了没问题判断错了要分情况”。单看准确率accuracy是最容易踩坑的。如果一个数据集里99%是负样本1%是正样本模型把所有样本都预测为负准确率能达到99%但显然这个模型毫无用处。这就是类别不平衡问题。更细的指标从混淆矩阵出发真正例TP预测为正实际也为正。假正例FP预测为正实际为负也叫误报。假负例FN预测为负实际为正也叫漏报。真负例TN预测为负实际也为负。精确率Precision是预测为正的样本中真正为正的比例(P TP / (TP FP))。召回率Recall是实际为正的样本中被找出来的比例(R TP / (TP FN))。这两个指标往往此消彼长。F1分数是二者的调和平均适合需要同时兼顾的情况。ROC曲线和AUC值则刻画了模型在不同阈值下的综合表现。AUC越接近1模型越好0.5相当于随机猜测小于0.5说明你搞反了预测方向。ROC曲线的绘制需要计算不同阈值下的真正例率和假正例率sklearn一行代码就能画出来但原理要清楚。评估指标的选择要跟业务绑定在垃圾邮件拦截里更看重精确率因为不想误杀正常邮件在癌症筛查里更看重召回率因为漏诊比误诊更严重。没有放之四海皆准的最优指标只有最贴合场景的指标。4. 完整实操从数据到模型的两条案例4.1 案例一房价预测线性回归我直接用sklearn来演示一个完整的线性回归流程。这里用经典的波士顿房价数据集来做示范虽然这个数据集后来被移除了但思路是一样的。第一步加载数据、切分训练集和测试集from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score data load_diabetes() X, y data.data, data.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 )第二步标准化特征scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)这里要注意scaler只能用训练集的数据来fit然后用同一个scaler去transform测试集。如果拿全部数据去fit会造成数据泄漏测试集的结果会虚高。第三步训练模型并评估model LinearRegression() model.fit(X_train_scaled, y_train) y_pred model.predict(X_test_scaled) print(MSE:, mean_squared_error(y_test, y_pred)) print(R2:, r2_score(y_test, y_pred))跑完之后你会得到一组数值。初学者最容易犯的一个错误是只看MSE和R2不看预测结果的分布。我建议把真实值和预测值画成散点图看看是不是围绕对角线分布有没有明显的系统性偏差。如果所有预测值都集中在某个区间说明模型没有学到位。4.2 案例二鸢尾花品种分类线性分类再来看一个分类的案例使用经典的鸢尾花数据集。这个数据集有四个特征花萼长度、花萼宽度、花瓣长度、花瓣宽度共三个类别。from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix iris load_iris() X, y iris.data, iris.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) clf LogisticRegression(max_iter1000, multi_classauto) clf.fit(X_train_scaled, y_train) y_pred clf.predict(X_test_scaled) print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))这里我用stratifyy做分层抽样保证训练集和测试集里三个类别的比例一致。这是类别不平衡场景下的基本操作在鸢尾花这种均衡数据上影响不大但习惯一定要养成。max_iter1000也很关键。sklearn的LogisticRegression默认用L-BFGS求解迭代次数不够会报警告。初学者经常遇到这个警告以为是代码写错了其实只是默认迭代次数不够覆盖收敛过程。调大即可相当于给了优化器更多时间。4.3 数据预处理被忽视但最重要的一步像前面强调的标准化是线性模型的必需品。很多新手拿到数据直接丢进模型结果效果很差第一反应是换更复杂的模型而不是检查数据。我处理过的一个典型问题是某个特征的范围是0到100000另一个是0到1不标准化的话小范围特征对模型的贡献几乎被淹没。标准化之后模型效果立刻提升不少。除了标准化还要检查缺失值、异常值。线性回归对异常值非常敏感因为损失函数是平方误差一个极端离群点就可能把拟合直线拉偏。处理异常值的方法有很多比如缩尾截断、剔除或者用更稳健的损失函数但最基础的一点是首先可视化数据分布确认异常值存在之后再做处理。我个人的习惯是数据预处理的时间至少要占整个项目周期的60%以上。模型调参很快但数据质量不行再好的模型也白搭。这一点放到机器学习任何算法里都成立。5. 常见问题与排查技巧实录5.1 特征量纲差异导致梯度下降震荡这个问题在前面提过但值得再展开一下。当特征没有标准化时损失函数的等高线呈狭长椭圆形梯度下降在某个方向上走得快另一个方向上走得慢就会来回震荡。表现是loss曲线像锯齿一样抖动迟迟不收敛。排查方法是打印训练过程中的损失值看曲线形态。如果震荡剧烈优先检查特征是否标准化。把数据标准化之后损失曲线通常会变得平滑很多。还有如果你是自己手写梯度下降记得在更新参数的代码里把偏置项b和权重项w分开更新它们的学习率可以不一样但一般取相同的值就够了。5.2 学习率设置不当学习率太小模型收敛极慢可能跑了上千轮loss还没降到位太大loss直接发散甚至变成NaN。一个简单的方法是先用0.1、0.01、0.001这样对数间隔的数值试几次看哪个量级上loss曲线最稳定。更专业的做法是用学习率衰减训练初期用较大学习率快速下降后期用较小学习率精细收敛。在sklearn的模型里你不需要手动调学习率内部优化器已经处理好了。但如果你自己写梯度下降的代码这是必踩的坑。5.3 过拟合与欠拟合怎么判断判断模型是欠拟合还是过拟合最简单的方法是画学习曲线横轴是训练集大小纵轴是误差。如果训练误差和验证误差都很高且两者接近属于欠拟合模型太简单了。如果训练误差很低、验证误差很高属于过拟合模型把训练集的噪声都背下来了。对于线性模型欠拟合时可以考虑增加特征、构造多项式特征过拟合时优先考虑正则化或者增加训练数据、减少特征数量。很多人在欠拟合和过拟合的处理上容易本末倒置一上来就换复杂模型这会让问题更难排查。5.4 类别不平衡时的评估陷阱类别不平衡问题在实际业务中非常普遍。比如信用卡欺诈检测欺诈样本可能只占万分之一。如果只看准确率模型全部预测为“正常”就能达到99.99%的准确率但实际上没有任何用处。应对方法从数据层面可以有重采样对少数类过采样、对多数类欠采样从算法层面可以调整类别权重sklearn的LogisticRegression里有class_weightbalanced参数从评估层面应该多看精确率、召回率、F1和ROC-AUC而不是准确率。另外对于训练集和测试集的划分如果类别不平衡务必使用分层抽样确保两个集合中的类别比例一致。5.5 概率输出不等于真实置信度逻辑回归输出的概率是通过sigmoid函数映射得到的它和真实概率之间存在校准偏差。举个极端例子模型输出0.8不代表这类样本的真实正例概率就是80%。这在高风险决策场景比如医疗诊断、信用评估中非常关键。如果业务需要得到可靠的概率值就要做概率校准。sklearn提供了CalibratedClassifierCV可以用Platt缩放或等渗回归把模型输出校准到更接近真实概率。这也是为什么有些人在做机器学习项目时会专门准备一个“校准集”来评估和调整概率输出——它和训练集、验证集是分开的目的是避免校准过程的信息泄漏。6. 学完线性模型之后往哪走6.1 从线性到非线性的跳板线性模型最大的局限是只能处理线性关系。当你碰到特征和目标之间呈现明显非线性关系时线性模型的拟合能力就不够了。这时候有几个扩展方向第一是特征工程升级版比如构造多项式特征、引入核函数。核技巧可以让线性模型在高维空间里隐式地处理非线性关系这就是支持向量机SVM的核心思想。SVM在样本量不大、特征维度较高时表现非常好是线性模型到非线性模型之间最平滑的过渡。第二是树模型比如决策树、随机森林、梯度提升树XGBoost、LightGBM。树模型天然可以处理非线性关系、特征交互和缺失值不需要太多预处理在结构化数据任务中往往是效果最好的选择。第三是神经网络。神经网络的每一层都可以看作多个线性变换加非线性激活函数。从数学上说多层神经网络在足够宽的条件下可以逼近任意连续函数。线性模型里学到的损失函数、梯度下降、过拟合概念在神经网络中全部复用只是求解的难度和复杂度大幅上升。6.2 泛化误差界与理论视角有些学校和研究机构会在高级课程里强调机器学习的数学理论比如泛化误差界。泛化误差界关心的问题是模型在训练集上的误差和它在未知数据上的误差之间到底有多大差距从统计学习理论的角度模型的总误差可以粗略分解为偏差、方差和噪声三部分。偏差来自模型假设的局限方差来自训练集波动带来的影响。线性模型通常偏差较大但方差较小深度模型通常偏差小但方差大。找到一个合适的平衡点就是机器学习实践中最核心的调参思路。学习这些理论的意义不是为了考试而是让你明白模型为什么有效、为什么失效。很多人只知道调参遇到问题全靠试浪费时间不说效果还不可控。稍微懂一点理论你能在动手之前就预判出大概哪个方向可行。6.3 实验环境搭建与工具链如果你在学校实验室或者自己的电脑上跑机器学习环境搭建是最先要解决的问题。个人开发阶段Anaconda加Jupyter Notebook是最快的组合conda帮你管理Python版本和依赖包Jupyter适合做探索性分析。sklearn是线性模型最主要的工具库配合pandas做数据处理、matplotlib和seaborn做可视化基本覆盖了90%的日常需求。如果是多人协作或者要跑更大规模的实验可以考虑在实验室服务器上搭建统一的GPU环境用Docker把依赖打包用conda创建独立环境管理不同项目的包版本。我踩过一个坑两个项目分别需要不同版本的numpy直接覆盖安装导致另一个项目全部报错后来用conda环境隔离再也没出过这种问题。如果只是想快速复现这篇文章的代码本地装一个sklearn就够了。数据规模小的时候不需要GPUCPU跑线性模型绰绰有余。6.4 用线性模型做第一个完整项目学算法的最终目的是解决实际问题。我强烈建议你学完线性回归和线性分类后立刻找一个完整项目练手而不是继续堆砌新的算法。什么样的项目适合作为第一个完整项目数据集干净、特征含义明确、评价指标清晰的。比如UCI的Adult数据集预测收入是否超过5万美元、Kaggle的Titanic数据集预测乘客是否幸存或者简化版的房价预测。这些数据集网上都有现成的下载渠道不需要自己爬数据和做大量清洗。完整项目要包括这些环节数据探索和可视化、清洗和预处理、特征工程、模型训练、模型评估、结果总结。整个过程走一遍你才能真正理解数据、模型、评估三者之间的关系。我遇到很多学生算法公式背得很熟但一旦让他从头做一个端到端的项目就卡壳缺失值怎么处理、特征怎么编码、模型选哪个这些问题不亲手做一遍是不会有真实体感的。我自己当年就是靠一个手写数字识别的小项目把线性回归、逻辑回归、梯度下降、交叉验证这些概念彻底打通了。那之后再看深度学习的内容很多地方一下就通了。所以别急着往下学新模型先把这两个基础模型在完整项目里用到得心应手再往前走。最后再分享一个小技巧。很多人学机器学习只盯着模型和算法忽略了工程实践里的hill系统方法和复盘习惯。我每次跑完实验都会把数据分布、预处理方式、模型参数、评估结果记录下来哪怕效果很差也记。一段时间后回看这些笔记能明显看到自己的思考方式在变化。这个习惯帮我避开了很多重复踩坑也让我对模型的行为有了更敏锐的判断力。如果你刚开始学机器学习不妨也试试。
返回列表