尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Scikit-learn机器学习入门:从零开始的手写数字识别实战

Scikit-learn机器学习入门:从零开始的手写数字识别实战 1. 项目概述为什么从Scikit-learn开始你的机器学习之旅如果你刚接触机器学习面对TensorFlow、PyTorch这些听起来就很高大上的框架是不是有点无从下手别急绝大多数从业者的第一站其实是一个叫Scikit-learn的Python库。今天这篇内容就是带你零门槛、手把手地完成一次“sklearn初体验”。我的目标很简单让你在完全不懂任何复杂数学公式和底层原理的情况下能亲手运行几个经典的机器学习模型看到它们从数据中“学习”并做出预测的神奇过程从而建立最直观的认知和信心。Scikit-learn我们通常亲切地称它为sklearn它在机器学习领域的地位就像螺丝刀之于工具箱——不是最炫酷的但绝对是使用频率最高、最不可或缺的基础工具。它封装了海量经典的、成熟的机器学习算法从数据预处理、特征工程到模型训练、评估、选择提供了一套极其简洁统一的API。你不需要从零开始写一个决策树或者支持向量机只需要几行代码就能调用这些经过千锤百炼的算法。对于初学者而言这极大地降低了入门门槛让你能跳过繁琐的算法实现直接聚焦于“如何用机器学习解决实际问题”这个核心思维上。那么这次初体验适合谁呢如果你是对Python有基本了解知道列表、字典会装库但对机器学习充满好奇的编程新手或者是其他领域的从业者想快速了解机器学习能为自己工作流带来什么改变的探索者那么这篇内容就是为你量身定做的。我们不深究梯度下降的数学推导也不讨论神经网络的反向传播我们就做一件事用sklearn完成几个有代表性的小任务感受一下机器学习的“手感”。2. 环境准备与核心概念扫盲2.1 搭建你的第一个机器学习工作环境工欲善其事必先利其器。对于机器学习初学者我最推荐的环境配置方案是Anaconda Jupyter Notebook。这不是唯一选择但绝对是踩坑最少、最省心的方案。为什么是AnacondaAnaconda是一个集成了Python和大量科学计算库包括我们今天的核心——sklearn的发行版。它自带包管理工具conda能完美解决不同库之间复杂的依赖关系问题。你自己用pip去安装sklearn可能会遇到numpy、scipy版本不兼容的报错而Anaconda帮你把这些都安排得明明白白。去Anaconda官网下载对应你操作系统的安装包一路下一步即可。为什么是Jupyter Notebook机器学习的学习过程充满了探索和试错。你需要不断地加载数据、运行一小段代码、查看结果、调整参数、再运行。Jupyter Notebook以“单元格”为单位执行代码并即时显示结果和图表这种交互式体验非常适合数据分析和机器学习实验。它就像你的数字实验笔记本代码、注释、图表、结论都在一起方便回溯和分享。安装好Anaconda后你可以在开始菜单找到“Anaconda Navigator”打开后启动Jupyter Notebook。它会自动在你的浏览器中打开一个本地页面这就是你的工作台了。新建一个Python笔记本我们的旅程就从这个空白页面开始。在第一个单元格里我们首先导入本次体验最核心的“三剑客”import numpy as np import pandas as pd import matplotlib.pyplot as pltnumpy提供高效的数组ndarray操作是sklearn底层计算的基石。pandas用于数据清洗、分析和处理它的DataFrame结构可以理解为Excel表格是处理结构化数据的神器。matplotlib绘图库用于将数据和模型结果可视化一图胜千言。接着导入sklearn本身。我们不会一次性导入所有模块而是按需导入这样更清晰。# 这是sklearn的标准导入方式我们后续会从这里引入具体的功能 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler2.2 理解机器学习的基本流程与核心术语在写代码之前我们必须统一“语言”。机器学习项目无论复杂与否通常遵循一个标准流程。理解这个流程比记住任何算法公式都重要。1. 数据收集与理解任何模型都建立在数据之上。数据可以是表格、文本、图像等。我们首先要知道数据里有什么每一列代表什么含义特征以及我们想预测什么目标。2. 数据预处理原始数据几乎总是“脏”的。这一步包括处理缺失值比如用平均值填充、将文字信息转化为数字比如“男”“女”转化为0和1、将数值特征缩放到相同的尺度防止某个特征因为数值大而主导模型。sklearn的preprocessing模块提供了大量工具来完成这些工作。3. 划分数据集这是初学者最容易忽略但至关重要的一步。我们不能用所有的数据来训练模型然后用同样的数据去评价它这就像学生考试前背下了所有题目的答案然后考了满分——这无法证明他真正理解了知识。正确的做法是把数据随机分成两部分 -训练集用于“教导”模型让模型学习数据中的规律。 -测试集用于“考核”模型评估模型面对从未见过的新数据时的表现。这个成绩才代表模型的真实能力。通常按7:3或8:2的比例划分。4. 选择与训练模型根据你要解决的问题类型是预测类别还是预测数值选择一个合适的算法如决策树、线性回归。然后用训练集的数据去“拟合”这个模型这个过程就是训练。5. 模型评估用测试集的数据输入训练好的模型得到预测结果再将预测结果与测试集真实的答案进行对比计算出各种评估指标如准确率、均方误差从而判断模型的好坏。6. 模型调优与使用如果模型表现不佳我们可以调整模型的参数超参数调优或者回到前面步骤改进数据迭代优化。最终将满意的模型用于对新数据的预测。记住两个核心术语特征输入变量。例如预测房价时房子的面积、楼层、房龄就是特征。目标/标签我们希望模型预测的输出变量。例如房价本身或者房屋是否出售是/否。3. 实战初体验手写数字识别理论说再多不如动手做一遍。我们用一个机器学习领域的“Hello World”项目——手写数字识别来串联整个流程。sklearn贴心地内置了这个经典数据集。3.1 加载与观察数据我们在Jupyter Notebook中新建一个单元格输入以下代码# 加载内置的手写数字数据集 digits datasets.load_digits() # 看看这个数据集里有什么 print(“数据集结构类型”, type(digits)) print(“\n数据的键”, digits.keys())运行后你会看到digits是一个类似字典的对象包含data特征、target目标标签、images图像像素等键。让我们更直观地看看数据# 查看特征数据的形状 print(“特征数据形状”, digits.data.shape) print(“目标标签形状”, digits.target.shape) # 查看第一张‘图片’的特征数据前20个像素值 print(“\n第一张图片的特征值前20个:\n”, digits.data[0 :20]) # 查看第一张图片对应的真实数字 print(“\n第一张图片对应的数字是”, digits.target[0])输出会显示我们有1797个样本每个样本有64个特征对应一个8x8像素的图像拉平后的64个灰度值。target就是每个图像对应的真实数字0-9。注意digits.data是一个二维数组矩阵行是样本列是特征。这是sklearn乃至整个机器学习领域约定俗成的数据格式务必牢记。可视化能让我们更好地理解数据。让我们画出前几个数字的图像# 设置图形大小 plt.figure(figsize(10 4)) # 画出前10个手写数字图像 for index (image label) in enumerate(zip(digits.images[:10] digits.target[:10])): plt.subplot(2 5 index 1) # 2行5列的子图 plt.imshow(image cmapplt.cm.gray_r interpolation‘nearest’) plt.title(‘Training: %i’ % label) plt.axis(‘off’) # 关闭坐标轴 plt.tight_layout() plt.show()运行这段代码你会看到一个2行5列的图像网格每张图都是一个手写数字标题显示了它的真实标签。看到这些由像素点构成的数字你应该能理解data里那64个数字的含义了。3.2 划分数据集与数据预处理接下来我们按照流程把数据分成训练集和测试集。# 划分数据集 test_size0.2表示20%的数据作为测试集 random_state保证每次划分结果一致 X_train X_test y_train y_test train_test_split(digits.data digits.target test_size0.2 random_state42) print(“训练集特征形状”, X_train.shape) print(“测试集特征形状”, X_test.shape) print(“训练集标签形状”, y_train.shape) print(“测试集标签形状”, y_test.shape)这里X通常代表特征数据y代表目标标签。train_test_split函数帮我们完成了随机划分。random_state参数像一个随机种子设为固定的数字比如42可以确保每次运行代码划分的结果都一样这对于复现实验非常重要。对于图像像素数据其值通常在0-16之间尺度相对统一因此我们暂时不做复杂的缩放处理。但在很多其他场景比如数据中同时包含“年龄0-100”和“年薪0-1000000”就必须进行特征缩放否则“年薪”这个特征会完全主导模型。常用的缩放方法是StandardScaler它将数据标准化为均值为0、方差为1的分布。3.3 选择模型、训练与预测现在进入核心环节选一个模型用训练数据教它再用它去预测测试数据。我们从最简单的分类器之一——逻辑回归开始。别被名字迷惑虽然叫“回归”但它最常用于二分类和多分类问题。# 从sklearn的线性模型模块导入逻辑回归 from sklearn.linear_model import LogisticRegression # 1. 创建模型实例 # max_iter是最大迭代次数设大一些确保模型能收敛 random_state保证结果可复现 model LogisticRegression(max_iter5000 random_state42) # 2. 训练模型拟合 # 这一步模型在“学习”X_train和y_train之间的关系 model.fit(X_train y_train) # 3. 使用训练好的模型进行预测 # 对训练集本身预测看看‘学习效果’ y_train_pred model.predict(X_train) # 对测试集预测真正的‘考试’ y_test_pred model.predict(X_test) print(“模型训练完成”)短短几行模型就训练好了。fit方法就是训练过程predict方法就是使用模型进行预测。sklearn的API设计之美就在于几乎所有模型都遵循model.fit(X y)和model.predict(X)这个模式学会一个触类旁通。3.4 评估模型表现模型预测得对不对我们需要一个量化的评估。对于分类问题最直观的指标就是准确率预测正确的样本数占总样本数的比例。# 导入准确率计算函数 from sklearn.metrics import accuracy_score # 计算训练集和测试集上的准确率 train_accuracy accuracy_score(y_train y_train_pred) test_accuracy accuracy_score(y_test y_test_pred) print(f“模型在训练集上的准确率 {train_accuracy:.4f}”) print(f“模型在测试集上的准确率 {test_accuracy:.4f}”)运行后你可能会得到类似“训练集准确率1.0 测试集准确率0.97”的结果。这意味着模型在训练集上全对了在从未见过的测试集上100个数字里能认对97个。这个结果相当不错但准确率有时会“骗人”特别是当数据类别不均衡时比如1000个样本里990个是数字010个是数字1一个模型即使全部预测为0准确率也有99%。因此我们引入一个更详细的评估工具——混淆矩阵。from sklearn.metrics import confusion_matrix ConfusionMatrixDisplay # 计算测试集的混淆矩阵 cm confusion_matrix(y_test y_test_pred) # 可视化混淆矩阵 disp ConfusionMatrixDisplay(confusion_matrixcm display_labelsmodel.classes_) disp.plot(cmapplt.cm.Blues) plt.title(‘混淆矩阵 - 测试集’) plt.show()混淆矩阵的行代表真实类别列代表预测类别。对角线上的数字越大、颜色越深越好表示预测正确。非对角线上的点则表示模型混淆了哪些数字。通过这个图你可以清晰地看到模型最容易把哪个数字错认成另一个。4. 探索不同模型与调参初探逻辑回归表现不错但sklearn里还有其他模型。我们再来快速体验两个经典模型支持向量机和随机森林。感受一下不同模型的“性格”。4.1 支持向量机初试支持向量机在小数据集上往往能取得很好的效果。from sklearn.svm import SVC # 创建SVM模型实例使用默认的径向基核函数 svm_model SVC(random_state42) svm_model.fit(X_train y_train) y_pred_svm svm_model.predict(X_test) accuracy_svm accuracy_score(y_test y_pred_svm) print(f“SVM模型在测试集上的准确率 {accuracy_svm:.4f}”)4.2 随机森林初试随机森林是一种集成学习算法通过构建多棵决策树并综合它们的意见来做决策通常非常强大且不易过拟合。from sklearn.ensemble import RandomForestClassifier # 创建随机森林模型 n_estimators表示森林中树的数量 rf_model RandomForestClassifier(n_estimators100 random_state42) rf_model.fit(X_train y_train) y_pred_rf rf_model.predict(X_test) accuracy_rf accuracy_score(y_test y_pred_rf) print(f“随机森林模型在测试集上的准确率 {accuracy_rf:.4f}”)运行后你可以对比三个模型的准确率。可能会发现随机森林略胜一筹。但这并不是绝对的模型性能高度依赖于数据和问题本身。4.3 模型调参初体验以随机森林为例模型的n_estimators100是一个超参数它不是模型从数据中学到的而是我们在训练前手动设定的。超参数的选择会极大影响模型性能。我们可以尝试不同的值看看效果如何。这个过程就是最简单的调参。# 尝试不同的树的数量 n_trees_list [10 50 100 200] accuracy_list [] for n_trees in n_trees_list: model_temp RandomForestClassifier(n_estimatorsn_trees random_state42) model_temp.fit(X_train y_train) y_pred_temp model_temp.predict(X_test) acc accuracy_score(y_test y_pred_temp) accuracy_list.append(acc) print(f“树的数量{n_trees:3d} 测试集准确率{acc:.4f}”) # 简单可视化 plt.plot(n_trees_list accuracy_list marker‘o’) plt.xlabel(‘随机森林中树的数量 (n_estimators)’) plt.ylabel(‘测试集准确率’) plt.title(‘超参数 n_estimators 对模型性能的影响’) plt.grid(True) plt.show()这个简单的循环让我们看到在一定范围内增加树的数量可能会提升性能但也会增加计算时间且可能遇到性能瓶颈。这就是调参的权衡艺术。sklearn提供了更强大的自动化调参工具GridSearchCV但作为初体验我们先手动感受一下这个过程。5. 从初体验到进阶关键问题与避坑指南走完上面的流程你已经完成了机器学习最核心的闭环。但在实际操作中新手会遇到各种各样的问题。下面我总结几个最常见的“坑”和应对技巧。5.1 数据预处理不当导致模型失效问题场景你从网上找到一个数据集兴致勃勃地训练了一个模型结果准确率只有50%和瞎猜差不多。排查与解决检查数据尺度使用pandas的describe()函数快速查看每个特征的统计信息均值、标准差、最小值、最大值。如果不同特征的数量级相差巨大如特征A范围0-1特征B范围0-10000务必进行特征缩放。常用StandardScaler或MinMaxScaler。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # 拟合缩放器并转换训练集 X_test_scaled scaler.transform(X_test) # 用训练集的参数转换测试集重要提示缩放器的参数均值和标准差必须只从训练集fit出来然后同时用于转换训练集和测试集。绝对不能用整个数据集包含测试集来fit缩放器这会引入“数据泄露”导致评估结果虚高。检查缺失值使用df.isnull().sum()查看每列缺失值的数量。对于缺失值简单的处理方式包括删除缺失行df.dropna()、用均值/中位数填充df.fillna(df.mean())、或用特定值如-1填充。sklearn的SimpleImputer可以方便地完成这个工作。检查类别标签对于分类问题确保目标标签y是整数0 1 2...或字符串并且类别数量合理。可以用np.unique(y)查看所有类别。5.2 过拟合与欠拟合的识别这是机器学习中最核心的挑战之一。过拟合模型在训练集上表现极好如准确率99%但在测试集上表现很差。这好比学生死记硬背了所有习题但不会解一道新题。模型把训练数据中的噪声和局部特征也学进去了导致泛化能力差。欠拟合模型在训练集和测试集上表现都很差。这好比学生根本没学懂基础知识。模型太简单无法捕捉数据中的基本规律。如何判断对比训练集和测试集的评估指标如准确率。如果训练集指标远高于测试集很可能过拟合。如果两者都很低则可能欠拟合。应对策略应对过拟合简化模型降低模型复杂度如减少决策树深度、增加正则化强度。获取更多训练数据。减少特征数量特征选择。使用集成方法如随机森林本身就有抗过拟合特性。应对欠拟合使用更复杂的模型。增加更多有价值的特征特征工程。减少正则化强度。延长训练时间增加迭代次数。5.3 常见报错与快速排查ValueError: Found array with dim 3. Expected 2原因你传递给fit或predict的数据维度不对。sklearn要求特征X是二维数组样本数 特征数目标y是一维数组。解决检查你的数据形状。如果是图像数据可能没从样本 高 宽拉平成样本 高*宽。使用.reshape(-1 特征数)进行展平。ConvergenceWarning: lbfgs failed to converge...原因常见于逻辑回归等迭代优化算法表示迭代次数不够模型未收敛。解决增加max_iter参数的值如从默认的100增加到1000或5000。NotFittedError: This ... instance is not fitted yet...原因在调用predict或transform之前没有先调用fit方法训练模型。解决确保代码顺序是model.fit(X_train y_train)在前model.predict(X_test)在后。5.4 模型保存与加载训练一个好的模型可能需要很长时间我们当然不希望每次使用都要重新训练。sklearn提供了简单的模型持久化方法常用joblib对大数据更友好。import joblib # 保存模型到文件 joblib.dump(rf_model ‘my_random_forest_model.pkl’) # 在另一个程序或未来某个时间加载模型 loaded_model joblib.load(‘my_random_forest_model.pkl’) # 使用加载的模型直接预测 new_predictions loaded_model.predict(X_new_data)6. 下一步学习路径与资源推荐完成这次初体验你已经成功迈出了第一步。为了帮助你继续前行我梳理了一条比较平滑的进阶路径第一步巩固基础深入理解核心概念彻底搞明白什么是偏差-方差权衡、交叉验证、过拟合与欠拟合。推荐阅读《Python机器学习基础教程》这本书以sklearn为主线讲解非常清晰。玩转更多内置数据集sklearn的datasets模块还包含鸢尾花分类、波士顿房价回归、葡萄酒分类等经典数据集。用它们重复上述流程尝试解决回归问题预测连续值如房价。第二步掌握核心技能特征工程这是决定模型上限的关键。学习如何处理分类变量独热编码、标签编码、处理文本数据词袋模型、TF-IDF、如何通过现有特征创造新特征。模型评估与选择超越简单的准确率。学习精确率、召回率、F1分数、ROC-AUC曲线理解它们在不同场景下的意义。学习使用cross_val_score进行交叉验证获得更稳健的模型评估。超参数调优系统学习使用GridSearchCV和RandomizedSearchCV进行自动化超参数搜索让模型性能更上一层楼。第三步项目实战在Kaggle或天池等数据科学竞赛平台上找一个入门级比赛如泰坦尼克号生存预测。从数据清洗开始完整地走一遍流程将学到的技能应用于一个真实、复杂的数据集。这是提升最快的方式。关于工具 在熟练使用sklearn解决传统机器学习问题后如果你对深度学习如图像识别、自然语言处理产生兴趣那时再去接触PyTorch或TensorFlow会更加顺理成章。记住sklearn是你工具箱里最可靠、最常用的那把扳手绝大多数实际问题用它就足够了。最后分享一个我个人的习惯每尝试一个新模型或新技巧我都会在一个独立的Jupyter Notebook中记录并用自己的话在Markdown单元格里写下“这个是什么”、“为什么要用它”、“效果怎么样”以及“踩了什么坑”。久而久之这就成了我最有价值的个人知识库。机器学习的学习过程就是不断实验和总结现在你已经拥有了开始这一切的所有基础工具和信心。
返回列表