一、什么是机器学习? OR 机器学习能帮我们做什么?
一句白话:人类在"创造、情感思维、灵活性"等方面拥有与生俱来的天赋,但是在处理"海量、复杂的数据"问题方面非常低效,而机器学习就是由人类创造出来高效解决这类问题的技术。
机器学习的实际应用场景,简单总结有以下几点:
-
预测数据
- 在股票市场中,机器学习可以用于股票价格预测。通过历史股票价格数据和其他相关因素,机器学习模型可以预测未来股票价格的走势,帮助投资者做出决策;
- 在交通管理中,机器学习可以用于优化交通流量,通过分析历史交通数据,预测交通拥堵情况,从而优化交通信号灯的控制,减少交通拥堵。
-
识别分类
- 在医学影像诊断中,机器学习可以用于分类X光片或MRI扫描图像,帮助医生识别肿瘤、病变等疾病,从而进行更准确的诊断。
-
归纳聚类
- 在零售业中,机器学习可以用于发现顾客购买行为中的关联规律。通过分析购物篮中商品的组合,商家可以了解不同商品之间的关联关系,从而制定更有效的促销策略。
-
异常检测
- 在金融领域,机器学习可用于检测信用卡交易中的欺诈行为。通过分析交易模式和行为,机器学习模型可以识别异常交易,帮助银行和客户减少欺诈风险;
- 在广告反作弊领域中,异常检测可以用于识别异常的点击行为。例如,通过监控广告点击数据,机器学习模型可以分析用户的点击模式、点击频率、点击时间等信息。如果某个用户的点击行为与正常模式明显不符,比如频繁点击广告、在短时间内产生大量点击等,系统可以将这些行为标记为异常点击,从而帮助广告平台识别和防范作弊行为。
-
生成对抗网络
- 在艺术领域,生成对抗网络(GAN)是一种机器学习模型,由两个神经网络组成:生成器和判别器。生成器试图生成看起来像真实样本的数据,而判别器试图区分生成的数据和真实数据。这种竞争促使生成器不断改进生成的数据,以至于最终可以生成非常逼真的数据,比如图像、音乐或文本。
二、机器学习的工作原理是什么? OR 机器学习是如何帮我们做到这些的?
一图概述机器学习工作原理:
收集 收集 收集 收集 收集 拆分 拆分 导入 创建 选择 训练 训练 训练 训练 导入 评估 不符预期 符合预期 调优 实地调查 传感设备采集 网络爬虫 机器学习库下载 其他方式 训练数据集 训练数据集 测试数据集 数据特征选择 数据特征提取 数据特征变换 数据特征创造 特征工程 特征工程 任务 分类任务 回归任务 聚类任务 其他任务 任务 待训练数据模型 分类模型 回归模型 聚类模型 其他模型 训练后数据模型 训练后数据模型 模型评估标准 模型评估标准 分类模型标准 回归模型标准 聚类模型标准 较差模型 较好模型
一句话概括:机器学习主要是将收集到的数据集导入数据模型训练,通过反复的验证+调优,产出较为优秀的数据模型,用于处理同类型的海量数据。
0.数据准备
确定我们想要解决的问题,并收集与问题相关的数据,方式包括:
- 实地调查;
- 传感器数据的收集;
- 网络爬虫抓取;
- 机器学习库下载;
- 其他公开统计资源网站获取。
具体取决于我们所关注的领域和数据类型,以下是常见的几种数据类型:
-
数值型数据:数值型数据是指具有数值属性的数据,可以是整数或浮点数。数值型数据通常用于回归和连续值预测任务;
-
类别型数据:类别型数据是指具有离散类别的数据,通常表示为标签或类别。类别型数据通常用于分类任务;
-
顺序型数据:顺序型数据是介于数值型和类别型之间的数据类型,具有一定的顺序关系。例如,评分等级(1星、2星、3星)就是一种顺序型数据;
-
文本数据:文本数据是指包含文本信息的数据,通常需要进行文本处理和特征提取后才能用于机器学习任务,如自然语言处理任务;
-
图像数据:图像数据是指包含图像信息的数据,通常表示为像素值的矩阵。图像数据通常用于计算机视觉任务;
-
时间序列数据:时间序列数据是按时间顺序排列的数据,通常用于预测未来趋势和模式。
收集完数据后,要将数据整理成数据集的标准格式,数据集通常以表格形式呈现,其中行代表数据样本,列代表特征和标签。(特征的选取可以参考:1.特征工程)
以下是一个简单的数据集格式示例:
特征1 | 特征2 | ... | 标签 |
---|---|---|---|
x1 | x2 | ... | y1 |
x1 | x2 | ... | y2 |
x1 | x2 | ... | y3 |
... | ... | ... | ... |
在这个示例中,每行代表一个数据样本,列代表特征和标签。特征列包括特征1、特征2等,最后一列是标签。
Tips
:
- 在机器学习中,数据集通常包括特征和标签。特征是描述数据的属性或特性,而标签是我们要预测或分类的目标变量。一个数据集可以有多个特征,但通常只有一个标签。标签通常是我们希望模型预测的结果或分类。
举个例子:
假设我们有一个用于分类水果的数据集,包括水果的颜色(特征1)和形状(特征2),以及水果种类(标签)。数据集的格式可能如下所示:
颜色 | 形状 | 种类 |
---|---|---|
红色 | 圆形 | 苹果 |
黄色 | 长条形 | 香蕉 |
橙色 | 圆形 | 橙子 |
... | ... | ... |
在这个示例中,每行代表一个水果样本,包括颜色和形状作为特征,以及水果种类作为标签。
1.特征工程
特征就是我们选取的数据集中数据对象的属性。例如,我们选择手机的数据集,那么颜色、重量、尺寸、电池容量等属性就是特征。
特征工程通常包括以下四个步骤:
-
特征选择:通过相关性分析、特征重要性评估或模型训练中的特征选择算法(如Lasso回归、随机森林特征重要性等),确定哪些特征对模型预测最为重要,选择与目标变量高度相关的特征进行建模;
-
特征提取:对于文本数据,可以使用词袋模型、TF-IDF等方法从文本中提取特征;对于图像数据,可以使用卷积神经网络(CNN)提取图像特征;对于时间序列数据,可以提取统计特征如均值、方差等;
-
特征变换:对特征进行标准化、归一化、对数变换等操作,以改善特征的分布情况,使其更适合模型使用。例如,对数变换可以用来处理偏态分布的特征;
-
特征创造:通过特征组合、交叉特征、聚合特征等操作,创建新的特征以提供更多信息帮助模型预测。例如,可以将年龄和收入两个特征进行组合,创建一个新的特征表示"财富指数"。
2.模型选择
通常在选择数据模型的时候,会根据实际的任务类型来做选择,而任务类型大致分为以下三种:
-
Classification(分类):
- 工作原理:模型学习特征与离散类别之间的关系,以便对新数据进行分类;
- 实例:在垃圾邮件过滤中,模型可以根据邮件的特征(如文本内容、发件人等)将邮件分类为"垃圾邮件"或"非垃圾邮件"。
-
Regression(回归):
- 工作原理:模型学习特征与连续目标变量之间的关系,以便对新数据进行预测;
- 实例:在房价预测中,模型可以根据房屋的特征(如面积、地理位置等)预测房价的连续值。
-
Clustering(聚类):
- 工作原理:模型通过发现数据中的相似性和模式,将数据分为具有相似特征的簇,而无需事先知道类别标签;
- 实例:在客户细分中,模型可以根据客户的特征(如购买行为、偏好等)将客户分为不同的群组。
Tips
:
Q1.如何理解"回归"?
A:"回归"一词最初是由弗朗西斯·高尔顿(Francis Galton)在19世纪提出的,他用它来描述父母与子女身高之间的关系。在这个背景下,"回归"一词指的是子女身高"回归"到平均值,即子女身高更接近于总体平均身高。后来,这个术语被引入到统计学中,用于描述变量之间的关系,特别是用于预测连续值输出的情况。虽然"回归"这个词听起来似乎与"预测"不太相关,但在统计学和机器学习中,它已经成为了描述这种类型任务的标准术语。
Q2.分类和聚类的区别?
A:
- 分类(Classification):分类是一种监督学习任务,旨在将数据分为不同的类别或标签。在分类中,模型学习特征与离散类别之间的关系,用于对新数据进行分类预测。分类任务需要有已知的类别标签作为监督信息。
- 聚类(Clustering):聚类是一种无监督学习任务,旨在将数据分组为具有相似特征的簇。在聚类中,模型通过发现数据中的相似性和模式,将数据分为不同的簇,而无需事先知道类别标签。聚类任务通常用于发现数据中的隐藏结构和模式。
根据任务类型的不同,机器学习中常用的数据模型和对应的应用场景包括:
分类模型:
- 逻辑回归模型
- 应用场景:二分类问题,如垃圾邮件识别、客户流失预测等。
- 支持向量机(SVM)模型
- 应用场景:分类和回归任务,适用于图像分类、文本分类、异常检测等。
- 决策树模型
- 应用场景:分类和回归任务,可用于客户细分、疾病诊断等。
- 随机森林模型
- 应用场景:分类和回归任务,适用于预测销售额、客户满意度等。
回归模型:
- 线性回归模型
- 应用场景:房价预测、销售预测、股票价格预测等需要预测连续值输出的任务。
聚类模型:
- K均值聚类模型
- 应用场景:客户细分、异常检测、图像分割等无监督学习任务。
- 层次聚类模型
- 同上。
其他模型:
- 神经网络模型:
- 应用场景:图像识别、语音识别、自然语言处理等复杂任务。
- 生成对抗网络(GAN)模型:
- 应用场景:图像生成、风格转换、文本生成等创造性任务。
这些数据模型在不同的应用场景中发挥着重要作用,根据任务需求选择合适的模型可以提高机器学习系统的性能和效果。
3.模型训练
Tips
:
- Q1.何为模型训练?
- A:先说数据导入,在代码层面来看,就是将数据集合作为参数,传给python代码中调用的机器学习库函数(数据模型)。而"训练"则是让函数(数据模型)学习(关联)数据集中"特征"与"标签"的关系,最终实现"通过特征预测标签"的目的。
- 举个例子,我们将分类水果的数据集导入分类数据模型,让其学习水果的"颜色、形状"与"种类"的关系,从而实现"我们输入颜色和形状,数据模型预测出可能的水果种类"。
在实际操作中,模型训练涉及以下关键步骤:
-
定义损失函数:选择适当的损失函数,用于衡量模型预测值与实际值之间的差异。
-
选择优化算法:选择合适的优化算法,如梯度下降、Adam等,用于调整模型参数以最小化损失函数。
-
模型训练:通过将训练数据输入模型,利用优化算法不断调整模型参数,使模型能够最好地拟合训练数据。
通常,我们会在模型训练+模型评估之后,如果模型评估结果并不符合预期,则会进行参数调优,也就是上述步骤中的1和2。
步骤1和2具体操作可以参看:[补链接]
另外,模型训练(学习)通常分为两种:有监督学习和无监督学习,区别如下:
-
有监督学习(分类、回归):
- 使用有标记的训练数据(输入特征和对应的标签)来训练模型。
- 目标是学习如何将输入映射到输出,以便模型能够预测新的未标记数据的标签。
- 常见任务包括分类和回归。
-
无监督学习(聚类):
- 使用没有标签的训练数据,模型需要在不需要预先知道输出的情况下发现数据中的模式和结构。
- 目标是发现数据的内在结构或者进行数据的降维、聚类、异常检测等任务。
- 常见任务包括聚类、降维、密度估计、异常检测等。
总的来说,有监督学习需要已知的标签来指导模型训练,而无监督学习则是在没有标签的情况下对数据进行建模和分析。
4.模型评估
完成模型训练之后,需要对训练好的数据模型进行评估,来判断其是好是坏,这就需要一定的评估标准/指标,当评估不同类型的机器学习模型时,我们关注的指标和方法会有所不同:
-
分类模型:
- 评估指标:准确性、精确度、召回率、F1分数、ROC曲线和AUC值等。
- 评估方法:通过比较模型预测结果与实际标签,评估模型的性能,选择适当的指标来衡量模型的分类效果。
-
回归模型:
- 评估指标:均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、决定系数(R²)等。
- 评估方法:关注模型预测值与实际值之间的差异,选择适当的指标来衡量模型的预测准确程度。
-
聚类模型:
- 评估指标:轮廓系数、DB指数、互信息、调整兰德指数等。
- 评估方法:关注模型对数据的分组效果,选择适当的指标来衡量模型对数据分组的效果。
这些评估指标和方法有助于我们了解不同类型模型的性能,以便选择最适合特定任务的模型。
注意
:
对于机器学习模型而言,我们更多地关注其准确性、鲁棒性和泛化能力,而不是简单地将其划分为"好"或"坏"。评判一个模型的性能需要综合考量多个指标,以便更全面地了解其在特定任务中的表现。因此,我们更多地关注模型的准确性和可靠性,而不是简单地将其归为"好"或"坏"。
Tips
:Q1.机器学习中,对于有监督学习,模型评估的标准是根据数据集中的标签来验证的,那对于无监督学习,模型评估又该如何做呢?
A: 在无监督学习中,由于数据集没有标签信息可供使用,评估模型的性能通常更加主观和复杂,需要结合多个评估指标和领域知识来判断模型的有效性。以下是一些常用的评估方法:
- 聚类算法评估:对于聚类算法,可以使用内部评估指标(如轮廓系数、DB指数)或外部评估指标(如兰德指数、互信息分数)来评估聚类的质量。
- 降维算法评估:对于降维算法,可以通过可视化降维后的数据来检查数据的结构和类别之间的分离程度。
- 密度估计算法评估:对于密度估计算法,可以使用一些统计指标(如KL散度)来评估概率分布的拟合程度。
- 异常检测算法评估:对于异常检测算法,可以根据异常得分或者真实标签(如果有)来评估算法的性能。
- 可视化和直觉:在无监督学习中,可视化数据并依靠直觉来评估模型的性能也是常见的方法。
三、机器学习入门实操
仅以简单的分类模型进行有监督学习实操。
0.环境准备
bash
# 安装python3
# 自行搜索安装教程,我这里使用的是python3
# 安装pip3
python3 -m ensurepip --upgrade
# 安装机器学习常用库
pip3 install scikit-learn
pip3 install numpy
pip3 install pandas
1.数据集准备
为了方便演示,这里我们选择使用机器学习中最经典的鸢尾花数据集为例,实操一下机器学习全流程,在实际应用中通常需要使用者自己收集数据&&特征提取。
2.编写python脚本
python
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1.加载数据集:使用scikit-learn库加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征数据
y = iris.target # 目标标签
# 2.1 数据预处理:对数据进行标准化/归一化
# 其主要目的是将数据特征缩放到均值为0,方差为1的标准正态分布,以确保各个特征具有相同的尺度。这有助于模型更好地学习数据特征,提高模型的性能和收敛速度。
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
## 也可以选择使用归一化函数进行预处理,这里暂时注释掉,有兴趣的可以解开注释使用
## 其主要目的是将数据特征缩放到一个指定的范围,通常是[0, 1]或[-1, 1]之间。通过归一化处理,可以消除不同特征之间的量纲差异,使得数据具有统一的尺度,有利于模型的训练和收敛,提高模型的性能和泛化能力。
#scaler = MinMaxScaler()
#X_normalized = scaler.fit_transform(X)
# 2.2 数据预处理:划分训练集和测试集等预处理操作
# 参数说明:
# - test_size:划分比例,0.2 代表80%的数据用于训练,20%的数据用于测试
# - random_state:随机种子,使用random_state参数的作用是确保每次划分的结果是固定的,从而保持训练集和测试集的一致性
# -- 设置random_state参数的值为42实际上是一种惯例,而非必须。数字42在计算机科学和幽默文化中被广泛使用,源自道格拉斯·亚当斯(Douglas Adams)的科幻小说《银河系漫游指南》(The Hitchhiker's Guide to the Galaxy),其中被描述为"生命、宇宙以及一切的答案"。
# -- 因此,将random_state参数设置为42通常被视为一种传统,一种有趣的选择。这并不会影响实际的随机性或模型的性能,但可以使代码更具有趣味性和易记性。您可以选择任何整数值作为random_state参数,只要保持一致性即可。
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
## 也可以选择使用归一化预处理后的数据集,这里暂时注释掉,有兴趣的可以解开注释使用
#X_train, X_test, y_train, y_test = train_test_split(X_normalized, y, test_size=0.2, random_state=42)
# 3.模型选择&&模型训练
# 基于鸢尾花数据集属于分类数据,可以选择适合的分类模型,如逻辑回归、决策树等
# 这里我们以逻辑回归数据模型为例
model = LogisticRegression()
model.fit(X_train, y_train)
# 4.模型预测
y_pred = model.predict(X_test)
# 5.结果评估
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
3.执行脚本
bash
# xxx改成你的脚本名
python3 xxx.py
# 结果输出"Accuracy: 1.0"
# 以小数格式展示准确率,1.0 代表 100%,
因为我们使用的是简单的数据集,所以对于逻辑回归模型来说,准确率非常高,实际应用中一般不会出现100%的准确率。
4.调参优化
由于实操例子过于简单,不需要调优,所以这里暂时不做参数调优的操作演示,后续再出一篇关于针对数据模型参数调优的文章。
5.保存模型
将下面代码添加到你的脚本中:
python
# `joblib`库是一个用于在Python中进行序列化(保存)和反序列化(加载)对象的工具。其主要作用包括:
# 1. **对象持久化**:`joblib`库可以将Python对象(如模型、数据、变量等)保存到磁盘上,以便稍后重新加载和使用。
# 2. **模型保存**:在机器学习中,可以使用`joblib`保存训练好的模型,以便在实际应用中进行预测和推断。
# 3. **数据缓存**:对于计算开销较大的数据处理过程,可以使用`joblib`缓存中间结果,避免重复计算,提高效率。
# 4. **跨平台兼容**:`joblib`库提供了跨平台的对象序列化和反序列化功能,使得在不同环境中共享和重用对象更加方便。
#总的来说,`joblib`库是一个方便的工具,用于在Python中保存和加载对象,特别适用于机器学乨中模型的保存和数据处理过程中的中间结果缓存。
import joblib
# 参数说明:
# 1. model:数据模型
# 2. local_file_path:本地文件路径
local_file_path = 'data.pkl'
joblib.dump(model, local_file_path)
6.复用保存的数据模型
如果想要使用保存的数据模型,可以在脚本中添加下面代码:
python
from sklearn.metrics import accuracy_score
import joblib
# 加载保存的模型文件
model = joblib.load('data.pkl')
# 使用加载的模型进行预测
predictions = model.predict(X_test)
# 评估预测结果
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
这些步骤可以帮助您进行机器学习实践,从加载数据集到训练模型并评估性能。通过实际操作,您可以更好地理解机器学习的流程和应用。
四、寄语
通过学习本文,您已经了解了机器学习的基本概念、应用场景以及实际操作流程。本文旨在带领0基础的读者迈出机器学习的第一步,尝试了解数据准备、特征工程、模型选择、训练和评估的基本流程。
然而,机器学习的核心更在于深入学习算法、模型和调优思路。未来的学习之路还很长,更多精彩的内容等待您去探索。鼓励读者持续深入学习研究,不断挑战自己,探索机器学习领域更为重要和核心的部分,提升自己的技能和认知水平。