零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!
写在前面
在前面的学习中,我们已经掌握了使用 Python、Pandas、NumPy、Matplotlib 和 Seaborn 进行数据处理、分析和可视化的全套核心技能。我们学会了如何从数据中提取信息、清洗数据、整合数据、探索数据模式并将其可视化呈现。
现在,我们站在了一个新的起点。数据分析不仅在于理解过去和现在,更在于 利用数据预测未来、发现隐藏的规律、甚至让机器具备自主学习和决策的能力。这就是 机器学习 (Machine Learning, ML) 的魅力所在。
机器学习:数据分析的延伸与升华
机器学习 是人工智能的一个重要分支,它研究如何让计算机 从数据中自动学习规律和模式,并利用这些规律对 新的、未知的数据 进行预测或决策,而 无需进行显式的编程。
可以将其理解为:我们不再告诉计算机 如何 完成任务的每一步具体指令,而是给它大量的数据和期望的结果 (或不给结果),让它自己 “学习” 如何完成任务。
与传统数据分析的关系:
- 数据分析是基础: 我们之前学习的数据清洗、处理、探索性分析、可视化等技能,都是进行机器学习的 必要前提。高质量的数据和对数据的深入理解是构建有效机器学习模型的基础。
- 机器学习是进阶: 机器学习利用更复杂的算法和模型,从数据中学习更深层次的模式,并用于 预测、分类、聚类 等更高级的任务,是数据分析能力的自然延伸和升华。
为什么要了解机器学习初步?
- 拓展数据分析的应用边界: 掌握基本的机器学习概念和工具,可以让你将数据分析从描述性、诊断性分析拓展到 预测性、规范性分析,解决更广泛的业务问题。
- 理解更高级的数据科学概念: 机器学习是现代数据科学的核心组成部分,了解其基础有助于你理解更前沿的技术和应用。
- 提升职业竞争力: 具备一定的机器学习知识和实践能力,将使你在数据分析领域的职业发展中更具优势。
- 为深入学习打下基础: 本篇是机器学习的初步介绍,旨在为你打开一扇门,为后续系统学习机器学习算法、模型评估、特征工程等更深入的内容奠定基础。
本篇博客将作为机器学习的入门篇,重点介绍:
- 机器学习的基本概念和分类。
- Python 中最流行的机器学习库:Scikit-learn (sklearn)。
- 一个典型的机器学习工作流程 (简化版)。
- 使用 Scikit-learn 实现简单的分类、回归、聚类任务示例。
请注意,本篇内容旨在提供一个高层次的概述和初步体验,机器学习是一个广阔而深入的领域,需要持续的学习和实践。 本篇属于本专栏的 “进阶选修” 内容,可以根据你的兴趣和学习进度选择性阅读。
🧠 一、机器学习的基本概念与分类
1. 什么是机器学习?
简单来说,机器学习就是让计算机 从数据中学习。 更正式一点的定义(Arthur Samuel, 1959):机器学习是 “在没有被明确编程的情况下,给予计算机学习能力的研究领域”。
核心思想是通过算法分析大量数据,从中 自动识别模式,并使用这些模式来 做出预测或决策。
与传统编程的区别:
- 传统编程: 人类程序员编写明确的规则和指令,计算机严格按照指令执行。 (输入 -> 规则 -> 输出)
- 机器学习: 计算机通过分析数据自动学习规则和模式,然后使用学习到的模式进行预测或决策。 (输入 + 输出 -> 学习 -> 规则)
2. 机器学习的主要类型
根据 学习方式 和 数据类型 的不同,机器学习主要可以分为以下几类:
-
监督学习 (Supervised Learning):
- 核心思想: 从 带有标签 (labeled) 的数据中学习。 训练数据既包含 输入特征 (features),也包含 对应的正确输出 (labels 或 target)。 模型的目标是学习从输入特征到输出标签的映射关系。
- 好比: 学生跟着老师学习,老师提供问题(特征)和正确答案(标签),学生学习如何解答类似问题。
- 主要任务:
- 分类 (Classification): 预测输出是 离散的类别标签。
- 示例: 判断邮件是否为垃圾邮件 (是/否),识别图片中的动物类别 (猫/狗/鸟),预测客户是否会流失 (流失/不流失)。
- 回归 (Regression): 预测输出是 连续的数值。
- 示例: 预测房屋价格,预测明天的气温,预测股票价格,预测产品的销售额。
- 分类 (Classification): 预测输出是 离散的类别标签。
-
无监督学习 (Unsupervised Learning):
- 核心思想: 从 没有标签 (unlabeled) 的数据中学习。 训练数据只有 输入特征,没有对应的正确输出。 模型的目标是 发现数据中隐藏的结构、模式或关系。
- 好比: 学生自己探索学习,没有标准答案,需要自己从大量信息中发现规律和知识。
- 主要任务:
- 聚类 (Clustering): 将相似的数据点 分组 到一起,形成不同的簇 (cluster)。
- 示例: 客户细分 (将具有相似购买行为的客户分群),对新闻文章进行主题分组,图像分割。
- 降维 (Dimensionality Reduction): 在保留数据主要信息的前提下,减少数据的特征数量 (维度),用于数据压缩、可视化或加速后续模型训练。
- 示例: 主成分分析 (PCA),奇异值分解 (SVD)。
- 关联规则挖掘 (Association Rule Mining): 发现数据项之间的有趣关联。
- 示例: “购买了啤酒的人也经常购买尿布” (购物篮分析)。
- 聚类 (Clustering): 将相似的数据点 分组 到一起,形成不同的簇 (cluster)。
-
半监督学习 (Semi-supervised Learning): 介于监督学习和无监督学习之间,训练数据 同时包含少量带标签数据和大量无标签数据。
-
强化学习 (Reinforcement Learning): 模型通过与 环境 进行交互来学习,通过 试错 (trial-and-error) 和 奖励/惩罚机制 来优化其 行为策略,以最大化累积奖励。 常见于游戏 AI、机器人控制等领域。
本篇博客将主要关注最常用的监督学习 (分类、回归) 和无监督学习 (聚类)。
🛠️ 二、Python 机器学习利器:Scikit-learn (sklearn)
Scikit-learn (通常简写为 sklearn
) 是 Python 中 最流行、功能最全面、使用最广泛 的 通用机器学习库。 它构建在 NumPy, SciPy 和 Matplotlib 之上,提供了大量用于 数据预处理、特征工程、模型选择、模型训练、模型评估 的工具和算法。
Scikit-learn 的主要优势:
- 简洁、一致的 API: Scikit-learn 的核心设计理念之一就是提供 简洁且高度一致的 API 接口。 无论使用哪种算法,其基本的使用模式 (例如创建模型对象、使用
.fit()
训练、使用.predict()
预测) 都非常相似,大大降低了学习和使用不同算法的门槛。 - 丰富的算法选择: 涵盖了绝大多数 经典且常用 的机器学习算法,包括各种分类、回归、聚类、降维、模型选择和预处理方法。
- 完善的文档和示例: Scikit-learn 拥有 非常出色、详细且易于理解 的官方文档和丰富的示例代码,是学习和解决问题的宝贵资源。
- 强大的社区支持: 作为 Python 数据科学生态的核心库,Scikit-learn 拥有庞大而活跃的社区,遇到问题很容易找到帮助和解决方案。
- 与其他库的良好集成: 与 NumPy, Pandas, Matplotlib 等库无缝集成,可以方便地在数据分析流程中使用。
Scikit-learn 的核心组件 (初步了解):
- Estimator (估计器): Scikit-learn 中用于 学习数据 的核心对象,可以理解为 模型本身。 所有的估计器都提供了一个
fit()
方法用于从数据中学习。- 分类器 (Classifier): 用于分类任务的估计器 (例如
LogisticRegression
,KNeighborsClassifier
,SVC
,DecisionTreeClassifier
)。 - 回归器 (Regressor): 用于回归任务的估计器 (例如
LinearRegression
,Ridge
,Lasso
,SVR
,DecisionTreeRegressor
)。 - 聚类器 (Clusterer): 用于聚类任务的估计器 (例如
KMeans
,DBSCAN
)。
- 分类器 (Classifier): 用于分类任务的估计器 (例如
- Transformer (转换器): 用于 数据预处理和转换 的估计器,例如特征缩放 (
StandardScaler
,MinMaxScaler
)、特征编码 (OneHotEncoder
,LabelEncoder
)、降维 (PCA
) 等。 它们通常提供fit()
和transform()
方法。 - Pipeline (管道): 用于将 多个步骤 (例如转换器和估计器) 串联 起来,形成一个统一的工作流程,简化代码并避免数据泄漏。
一致的 API 设计:fit()
, predict()
, transform()
Scikit-learn 的 API 设计非常一致,核心方法包括:
estimator.fit(X, y)
: 用于 训练模型。X
是训练数据的 特征矩阵 (通常是 NumPy 数组或 Pandas DataFrame),y
是训练数据的 目标标签 (对于监督学习,通常是 NumPy 数组或 Pandas Series)。 对于无监督学习 (如聚类),y
参数通常不需要。estimator.predict(X)
: 用于 使用训练好的模型进行预测。X
是新的、未见过的数据的特征矩阵。 返回预测结果 (类别标签或连续值)。transformer.transform(X)
: 用于 对数据进行转换 (例如特征缩放、编码、降维)。X
是要转换的数据。 返回转换后的数据。