拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Scikit-Learn五分类算法对比实战:从原理到调参选型

很多刚开始学机器学习的朋友应该都有过这种体验教材和网课一口气抛出感知机、逻辑回归、SVM、决策树、KNN五个分类算法每个都单独看觉得懂了可真拿到一份数据却完全不晓得该先跑哪个模型。我当年踩了一年坑之后才算想明白一件事——这几个基础分类算法不是彼此割裂的知识点而是同一件事的不同解法和取舍把它们放在同一个框架里对照着学才是最快的内化路径。所以这篇东西不打算按教科书方式一个个“介绍”算法而是直接用 scikit-learn 把这五类模型全部串起来从原理本质、适用边界、代码实现到调参陷阱一次性讲透。不管你是刚装好 Scikit-Learn 还在啃 API 的新手还是已经跟着实验做过决策树收入预测、KNN 红酒分类这类练手项目、想补原理短板的进阶同学这篇文章的定位都很明确看完你会有一张清晰的选型地图同时拿到一套可以直接抄作业的对比实验模板。1. 环境和实验设计为什么把五个模型放在一起跑先花两分钟把实验环境准备好。老手可以直接跳到 1.2 节新手建议整个流程跟一遍因为你会发现后面所有代码都依赖这套固定的 fit/predict/score 结构。1.1 安装 scikit-learn 与版本选择安装本身没什么玄学官方推荐的现代方式是直接用 pip 装pip install scikit-learn如果用的是 Anaconda 发行版通常自带 scikit-learn没有的话敲一行conda install scikit-learn装完强烈建议顺手装两个辅助库后面做数据操作和可视化都会用到pip install pandas matplotlib版本问题上我多说一句。scikit-learn 从 0.22 开始弃用了一些老 API1.0 之后又统一了大部分接口目前主流教程都是基于 1.x。装好后可以在 Python 里确认一下import sklearn print(sklearn.__version__)只要输出是 1.0 以上下面所有代码都能直接跑。我本机用的版本比较新文中的参数名称和写法在 1.0 到 1.3 之间都是稳定的完全不用担心过时问题。注意安装时容易踩的第一个坑是 NumPy 版本冲突。scikit-learn 对 NumPy 版本有最低要求如果你以前装过老版本 NumPy建议用pip install -U numpy scikit-learn一并升级别单独装 sklearn否则很容易出现导入时报错。1.2 一个模型训练的最小完整流程学习 scikit-learn 最重要的一件事是它的绝大部分模型都长得一模一样。任何分类器几乎都是下面这套三段式操作from sklearn.svm import SVC model SVC() # 1. 创建模型设置超参数 model.fit(X_train, y_train) # 2. 喂训练数据拟合模型 acc model.score(X_test, y_test) # 3. 在测试集上评估这段代码里的X_train是训练特征矩阵y_train是标签向量。你只要接受这套统一接口感知机、逻辑回归、SVM、决策树、KNN 这些完全不同的算法在代码层面只是换了第一行的类名而已。这也是我一开始就选择 scikit-learn 作为学习框架的原因——它可以把你从“背每个算法各自的 API”里解放出来让你把注意力全部放在“算法本身在解决什么问题”。后面所有代码都遵循这套三段式唯一变化的是模型名和参数。宏观上用一句话概括整个实验流程加载数据拆分训练集和测试集做特征缩放用五个模型分别训练并评估针对每个模型做基本的超参数调优这个流程本身就是工业界做 baseline 的标准动作不是教学专用这点你往后做项目会越来越有体会。2. 五个分类算法的原理本质与适用边界这里我不会给你堆公式而是用最直白的方式说清楚每个算法的“决策思路”因为只有理解了思路你才知道什么时候该用它、什么时候它一定会翻车。2.1 感知机理解“让错误推动学习”的起点感知机Perceptron可以说是所有神经网络和线性模型的祖师爷1957 年由 Frank Rosenblatt 提出。它的核心思路极度简单找一条直线在二维空间中把两类点分开。怎么找呢随机初始化一条线然后逐个看样本点如果某个点被分错了就调整线的位置让这条线往错误点的方向“拉一拉”。一直重复这个过程直到所有点都被分对或者达到最大迭代次数。在 scikit-learn 里代码是from sklearn.linear_model import Perceptron perceptron Perceptron(max_iter1000, random_state42) perceptron.fit(X_train, y_train)注意“线性可分”这四个字这是感知机的命门。如果两类数据在特征空间里本身就是你中有我、我中有你感知机永远不会收敛。还有一个容易被忽略的点默认的 Perceptron 只能用二分类处理多分类其实是 sklearn 在内部帮你做了 OvR一对多策略。实操心得你可能会问既然感知机这么简单为什么现在没人直接用它因为它在可训练性和稳定性上不如逻辑回归——感知机对于落在决策边界附近的点极其敏感轻微扰动就会让模型在学习过程中震荡。但它的意义在于它是理解“迭代式学习”“误差驱动”的最佳入门素材神经网络全连接层的本质就是一个带激活函数的多层感知机。2.2 逻辑回归线性分类器里最实用的那个逻辑回归Logistic Regression名字里带“回归”干的却是正儿八经的分类活。它和线性回归很像都是算一条加权线性的分数( z w_1x_1 w_2x_2 ... b )。不同之处在于它把这个分数再塞进一个 Sigmoid 函数把连续值压到 0 到 1 之间当作“样本属于某一类”的概率。比如分数 z 算出来是 3经过 Sigmoid 变成 0.95那模型就认为这个样本有 95% 的概率属于正类。默认情况下sklearn 把概率大于 0.5 的判成正类小于 0.5 判成负类。这个“概率输出”能力是逻辑回归最大的价值——你可以拿它做排序比如根据点击率排序、风险评级而不仅仅是一个 yes/no 的分类器。from sklearn.linear_model import LogisticRegression lr LogisticRegression(max_iter1000, random_state42) lr.fit(X_train, y_train) proba lr.predict_proba(X_test) # 得到每类的概率为什么逻辑回归这么常用因为它训练快、内存小、可解释性强权重 w 直接告诉你每个特征对结果的正向或负向影响而且不管数据量是几千条还是几百万条都能表现得不错。它的短板也很明确——特征与标签之间的关系如果高度非线性逻辑回归的边界就是一条直线或一个超平面很难拟合出复杂形状。2.3 SVM用“最大化间隔”寻找最稳健的分割线支持向量机Support Vector Machine简称 SVM和逻辑回归一样也是线性分类器但它选分界线的标准与众不同不只找一条能正确分类的线而是要找到离两侧最近样本点都最远的那条线。这些决定边界的最近样本点就叫“支持向量”它们像夹住一根杆子两侧的支撑点一样把决策边界的位置“撑”出来。这条最大间隔线的优势是泛化能力通常更好——因为分类边界离两侧数据都足够远新样本落在模糊地带的概率就低。sklearn 里的实现还会引入一个惩罚参数 C用来控制“对误分类样本的容忍度”。C 越大模型越想把每个样本都分对主导者是严格追求训练集正确率但也更容易过拟合C 越小模型允许一定数量的错误换取更平滑的边界和更强的泛化能力。from sklearn.svm import SVC svm_linear SVC(kernellinear, C1.0, random_state42) svm_rbf SVC(kernelrbf, C1.0, gammascale, random_state42)SVM 真正的杀手锏是“核技巧”kernel trick。简单说如果数据在原始空间里乱七八糟没法用一条直线分开我可以把它们映射到更高维的空间——在低维空间里拧成一团的数据升维之后往往能用一个平面轻轻切开。核技巧高明在哪里你不用真的做那次升维计算只需要在低维空间里算一个核函数比如高斯 RBF 核就能得到高维空间点积的结果计算成本大大降低。代价是什么呢SVM 的时间复杂度在小数据集上很友好但样本量一旦超过几万条训练速度会明显下降。所以在中小型数据集上非线性 SVM 常常是最强分类器之一但放到百万级数据场景人们通常会转向逻辑回归或树模型。2.4 决策树把 if-else 规则自动学到极致决策树Decision Tree大概是这五个模型里最直观的一个了。它的思路就是自动从数据里学习一套 if-else 规则如果年龄小于 35 且收入大于 5000就预测可以贷款否则继续判断其他特征。每一步分裂都会选择一个特征和一个阈值目标是让分裂之后的数据类别“纯度”更高。衡量纯度的指标有两个Gini 不纯度基尼系数和信息增益基于信息熵。sklearn 中默认用 Gini计算方式是 ( Gini 1 - \sum p_i^2 )其中 ( p_i ) 是每个类别的占比。假如一个集合里两类各占一半Gini 是 0.5说明混乱程度高如果全部是同一类Gini 是 0说明纯度拉满。决策树就不断挑选特征和阈值让 Gini 下降最多。from sklearn.tree import DecisionTreeClassifier, plot_tree dt DecisionTreeClassifier(max_depth3, random_state42) dt.fit(X_train, y_train) import matplotlib.pyplot as plt plt.figure(figsize(15, 8)) plot_tree(dt, filledTrue, feature_namesfeature_names, class_namesclass_names) plt.show()决策树的优点有两个。第一是可解释性无与伦比画出来就是一棵树业务人员也能看懂。第二是不需要特征缩放因为它每次只在一个特征上找阈值数值大小对结果没有影响。缺点是单棵决策树极其容易过拟合——如果不限制深度它会为训练集的每一个特殊样本生成分支看着训练精度很高测试集上一塌糊涂。解决办法就是预剪枝参数限制max_depth、min_samples_split、min_samples_leaf等这个后面实战会演示。2.5 KNN不学习也能分类的“懒惰选手”K 近邻K-Nearest Neighbors简称 KNN完全打破了前面几个模型的训练范式。感知机、逻辑回归、SVM、决策树都有“训练”阶段KNN 没有它在训练时什么都不做只是把数据记下来等到你做预测时才把新样本拉到特征空间里找距离最近的 K 个已知样本然后让这些邻居投票决定新样本属于哪一类。from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier(n_neighbors5, metricminkowski, p2) knn.fit(X_train, y_train)K 值的选择是 KNN 最关键的超参数。K 太小模型对噪声极其敏感比如 K1 时只要最近的一个邻居被标错类预测就错了K 太大会把离得很远的样本也拉进来导致边界过平滑。一个常见的初始参考值取样本数的平方根左右但更靠谱的方式是画学习曲线逐个测试 K 从 1 到 20 的表现。我知道很多人会混淆 KNN 和 KMeans因为名字里都是“K”。这里必须说清楚KNN 是监督学习做分类或回归本质是“看邻居投票”KMeans 是无监督学习做聚类本质是“迭代找质心、不停重新分配样本”。两者唯一的共同点只是都依赖距离度量。如果你在做分类任务脑子里应该出现 KNN在做数据分群任务才轮到 KMeans。注意KNN 对特征缩放极其敏感。因为它算的是欧氏距离如果一个特征是“年龄”0-100另一个特征是“年收入”0-10 万收入维度会直接主导距离计算年龄等于被无视了。所以任何基于距离的学习器用之前必须做标准化或归一化。3. 实战一份数据同时跑通五个模型原理说过一遍现在上真家伙。我选的数据集是 scikit-learn 内置的红酒数据集load_wine178 个样本13 个特征3 个类别规模小但包含了完整的特征工程和模型调优流程特别适合做多模型对比实验。3.1 数据加载与预处理标准化是必选项吗先加载数据并拆分成训练集和测试集import pandas as pd from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler wine load_wine() X pd.DataFrame(wine.data, columnswine.feature_names) y wine.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)这里有几个细节请你留意都是实战里肉眼可见踩过坑的地方random_state42保证每次实验数据划分完全一致你复现出的结果能和我的对上。如果不固定随机种子模型性能的差异里就混入了数据划分的随机性你根本没法判断算法调优有没有效果。stratifyy是分层抽样参数让训练集和测试集里三个类别的比例保持一致避免某类样本恰好都分到测试集导致结果失真。尤其类别不均衡时这一步能救你命。缩放器用fit_transform处理训练集后测试集只能用transform这个区别千万不能混。如果对测试集单独fit就相当于让模型提前看到了测试集的统计信息这叫做“数据泄露”会让评估结果虚高。3.2 五个模型统一训练与评分我把五个模型写在一个循环里对比from sklearn.linear_model import Perceptron, LogisticRegression from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score, classification_report, confusion_matrix models { Perceptron: Perceptron(max_iter1000, random_state42), LogisticRegression: LogisticRegression(max_iter1000, random_state42), SVM(RBF): SVC(kernelrbf, C1.0, random_state42), DecisionTree: DecisionTreeClassifier(max_depth3, random_state42), KNN(k5): KNeighborsClassifier(n_neighbors5) } X_train_use X_train_scaled X_test_use X_test_scaled # 决策树单独用原始特征其余用标准化后的特征 results {} for name, model in models.items(): if name DecisionTree: model.fit(X_train, y_train) y_pred model.predict(X_test) acc accuracy_score(y_test, y_pred) else: model.fit(X_train_use, y_train) y_pred model.predict(X_test_use) acc accuracy_score(y_test, y_pred) results[name] acc print(f{name}: {acc:.4f})我在决策树上单独使用了未缩放的数据原因是特征缩放不会改变决策树的分裂规则它对每个特征独立寻找阈值数据是否标准化完全不影响结果。这也是我做对比实验时比较讲究的地方——不要让模型迁就我的统一流程而是要根据模型特性单独安排数据输入。在我本机上的结果大致是模型准确率备注Perceptron0.8611线性模型红酒数据基本线性可分表现尚可但略不稳LogisticRegression0.9722标准线性分类器默认 L2 正则化效果稳定SVM(RBF)0.9722非线性核小数据集上的强力选手DecisionTree(max_depth3)0.9444剪枝后有一定泛化能力KNN(k5)0.9722缩放后表现优秀距离度量充分发挥作用看到没逻辑回归、SVM、KNN 在这个数据集上分数接近都是 0.97 左右感知机最弱决策树居中。这其实说明一件事数据集简单时几个主流分类器的天花板都很接近真正的差异体现在数据变复杂、噪声变多、类别不均衡之后。所以别一上来就追求复杂模型先跑这几个 baseline 拿准确率是最高效的策略。3.3 交叉验证和 GridSearchCV 调参实操只跑一次 train/test split 说服力不够。更严谨的做法是交叉验证——把训练数据分成 5 份轮流拿 4 份训练、1 份验证最终结果取平均。这样能极大减小划分随机性带来的方差。from sklearn.model_selection import cross_val_score, GridSearchCV # 5 折交叉验证看稳定性 for name, model in models.items(): scores cross_val_score(model, X_train_use, y_train, cv5) print(f{name}: mean{scores.mean():.4f}, std{scores.std():.4f})调参上我强烈推荐直接用 GridSearchCV把它理解成“参数组合自动试错机”。它会把你要搜索的参数列表逐项组合跑交叉验证选最好的组合。以 SVM 为例param_grid { C: [0.1, 1, 10, 100], gamma: [scale, 0.01, 0.1, 1], kernel: [rbf] } svm_search GridSearchCV(SVC(random_state42), param_grid, cv5) svm_search.fit(X_train_scaled, y_train) print(svm_search.best_params_) print(svm_search.best_score_)KNN 的调 K 也照葫芦画瓢knn_search GridSearchCV( KNeighborsClassifier(), {n_neighbors: range(1, 21)}, cv5 ) knn_search.fit(X_train_scaled, y_train) print(knn_search.best_params_)实操心得调参前先想清楚要优化哪个指标。分类任务的默认评分是 accuracy但如果你的数据类别不平衡accuracy 会骗人。比如 95% 都是负类你把所有样本预测为负类accuracy 就能有 0.95这显然是假象。这时候 GridSearchCV 的scoring参数可以换成f1、roc_auc或precision根据业务目标来选。4. 从红酒扩展到实际场景收入预测和鸢尾花分类的关键细节如果你已经跟着第一节做完了头歌平台上的“决策树收入预测-sklearn版”或者“KNN 红酒分类”你会发现在线实验和真正的项目实战之间还差着一层东西——不是代码能力而是“拿到原始数据后怎么把它变成模型能吃的样子”。我们来把完整链路补齐。4.1 决策树做收入预测数据清洗是真正的老大难收入预测通常用的数据是成人收入数据集Adult Income核心任务是判断一个人的年收入是否超过 5 万美元。特征包含年龄、工作类别、教育程度、婚姻状况、职业、种族、性别、每周工作时长等标签是 50K 或 50K。这数据的特点是缺失值用?表示需要先清洗。类别型特征占了大半要把文本变成数值。类别比例接近 75:25有轻度不均衡。决策树在这类结构化表格数据上特别吃香因为它的分裂过程自动处理了类别和数值的混合。核心流程大概是import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.tree import DecisionTreeClassifier df pd.read_csv(adult.csv) # 把 ? 替换成 NaN再删除或填充 df df.replace(?, pd.NA).dropna() # 类别型特征用 LabelEncoder for col in df.select_dtypes(include[object]).columns: df[col] LabelEncoder().fit_transform(df[col].astype(str)) X df.drop(income, axis1) y df[income] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) dt DecisionTreeClassifier(max_depth5, min_samples_leaf10, random_state42) dt.fit(X_train, y_train) print(fAccuracy: {dt.score(X_test, y_test):.4f})值得注意的是这个任务里用了min_samples_leaf10意思是每个叶子节点至少要有 10 个样本。这个参数比单纯限制深度往往更有效因为它同时限制了树的分支规模能让树更平滑地泛化。我在做收入预测时发现深树很容易记住单一用户的中奖特征剪枝之后准确率虽然略降但业务上的稳定性会明显好很多。4.2 KNN 做鸢尾花分类先做特征可视化判断距离度量是否合理鸢尾花分类是 KNN 最理想的入门数据集——150 个样本、4 个数值特征、3 个品种。但它隐含着一个坑花萼长度和花瓣长度的量纲差异不大所以很多人不缩放也能得到不错的效果。这会让你产生“KNN 不缩放也行”的错误印象。更稳妥的做法是先用散点图或 pairplot 快速观察数据分布判断特征之间的物理意义差异有多大import seaborn as sns from sklearn.datasets import load_iris iris load_iris() df_iris pd.DataFrame(iris.data, columnsiris.feature_names) df_iris[species] iris.target sns.pairplot(df_iris, huespecies) plt.show()画出图之后你会看到不同鸢尾花品种的花瓣长宽差异非常明显几乎可以线性分开这就是为什么简单 KNN 就能到 0.95 的准确率。但如果换成包含时间戳、金额、计数值的业务数据特征之间单位可能差出几个数量级不缩放的 KNN 大概率会被数值最大的特征牵着鼻子走。所以养成“凡是用 KNN先用 StandardScaler”的条件反射是最省心的做法。5. 踩坑记录Scikit-Learn 分类实战的常见问题清单下面这些坑都是我在实际跑模型时真实遇到过、并且不止一次帮朋友排查过的按出现频率从高到低罗列出来建议你复制下来当速查表。5.1 ConvergenceWarning模型没训练完就罢工实践中最常见的警告是ConvergenceWarning: Maximum number of iterations reached。逻辑回归和感知机默认最大迭代次数有限当数据没做标准化时特征间量纲差异大梯度下降收敛速度会非常慢程序跑满迭代上限后直接停下来模型还没真正学到位。解决方式有两层第一层把max_iter调大到 10000治标。第二层对特征做StandardScaler标准化让所有特征的尺度统一在均值 0、方差 1 附近让优化过程跑得更顺这才是治本。我自己的习惯是默认就写LogisticRegression(max_iter10000)如果数据量特别大可以结合标准化避免无意义的计算浪费。5.2 特征缩放的时间点错误特征缩放最大的误区就是把scaler.fit_transform用在全部数据上然后再做 train_test_split。这会导致测试集的统计信息在训练之前就被模型“偷看”了。正确顺序是先拆分数据集再单独对训练集fit_transform然后对测试集只做transform。如果你把顺序搞反评估结果会偏乐观模型上线后表现和实验差距很大排查起来特别诡异。5.3 评估指标的维度太单一很多新手只看 accuracy 一个指标。在类别均衡的数据集上问题不大但一旦正负样本比例失衡比如 95:5accuracy 就会变成“全猜多数类”都能拿 95 分的垃圾指标。真正靠谱的评估要同时看查准率Precision、召回率Recall和 F1 分数。分类报告可以一次性给出这些值from sklearn.metrics import classification_report y_pred lr.predict(X_test) print(classification_report(y_test, y_pred))结合混淆矩阵一起看from sklearn.metrics import confusion_matrix print(confusion_matrix(y_test, y_pred))混淆矩阵的每一行是真实类别每一列是预测类别。对角线上的数字越大越好非对角线是“错分样本”的实际分布能让你看清楚模型到底混淆了哪两个类别。比如在红酒数据集上如果类别 1 和类别 2 经常互相误判说明这两个品种在特征上高度相似可能需要为此收集更多特征或换非线性模型。5.4 决策树过拟合用预剪枝控制模型复杂度决策树过拟合几乎是我的入门期必然踩的坑。不设任何限制的决策树可以把训练集准确率跑到 1.0但测试集表现很拉胯。解决办法是在训练前就把树“剪掉”。常用预剪枝参数有三个最大深度max_depth、叶子节点最小样本数min_samples_leaf、内部节点最小样本数min_samples_split。我个人的经验做法是先用默认参数跑一次观察训练准确率和测试准确率差距。如果差距超过 10%说明过拟合明显再逐步减小max_depth或增大min_samples_leaf直到差距收敛到 5% 以内。5.5 随机性和可复现性为什么你的结果和别人的不一样有朋友经常跑来问我同一个数据集、同一个模型为什么我跑出来的结果跟教程差很多十次里有九次是因为没设random_state。决策树和 SVM 等模型的训练可能涉及随机初始化和随机抽样不设随机种子每次跑的结果都会轻微变动。规范做法很简单但凡有random_state参数都设成 42 或任意固定整数。多模型对比实验里这一步不做会严重影响调参判断。6. 模型选型法则遇到新任务到底该用哪个最后这部分价值含量不低。很多人问“哪个分类器最牛”但真实答案永远是“看数据”。我把这些年做分类的经验浓缩成一套快速选型思路可以直接对照套用。6.1 一张表选好模型任务特点推荐模型理由数据线性可分需要快速 baseline逻辑回归或线性 SVM训练快、稳定、可解释高维稀疏特征比如文本分类逻辑回归正则化方便内存占用小中小型数据、特征高度非线性RBF 核 SVM核技巧能捕捉复杂边界需要向业务解释预测依据决策树可画出树结构规则透明训练时间几乎为零预测时只查邻居KNN非参数、实现简单适合快速原型样本量极大百万级逻辑回归或 SGDClassifier线性模型训练复杂度低能扛住大数据非常在意准确率可接受黑盒模型集成方法随机森林、XGBoost多个基础模型叠加精度通常更高注意这张表的主角还是那五个基础模型。集成学习只是把决策树这种弱学习器组合起来你如果连单个模型的原理都没吃透跑再多集成模型也只是在开盲盒。6.2 一套可以复用到所有分类任务的流程我这几年做任何分类项目几乎都按这套流程走推荐给你清洗数据处理缺失值、重复值、异常值。特征工程把类别变量编码把连续变量标准化。切分数据固定random_state必要时stratify保类比例。先跑逻辑回归作为 baseline记录准确率、F1 等指标。按数据量级从基础五个模型里选两三个在同一个数据集上对比。对表现最好的模型做超参数调优用 GridSearchCV 或 RandomizedSearchCV。用测试集做最终验证并详细看混淆矩阵定位错误样本的模式。上线前再想想评估指标是否匹配业务目标是否需要处理类别不均衡。这流程听起来不刺激但极其有效。大多数人模型效果差不是缺什么炫技算法而是前面三步没做好。最后再分享一个我自己的体会刚开始学 sklearn 时我也喜欢把每个模型的参数都背得很熟甚至收藏了各种花哨的调参模板但真到了项目里根本用不上。后来想明白真正重要的不是记住参数而是理解每个模型假设的本质——SVM 为什么重缩放、决策树为什么不用缩放、KNN 为什么训练阶段什么事都不干。你只要把五个基础模型的“性格”摸清楚后面学随机森林、XGBoost、神经网络都会顺很多因为那些高级模型无非是在这几个基础思路上做了叠加和扩展。所以如果你耐心看完这篇、也把红酒数据集和收入预测的代码亲手跑通恭喜你已经入门了接下来就是拿真实数据多看多做踩坑多了经验就长在自己身上了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门