机器学习笔记(一)监督学习与分类算法实操
一、什么是监督学习监督学习是机器学习中最基础、应用最广泛的范式。它的核心思想是给定一组带有标签的训练数据让模型学习输入特征与输出标签之间的映射关系从而对未知数据进行预测。1.1 监督学习的两大任务任务类型输出类型典型算法应用场景分类离散类别KNN、决策树、SVM、逻辑回归垃圾邮件检测、图像识别回归连续数值线性回归、随机森林回归房价预测、销量预测1.2 监督学习通用流程数据准备收集数据划分训练集与测试集特征工程提取有效特征处理缺失值、归一化模型选择根据任务选择合适算法模型训练用训练数据拟合模型参数模型评估用测试集验证泛化能力模型优化调参、集成等手段提升性能二、KNN 算法实操2.1 算法原理KNNK-Nearest Neighbors的核心思想用一句话概括近朱者赤近墨者黑。对于一个未知样本查看它最近的 K 个邻居按多数表决原则决定其类别。K 值选择K 太小容易过拟合K 太大容易欠拟合通常取奇数避免平票距离度量常用欧氏距离、曼哈顿距离优点简单直观无需训练过程缺点计算量大对数据规模敏感2.2 代码实操鸢尾花分类使用 scikit-learn 内置鸢尾花数据集完整演示 KNN 分类的全流程fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.metricsimportaccuracy_score,classification_report# 1. 加载数据irisload_iris()X,yiris.data,iris.target# 2. 划分训练集与测试集8:2X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42,stratifyy)# 3. 特征标准化KNN 对量纲敏感必须做scalerStandardScaler()X_train_scaledscaler.fit_transform(X_train)X_test_scaledscaler.transform(X_test)# 4. 创建 KNN 模型K5knnKNeighborsClassifier(n_neighbors5)# 5. 训练模型knn.fit(X_train_scaled,y_train)# 6. 预测与评估y_predknn.predict(X_test_scaled)print(f准确率:{accuracy_score(y_test,y_pred):.4f})print(classification_report(y_test,y_pred,target_namesiris.target_names))输出结果准确率: 1.0000 precision recall f1-score support setosa 1.00 1.00 1.00 10 versicolor 1.00 1.00 1.00 10 virginica 1.00 1.00 1.00 10 accuracy 1.00 30 macro avg 1.00 1.00 1.00 30 weighted avg 1.00 1.00 1.00 302.3 K 值选择技巧不同的 K 值会显著影响模型表现。以下代码遍历 K1 到 20观察准确率变化importmatplotlib.pyplotasplt k_rangerange(1,21)scores[]forkink_range:knnKNeighborsClassifier(n_neighborsk)knn.fit(X_train_scaled,y_train)scores.append(accuracy_score(y_test,knn.predict(X_test_scaled)))plt.figure(figsize(10,5))plt.plot(k_range,scores,markero,color#FF6B6B,linewidth2)plt.xlabel(K Value,fontsize12)plt.ylabel(Accuracy,fontsize12)plt.title(KNN K Value vs Accuracy,fontsize14)plt.grid(True,alpha0.3)plt.savefig(knn_k_selection.png,dpi150,bbox_inchestight)plt.show()三、决策树算法实操3.1 算法原理决策树通过一系列规则对数据进行递归划分最终形成一棵树状结构。每个内部节点是一个特征判断条件每个叶子节点是一个类别标签。划分标准基尼系数Gini或信息增益Entropy核心优势可解释性强可输出规则最大深度控制树的复杂度防止过拟合3.2 代码实操乳腺癌诊断分类使用 scikit-learn 内置乳腺癌数据集fromsklearn.datasetsimportload_breast_cancerfromsklearn.treeimportDecisionTreeClassifier,plot_treefromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_reportimportmatplotlib.pyplotasplt# 1. 加载数据dataload_breast_cancer()X,ydata.data,data.target# 2. 划分数据集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42,stratifyy)# 3. 创建决策树模型限制最大深度4防止过拟合dtDecisionTreeClassifier(max_depth4,random_state42)# 4. 训练dt.fit(X_train,y_train)# 5. 预测与评估y_preddt.predict(X_test)print(f准确率:{accuracy_score(y_test,y_pred):.4f})print(classification_report(y_test,y_pred,target_namesdata.target_names))# 6. 可视化决策树结构plt.figure(figsize(20,8))plot_tree(dt,feature_namesdata.feature_names,class_namesdata.target_names,filledTrue,fontsize8)plt.title(Decision Tree Structure,fontsize14)plt.savefig(decision_tree_structure.png,dpi150,bbox_inchestight)plt.show()3.3 特征重要性分析决策树天然支持输出特征重要性帮助我们理解哪些特征对分类贡献最大importnumpyasnp importancesdt.feature_importances_ indicesnp.argsort(importances)[::-1][:10]# 取 Top10plt.figure(figsize(10,6))colors[#FF6B6B,#FFB347,#FFD93D,#6BCB77,#4D96FF,#9D4EDD,#FF6B9D,#54C6EB,#F9C74F,#90BE6D]barsplt.bar(range(len(indices)),importances[indices],colorcolors)plt.xticks(range(len(indices)),[data.feature_names[i]foriinindices],rotation45,haright)plt.xlabel(Feature,fontsize12)plt.ylabel(Importance,fontsize12)plt.title(Top 10 Feature Importances (Decision Tree),fontsize14)plt.tight_layout()plt.savefig(feature_importance.png,dpi150,bbox_inchestight)plt.show()四、KNN 与决策树对比总结对比维度KNN决策树原理距离表决规则递归划分训练过程无惰性学习有构建决策树预测速度慢逐条计算距离快沿树遍历可解释性弱强可输出规则特征缩放必须标准化不需要适合数据量中小规模中大规模过拟合风险K 小时易过拟合深度大时易过拟合五、小结KNN适合快速原型验证和中小规模数据核心调参是 K 值选择决策树适合需要可解释性的场景核心调参是最大深度和划分标准实际项目中随机森林多棵决策树集成往往是比单棵决策树更优的选择无论用哪种算法特征标准化和交叉验证都是标准操作不可省略