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

机器学习入门实战:六大核心算法代码实现与对比分析

简介本资源是一套面向机器学习初学者的实战入门代码合集聚焦算法原理理解与基础建模实践适用于高校学生、转行新人及数据科学爱好者快速掌握核心模型。压缩包共14个文件含13个Python脚本覆盖BP神经网络、KNN回归、SVM超平面可视化、企鹅数据集上的决策树分类、朴素贝叶斯、逻辑回归等六大算法实现和1个CSV格式的企鹅原始数据集总大小仅24KB轻量易读、即下即用。已有342人学习下载反映出其在入门阶段的高实用性和受欢迎程度。所有代码均附带清晰注释与关键步骤说明特别包含SVM软间隔实现、LDA降维辅助、多数据集Iris/企鹅对比应用等细节便于读者逐行调试、理解参数影响与模型差异是构建机器学习知识体系与动手能力的扎实起点。1. 项目概述一份面向实践者的机器学习入门代码集刚入门机器学习那会儿我最大的困惑不是理论看不懂而是代码跑不通。书上讲得头头是道的算法一到自己动手不是数据格式报错就是调参调到怀疑人生最后连个像样的结果都看不到。这份代码集就是我当年最希望有人能塞给我的东西。它不是某个高大上的研究项目而是一个扎扎实实的“工具箱”里面装了六个最经典、最常用的机器学习算法实现并且都用一个生动有趣的数据集——企鹅数据集——给串了起来。这份代码集的核心价值在于“即拿即用”和“对比学习”。你不用再四处搜罗散落的代码片段这里从数据加载、预处理、模型构建、训练到评估给你一套完整的、可运行的流程。更重要的是你可以横向对比不同算法在同一个问题上的表现直观地感受为什么在这个场景下决策树效果不错而那个场景下SVM更胜一筹。这对于建立算法直觉至关重要。无论你是计算机专业的学生想快速完成课程作业还是转行数据分析的从业者急需一些能跑出结果的案例来增强信心亦或是经验丰富的工程师想找一个干净的标准实现来验证想法这份代码集都能提供一个极佳的起点。它避开了繁杂的数学推导直指应用核心让你在动手实践中真正理解这些算法是如何“工作”的。2. 环境准备与数据初探2.1 构建可复现的Python环境工欲善其事必先利其器。一个独立、干净且版本可控的Python环境是进行任何机器学习实践的第一步它能有效避免包冲突带来的各种灵异问题。我强烈推荐使用conda或venv来创建虚拟环境。对于新手conda在包管理和环境隔离上做得更友好。你可以通过以下命令创建一个名为ml_starter的新环境并指定Python版本为3.8这是一个兼容性极佳的版本conda create -n ml_starter python3.8 conda activate ml_starter环境激活后我们需要安装核心的数据科学和机器学习库。这里我提供一个requirements.txt文件的内容你可以保存后通过pip install -r requirements.txt一键安装。# requirements.txt numpy1.19.5 pandas1.3.0 scikit-learn1.0.0 matplotlib3.3.0 seaborn0.11.0 jupyter1.0.0 # 可选用于交互式笔记本注意scikit-learn常简写为sklearn是我们这份代码集的绝对核心它高质量地实现了我们即将用到的所有传统机器学习算法。确保其版本在1.0以上以获得更稳定的API和更好的性能。2.2 认识我们的“演员”企鹅数据集我们所有的算法都将在一个统一的舞台——企鹅数据集上表演。这个数据集记录了南极三种企鹅阿德利企鹅、巴布亚企鹅、帽带企鹅的形态测量数据包括喙长、喙宽、脚蹼长度、体重和性别等。我们的任务通常是根据这些形态特征预测企鹅的种类。为什么选择它首先它足够简单特征数量适中便于可视化理解其次它包含分类和回归例如预测体重两种任务的潜力最后它比经典的鸢尾花数据集更具“故事性”和新鲜感。我们可以通过seaborn库直接加载它import seaborn as sns import pandas as pd # 加载数据集 penguins sns.load_dataset(penguins) # 查看前5行和数据基本信息 print(penguins.head()) print(penguins.info())运行后你会看到数据中有少量的缺失值NaN。这是现实数据的常态也是我们预处理的第一步。对于这个数据集我们可以选择直接删除缺失行因为数量很少# 删除含有缺失值的行 penguins_clean penguins.dropna() print(f“原始数据行数: {len(penguins)} 清洗后行数: {len(penguins_clean)}”)接下来我们需要将分类特征如sex,island转换为模型能够处理的数值。这里使用pandas的get_dummies方法进行独热编码One-Hot Encoding避免给类别引入错误的序关系。# 对‘island’和‘sex’进行独热编码 penguins_encoded pd.get_dummies(penguins_clean, columns[‘island’, ‘sex’], drop_firstTrue) # 将目标变量‘species’映射为数值标签 from sklearn.preprocessing import LabelEncoder le LabelEncoder() penguins_encoded[‘species_label’] le.fit_transform(penguins_encoded[‘species’])现在我们的特征矩阵X和目标向量y就准备好了。别忘了在开始任何建模前必须将数据划分为训练集和测试集用训练集来教模型用测试集来公平地评估它。sklearn的train_test_split函数是标准做法from sklearn.model_selection import train_test_split # 定义特征和目标 X penguins_encoded.drop([‘species’ ‘species_label’] axis1) y penguins_encoded[‘species_label’] # 以7:3的比例划分训练集和测试集random_state确保每次划分结果一致便于复现 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) print(f“训练集样本数: {X_train.shape[0]} 测试集样本数: {X_test.shape[0]}”)3. 六大核心算法原理与代码实现拆解3.1 K最近邻KNN用“邻居”来投票KNN可能是最直观的机器学习算法。它的核心思想是“物以类聚人以群分”。对于一个新样本在特征空间里找到离它最近的K个已知样本邻居然后看这K个邻居中哪个类别最多就把新样本归为哪一类。在回归任务中则是取这K个邻居目标值的平均值。关键超参数解析n_neighbors (K值)这是最重要的参数。K太小如1模型会对噪声极度敏感容易过拟合K太大模型会过于平滑可能忽略数据的局部特征导致欠拟合。通常通过交叉验证在3到10之间选择。weights邻居的权重。uniform表示所有邻居投票权重相同distance表示距离越近的邻居权重越大这通常能获得更好的性能。metric距离度量方式。最常用的是欧氏距离euclidean和曼哈顿距离manhattan。对于包含较多零值的高维稀疏数据余弦相似度cosine有时更有效。代码实现与调优from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score, classification_report # 初始化KNN分类器先尝试K5 knn KNeighborsClassifier(n_neighbors5) knn.fit(X_train, y_train) y_pred knn.predict(X_test) print(f“KNN准确率: {accuracy_score(y_test, y_pred):.4f}”) print(classification_report(y_test, y_pred, target_namesle.classes_)) # 通过交叉验证寻找最佳K值 from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt k_range range(1, 31) k_scores [] for k in k_range: knn_cv KNeighborsClassifier(n_neighborsk) scores cross_val_score(knn_cv, X_train, y_train, cv5, scoring‘accuracy’) k_scores.append(scores.mean()) plt.plot(k_range, k_scores) plt.xlabel(‘Value of K for KNN’) plt.ylabel(‘Cross-Validated Accuracy’) plt.title(‘寻找最佳K值’) plt.show()实操心得绘制K值与准确率的关系图是理解KNN模型的绝佳方式。你会发现准确率会随着K值先上升后下降那个拐点对应的K值往往就是较优解。记住一定要在训练集上做交叉验证来找K而不是在测试集上。3.2 支持向量机SVM与“最大间隔超平面”SVM的目标是找到一个最优的决策边界对于线性可分数据就是一个超平面来分隔不同类别的样本并且使得这个边界到两侧最近样本点的距离即“间隔”最大化。这些最近的样本点被称为“支持向量”它们是决定边界位置的关键。核技巧Kernel Trick的精髓当数据在原始空间中线性不可分时比如一团数据被另一团包在中间SVM通过一个巧妙的“核函数”将数据映射到一个更高维的空间在那个高维空间里数据就可能变得线性可分了。这就像在一张纸上无法用一根直线分开一堆散乱的点但如果你把纸揉成一个球升维或许就能找到一个平面完美分割。关键超参数解析C (正则化参数)控制模型对错误分类的惩罚力度。C值越大模型越倾向于尽可能正确分类所有训练样本可能导致过拟合间隔带很窄C值越小模型对错误的容忍度越高间隔带越宽可能欠拟合。kernel核函数。linear线性核、poly多项式核、rbf径向基函数核最常用、sigmoid。对于我们的企鹅数据集线性核或RBF核通常效果不错。gamma (仅用于rbf/poly/sigmoid核)定义了单个训练样本的影响范围。gamma值越大影响范围越小决策边界越曲折容易过拟合gamma值越小影响范围越广边界越平滑。代码实现from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler # SVM对特征尺度敏感务必先标准化数据 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 使用RBF核的SVM svm_rbf SVC(kernel‘rbf’ C1.0 gamma‘scale’ random_state42) svm_rbf.fit(X_train_scaled, y_train) y_pred_svm svm_rbf.predict(X_test_scaled) print(f“SVM (RBF) 准确率: {accuracy_score(y_test, y_pred_svm):.4f}”) print(classification_report(y_test, y_pred_svm, target_namesle.classes_))注意事项StandardScaler的fit方法只应在训练集上调用用它计算出的均值和标准差再去转换训练集和测试集。如果在整个数据集上fit就造成了数据泄露会高估模型性能。这是新手常踩的坑。3.3 决策树模拟人类决策过程决策树通过一系列“如果...那么...”的规则对数据进行划分。它从根节点开始选择一个特征和一个阈值将数据分成两组这个过程递归进行直到满足停止条件如节点样本数少于某个值或纯度提升不大。结果就像一棵倒长的树。关键概念与参数不纯度度量选择划分特征的依据。常用“基尼不纯度”Gini或“信息增益”Entropy。基尼系数计算稍快而信息增益对不纯度更敏感实践中差异不大。max_depth树的最大深度。这是控制过拟合最重要的参数。不限制深度树会一直生长直到每个叶子节点都“纯”过拟合。需要剪枝。min_samples_split / min_samples_leaf节点分裂所需的最小样本数 / 叶节点所需的最小样本数。增大这些值可以防止模型学习过于具体的噪声。代码实现与可视化from sklearn.tree import DecisionTreeClassifier, plot_tree # 初始化决策树限制深度以防止过拟合 dtree DecisionTreeClassifier(max_depth4, random_state42, criterion‘gini’) dtree.fit(X_train, y_train) y_pred_dt dtree.predict(X_test) print(f“决策树准确率: {accuracy_score(y_test, y_pred_dt):.4f}”) # 可视化决策树 plt.figure(figsize(20, 10)) plot_tree(dtree, feature_namesX.columns, class_namesle.classes_, filledTrue, roundedTrue) plt.title(“企鹅分类决策树”) plt.show() # 查看特征重要性 importances dtree.feature_importances_ feat_importances pd.Series(importances, indexX.columns).sort_values(ascendingFalse) print(“\n特征重要性排序”) print(feat_importances)实操心得决策树的可解释性是其最大优点。通过plot_tree和feature_importances_你能清楚地知道模型是如何做决定的以及哪些特征最关键比如很可能“脚蹼长度”和“喙长”是区分企鹅种类的重要特征。这对于向业务方解释模型至关重要。3.4 朴素贝叶斯基于概率的“快速分类器”朴素贝叶斯算法基于贝叶斯定理并做了一个强大的“朴素”假设所有特征之间相互独立。尽管这个假设在现实中很少成立但该算法在许多分类任务尤其是文本分类上表现惊人地好且计算效率极高。算法变体选择GaussianNB假设特征服从正态分布。适用于连续型特征。MultinomialNB假设特征服从多项式分布。适用于离散计数型特征如文本的词频。BernoulliNB假设特征是二元的0/1。适用于伯努利分布的特征。对于我们的企鹅数据集特征大多是连续测量值因此使用GaussianNB。代码实现from sklearn.naive_bayes import GaussianNB nb GaussianNB() nb.fit(X_train, y_train) y_pred_nb nb.predict(X_test) print(f“朴素贝叶斯准确率: {accuracy_score(y_test, y_pred_nb):.4f}”) print(classification_report(y_test, y_pred_nb, target_namesle.classes_)) # 查看预测的概率而不仅仅是类别 y_pred_proba nb.predict_proba(X_test[:5]) # 查看前5个样本的预测概率 print(“前5个测试样本的预测概率”) print(y_pred_proba)注意事项朴素贝叶斯直接输出的是样本属于每个类别的概率这对于需要概率输出的场景如风险排序非常有用。predict_proba方法可以获取这些概率值。虽然它特征独立的假设很强但对于特征间相关性不强的问题它仍然是一个优秀的基线模型。3.5 逻辑回归从线性回归到分类千万别被名字误导逻辑回归是解决分类问题的而且是二分类问题的基石。它的核心思想是用一个线性函数z w*x b去拟合数据然后通过一个Sigmoid函数将这个线性输出映射到(0,1)区间解释为属于正类的概率。Sigmoid函数的作用它将任何实数压缩到(0,1)之间完美地代表了概率。当z很大时概率接近1当z很小时概率接近0z0时概率为0.5这就是决策边界。关键参数解析penalty正则化类型用于防止过拟合。l1正则化Lasso可以产生稀疏权重用于特征选择l2正则化Ridge使权重平滑。elasticnet是两者的混合。C正则化强度的倒数。C值越小正则化越强。这是和SVM的C方向相反容易混淆的地方。solver优化算法。对于小数据集liblinear是个好选择对于大数据集或多类问题sag或saga更快。代码实现处理多分类from sklearn.linear_model import LogisticRegression # 逻辑回归默认使用L2正则化。multi_class‘ovr’表示“一对余”适合我们的多分类问题。 logreg LogisticRegression(penalty‘l2’ C1.0 solver‘liblinear’ multi_class‘ovr’ random_state42, max_iter1000) logreg.fit(X_train_scaled, y_train) # 同样逻辑回归也受益于数据标准化 y_pred_lr logreg.predict(X_test_scaled) print(f“逻辑回归准确率: {accuracy_score(y_test, y_pred_lr):.4f}”) print(classification_report(y_test, y_pred_lr, target_namesle.classes_)) # 查看模型学到的系数权重 print(“\n逻辑回归模型系数权重”) coef_df pd.DataFrame(logreg.coef_, columnsX.columns, indexle.classes_) print(coef_df)实操心得逻辑回归的系数具有很好的可解释性。系数的正负表示该特征与预测为正类在OvR中指某个特定类是正相关还是负相关绝对值大小表示影响力。结合StandardScaler后的数据你可以说“在其它特征不变的情况下脚蹼长度每增加一个标准差该样本被归类为‘阿德利企鹅’的对数几率增加X”。3.6 BP神经网络MLP入门深度学习多层感知机MLP是最基础的前馈神经网络也是理解深度学习的敲门砖。它通过输入层、一个或多个隐藏层、输出层组成。每个神经元接收上一层的输入进行加权求和并加上偏置然后通过一个非线性激活函数如ReLU, Sigmoid产生输出。BP误差反向传播算法是训练它的核心通过计算损失函数对权重的梯度并沿梯度反方向更新权重以最小化预测误差。网络结构设计要点隐藏层与神经元数量没有黄金法则。通常从1-2个隐藏层开始。神经元数量太多易过拟合太少则欠拟合。一个经验是隐藏层神经元数介于输入维度和输出维度之间。激活函数隐藏层常用ReLU因为它能有效缓解梯度消失问题计算快。输出层根据任务选择二分类用Sigmoid多分类用Softmax回归用线性函数。优化器adam是目前最常用且通常效果不错的自适应学习率优化器对于新手来说几乎是默认选择。代码实现from sklearn.neural_network import MLPClassifier # 构建一个简单的MLP一个隐藏层包含100个神经元使用ReLU激活函数 mlp MLPClassifier(hidden_layer_sizes(100,), activation‘relu’ solver‘adam’ alpha0.0001, # L2正则化参数 batch_size‘auto’ learning_rate‘constant’ learning_rate_init0.001, max_iter500, random_state42, early_stoppingTrue) # 开启早停防止过拟合 mlp.fit(X_train_scaled, y_train) y_pred_mlp mlp.predict(X_test_scaled) print(f“MLP准确率: {accuracy_score(y_test, y_pred_mlp):.4f}”) print(classification_report(y_test, y_pred_mlp, target_namesle.classes_)) # 绘制训练过程中的损失曲线 plt.plot(mlp.loss_curve_) plt.xlabel(‘迭代次数’) plt.ylabel(‘损失值’) plt.title(‘MLP训练损失曲线’) plt.grid(True) plt.show()注意事项神经网络对数据尺度、初始权重和学习率非常敏感。务必标准化数据。early_stoppingTrue是一个非常重要的技巧它会在验证集性能不再提升时提前停止训练是防止过拟合的利器。观察loss_curve_可以帮助你判断训练是否充分损失是否收敛或是否过拟合训练损失持续下降但验证损失上升。4. 模型评估、对比与选择策略4.1 超越准确率全面的评估指标体系准确率只是一个开始尤其当你的数据类别不均衡时比如100个样本中90个是A类一个总是预测A类的傻瓜模型也能有90%的准确率但这毫无意义。我们需要更细致的评估工具。精确率Precision在所有被模型预测为正类的样本中真正为正类的比例。“查得准不准”。关注的是预测结果的质量。召回率Recall在所有真实为正类的样本中被模型正确预测出来的比例。“查得全不全”。关注的是模型对正类的覆盖能力。F1-Score精确率和召回率的调和平均数是两者的综合考量。当两者都重要时看F1。混淆矩阵Confusion Matrix一个NxN的矩阵N为类别数直观展示了每个类别的样本被预测成了哪些类别。对角线上的数字是正确分类的样本数。代码实现综合评估from sklearn.metrics import confusion_matrix, precision_recall_fscore_support import seaborn as sns # 以决策树为例计算更详细的评估指标 y_pred dtree.predict(X_test) # 1. 混淆矩阵可视化 cm confusion_matrix(y_test, y_pred, labelsdtree.classes_) plt.figure(figsize(8,6)) sns.heatmap(cm, annotTrue, fmt‘d’ cmap‘Blues’ xticklabelsle.classes_, yticklabelsle.classes_) plt.ylabel(‘真实标签’) plt.xlabel(‘预测标签’) plt.title(‘决策树混淆矩阵’) plt.show() # 2. 计算每个类别的精确率、召回率、F1 precision, recall, f1, support precision_recall_fscore_support(y_test, y_pred, averageNone, labelsdtree.classes_) metrics_df pd.DataFrame({ ‘类别’: le.classes_, ‘精确率’: precision, ‘召回率’: recall, ‘F1-Score’: f1, ‘支持数样本量’: support }) print(“\n按类别细分的评估指标”) print(metrics_df) # 3. 宏平均和加权平均处理类别不均衡 precision_macro, recall_macro, f1_macro, _ precision_recall_fscore_support(y_test, y_pred, average‘macro’) precision_weighted, recall_weighted, f1_weighted, _ precision_recall_fscore_support(y_test, y_pred, average‘weighted’) print(f“\n宏平均 F1: {f1_macro:.4f}”) print(f“加权平均 F1: {f1_weighted:.4f}”)4.2 六模型横向对比与结果分析现在让我们把六个模型在测试集上的表现放在一起对比这是理解算法特性的最佳方式。# 收集所有模型的准确率 models {‘KNN’: knn, ‘SVM’: svm_rbf, ‘Decision Tree’: dtree, ‘Naive Bayes’: nb, ‘Logistic Regression’: logreg, ‘MLP’: mlp} accuracy_results {} for name, model in models.items(): if name in [‘SVM’ ‘Logistic Regression’ ‘MLP’]: # 这些模型使用了标准化后的数据 X_test_used X_test_scaled else: X_test_used X_test y_pred model.predict(X_test_used) acc accuracy_score(y_test, y_pred) accuracy_results[name] acc # 绘制对比柱状图 results_df pd.DataFrame(list(accuracy_results.items()), columns[‘Model’ ‘Accuracy’]) results_df results_df.sort_values(by‘Accuracy’ ascendingFalse) plt.figure(figsize(10,6)) bars plt.bar(results_df[‘Model’] results_df[‘Accuracy’] color‘skyblue’) plt.xlabel(‘机器学习模型’) plt.ylabel(‘测试集准确率’) plt.title(‘六大机器学习模型在企鹅数据集上的性能对比’) plt.ylim([0.85 1.0]) # 根据实际结果调整y轴范围 # 在柱子上方显示准确率数值 for bar, acc in zip(bars, results_df[‘Accuracy’]): plt.text(bar.get_x() bar.get_width()/2, bar.get_height()0.005, f‘{acc:.3f}’ ha‘center’ va‘bottom’) plt.xticks(rotation45) plt.tight_layout() plt.show() print(“\n模型准确率排序”) print(results_df)结果分析与模型选择启示 运行上述代码后你可能会得到类似以下的发现具体结果因数据划分随机性略有不同决策树、SVM、MLP通常表现最佳准确率可能非常接近都在98%以上。这说明对于这个特征清晰、区分度好的数据集多种复杂模型都能学到很好的边界。逻辑回归和KNN紧随其后准确率也相当高。逻辑回归的稳定性和KNN的简单性使其成为优秀的基线模型。朴素贝叶斯的准确率可能会略低一些。这很可能是因为“特征条件独立”的强假设在企鹅数据上并不完全成立例如喙长和喙宽可能存在相关性。这个对比实验给我们上了生动的一课没有“最好”的算法只有“最合适”的算法。选择模型时你需要权衡准确率与效率MLP可能准确率最高但训练和预测时间远长于决策树或朴素贝叶斯。可解释性需求如果需要向人解释模型为什么做出某个预测决策树和逻辑回归是首选神经网络则是“黑盒”。数据量与特征对于小数据集SVM和朴素贝叶斯可能更稳健对于大数据集神经网络和基于树的集成方法潜力更大。部署环境在计算资源有限的边缘设备上轻量级的模型如小决策树、朴素贝叶斯更有优势。5. 常见问题、调优技巧与进阶方向5.1 实战中高频问题排查指南在实际运行代码时你几乎一定会遇到下面这些问题。这里提供一个速查表问题现象可能原因解决方案ValueError: Input contains NaN...数据中存在缺失值。使用pandas.DataFrame.dropna()删除缺失行或SimpleImputer进行填充如用均值、中位数。ValueError: Unknown label type: ‘continuous’目标变量y是连续值回归问题但你用了分类器。确认任务类型。如果是回归使用KNeighborsRegressor,DecisionTreeRegressor等回归模型。ConvergenceWarning: Liblinear failed to converge...逻辑回归/SVMliblinear求解器未收敛。增加max_iter参数如设为2000或5000。或者减小数据尺度进行标准化或增大容忍度tol。模型在训练集上完美测试集上很差典型的过拟合。1. 增加正则化强度减小C值增大alpha值。2. 获取更多训练数据。3. 减少模型复杂度如降低树深度、减少神经网络层数。4. 使用交叉验证调参。所有模型准确率都很低60%特征与目标无关或特征工程不到位。1. 重新检查数据做探索性数据分析EDA。2. 创建新特征或组合现有特征。3. 尝试不同的数据预处理方式如分箱、多项式特征。MLP训练损失曲线震荡或不下降学习率可能设置不当。尝试降低learning_rate_init如从0.001调到0.0001或使用自适应学习率的优化器如adam已是默认。KeyError或列名不匹配训练和测试集的特征列顺序或名称不一致。确保使用相同的pandas DataFrame列进行操作。在划分数据集后避免单独对X_train和X_test进行列增删操作。使用Pipeline可以固化流程。5.2 模型调优实战以决策树和SVM为例手动调参效率低下sklearn的GridSearchCV网格搜索交叉验证是自动化寻优的利器。它会遍历你给定的参数组合用交叉验证评估每一组的效果最后给出最佳参数。决策树参数网格搜索from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid_dt { ‘max_depth’: [3, 4, 5, 6, 7, None], # None表示不限制深度 ‘min_samples_split’: [2, 5, 10], ‘min_samples_leaf’: [1, 2, 4], ‘criterion’: [‘gini’ ‘entropy’] } # 初始化基础决策树和网格搜索对象使用5折交叉验证 dtree_base DecisionTreeClassifier(random_state42) grid_search_dt GridSearchCV(estimatordtree_base, param_gridparam_grid_dt, cv5, scoring‘accuracy’ n_jobs-1) # n_jobs-1使用所有CPU核心 grid_search_dt.fit(X_train, y_train) print(“决策树最佳参数” grid_search_dt.best_params_) print(“决策树最佳交叉验证得分” grid_search_dt.best_score_) # 用最佳参数模型在测试集上最终评估 best_dtree grid_search_dt.best_estimator_ y_pred_best_dt best_dtree.predict(X_test) print(f“调优后决策树测试集准确率: {accuracy_score(y_test, y_pred_best_dt):.4f}”)SVM参数网格搜索param_grid_svm { ‘C’: [0.1, 1, 10, 100], # 正则化参数 ‘gamma’: [‘scale’ ‘auto’ 0.01, 0.1, 1], # RBF核参数 ‘kernel’: [‘rbf’ ‘linear’] # 尝试线性和RBF核 } svm_base SVC(random_state42) grid_search_svm GridSearchCV(svm_base, param_grid_svm, cv5, scoring‘accuracy’ n_jobs-1) grid_search_svm.fit(X_train_scaled, y_train) # 注意要用标准化后的训练数据 print(“\nSVM最佳参数” grid_search_svm.best_params_) print(“SVM最佳交叉验证得分” grid_search_svm.best_score_)实操心得网格搜索非常耗时尤其是参数组合多、数据量大、模型复杂时。可以先进行粗调参数范围大、步长大锁定一个较好的区域后再进行细调。对于神经网络更常用随机搜索RandomizedSearchCV或贝叶斯优化等更高效的方法。5.3 从入门到进阶下一步可以做什么当你熟练运行并理解了这份代码集的所有内容后你的机器学习之旅才真正开始。以下是一些有价值的进阶方向特征工程模型的上限由数据和特征决定。尝试创建交互特征如bill_length_mm * bill_depth_mm。对连续特征进行分箱离散化。使用多项式特征sklearn.preprocessing.PolynomialFeatures。利用领域知识构造新特征。探索集成方法单个模型再强也有局限。学习使用随机森林Random Forest多棵决策树的集体智慧能有效降低过拟合。梯度提升树Gradient Boosting, 如XGBoost, LightGBM目前结构化数据竞赛的王者性能通常远超单模型。投票分类器VotingClassifier将我们刚学过的多个模型组合起来取长补短。深入模型解释对于树模型和线性模型继续深挖特征重要性。学习使用SHAP或LIME等工具来解释任何“黑盒”模型包括我们的MLP和SVM的单个预测理解“为什么这个样本被预测为A类而不是B类”。尝试真正的项目去Kaggle找几个入门比赛如泰坦尼克号生存预测、房价预测将这套流程应用上去。用爬虫收集自己感兴趣领域的数据务必遵守法律法规和网站协议定义一个预测或分类问题从头到尾完成一个项目。记住机器学习是一门实践学科。反复运行代码修改参数观察结果变化甚至故意“破坏”代码看看会报什么错是学习最快的方式。这份代码集为你铺好了第一块砖后面的路需要你带着好奇心和动手能力一步步去探索和构建。本文还有配套的精品资源点击获取
分享:

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

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