机器学习(一):5分钟了解机器学习并上手实际

图灵汇官网

引言

如今市面上的机器学习教程大多从数学基础开始,然后讲解机器学习算法,建立数学模型,再过渡到深度学习,最后讨论工程化应用。尽管这些环节都在快速发展,但真正实现应用落地却相对困难。我们投入大量时间和精力学习这些内容,实际上成本非常高。因此,不如先大致了解机器学习,浅尝辄止。等到明确了自己的应用场景,再针对性地深入学习。这样可以最大程度地减少沉没成本。

本教程适合那些希望拓宽知识面的人群,从应用的角度出发,使用机器学习工具。这符合笔者个人的学习方式和思维模式。本教程内容简明易懂,便于快速入门。但若想走得更远,仍需进一步学习数学知识。目前,我们暂且搁置数学,先构建自己的知识体系。

把视角拉高

从手工劳动到工业化生产,再到人工智能的应用,这是一个逐步解放人类生产力的过程。使用机器来辅助人类工作,一直是人们的美好愿景。通过让机器具备智能,使其替代人力完成更复杂的任务,这是人工智能的一个基本概念。

许多教程或书籍将人工智能、机器学习、深度学习之间的关系描述为从属关系,即人工智能包含机器学习,机器学习包含深度学习。这种解释虽然直观,但未能完全揭示它们之间的深层联系。

机器学习通过数学方法在数据中寻找解释,从而实现人工智能。而深度学习是在机器学习的基础上,借鉴神经系统的原理发展起来的一种高级技术。两者之间存在一定的依赖关系和发展趋势。

从广义上讲,传统的机器学习通过不断优化数学模型来发现数据规律。选择合适的数学模型至关重要。随着GPU、TPU等计算能力的提升,算法技术也在进步,甚至出现了自动化选择模型和调整参数的技术。我们可以构建复杂的神经网络结构,只要计算能力足够,就可以用深度学习解决复杂问题。因此,在编程操作方面,深度学习相比传统机器学习更容易理解和应用。我们先学习传统机器学习而不是直接学习深度学习的好处在于,可以通过拆解“黑盒”来理解机器学习的过程,掌握相关概念。

机器学习的三大基石

机器学习的发展离不开三个关键因素:算力、算法和数据。这三个要素相辅相成,缺一不可。

在技术层面,机器学习在计算机视觉(CV)和自然语言处理(NLP)领域取得了重要进展。算法可以分为监督学习、非监督学习、半监督学习和强化学习。

  • 监督学习:数据样本带有标签。
  • 非监督学习:数据样本不带标签。
  • 半监督学习:数据样本带有部分标签。
  • 强化学习:根据结果给予奖励或惩罚。

“垃圾进,垃圾出”(Garbage in, Garbage out)。数据质量直接影响机器学习的效果。我们需要花费大量时间处理数据,甚至可能占到整个机器学习项目工作的90%以上。例如,数据采集过程中如果采样方式不当,可能会导致数据代表性不足,从而影响结果。

机器学习的工业化流程

我们以一款工业化流水线工具TFX为例,看看机器学习的具体流程。

流程包括:数据输入、数据验证、特征工程、训练模型、验证模型、应用良好模型和提供模型六个步骤:

  1. 输入数据,并根据需求拆分数据集。
  2. 生成训练数据和服务数据的特征统计信息。
  3. 创建数据架构,识别异常值。
  4. 执行特征工程。
  5. 训练模型,调整超参数。
  6. 对训练结果进行深入分析,验证导出的模型。
  7. 检查模型是否能提供服务,并避免推送不良模型。
  8. 将模型部署到服务架构。

通过以上流程,大家应该对机器学习的实际应用有了宏观的认识。

机器如何学习

我们从宏观角度了解了机器学习的产业结构和工业化流程,现在回到微观层面,看看机器是如何学习的。

以摄氏度转换华氏度为例。在传统编程中,我们需要找到摄氏度和华氏度的关系公式:

[ text{华氏度} = text{摄氏度} times 1.8 + 32 ]

在机器学习中,我们拥有大量数据,需要找出其中的关系。机器学习的过程就是不断调整参数,以找到最佳的数学模型来解释数据规律。

如图所示,我们有摄氏度数据(0, 8, 15, 22, 38)和对应的华氏度数据(32, 46.4, 59, 71.6, 100.4)。机器学习的过程就是找到这个公式的最佳拟合过程。

  • 特征:模型的输入,在这个例子中是摄氏度。
  • 标签:模型预测的输出,在这个例子中是华氏度。
  • 实例:训练时使用的输入/输出对,如(0, 32)、(8, 46.4)。

蓝色部分表示我们通过不断调整权重和偏置,拟合数据,最终得到可以表示规律的模型。

  • 拟合:通过训练数据,使模型概括数据的过程。
  • 模型:包含训练过程中权重和偏置的数据结构。

简单上手机器学习代码

在学习代码之前,假设你已经配置好环境,并掌握了Jupyter、Numpy、Pandas和Matplotlib的用法。如果没有,请参考我写的配套教程。

```python import numpy as np import matplotlib.pyplot as plt

celsius = [[-40], [-10], [0], [8], [15], [22], [38]] fahrenheit = [[-40], [14], [32], [46.4], [59], [71.6], [100.4]]

plt.scatter(celsius, fahrenheit, c='red', label='真实数据') plt.xlabel('摄氏度') plt.ylabel('华氏度') plt.legend() plt.grid(True) plt.title('真实数据') plt.show()

from sklearn.linear_model import LinearRegression

lr = LinearRegression() lr.fit(celsius, fahrenheit)

celsiustest = [[-50], [-30], [10], [20], [50], [70]] fahrenheittest = lr.predict(celsius_test)

plt.scatter(celsius, fahrenheit, c='red', label='真实数据') plt.scatter(celsiustest, fahrenheittest, c='orange', label='预测数据') plt.xlabel('摄氏度') plt.ylabel('华氏度') plt.legend() plt.grid(True) plt.title('预测数据 vs 真实数据') plt.show() ```

这段代码准备了摄氏度和华氏度的数据,并使用matplotlib库绘制图像。我们使用scikit-learn的LinearRegression方法进行拟合训练,并使用测试数据验证模型准确性。

深度学习代码示例

既然已经上手了机器学习,我们不妨尝试一下深度学习代码:

```python import tensorflow as tf import numpy as np

准备数据

celsiusq = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float) fahrenheita = np.array([-40, 14, 32, 46.4, 59, 71.6, 100.4], dtype=float)

构建模型

model = tf.keras.Sequential([ tf.keras.layers.Dense(units=1, input_shape=[1]) ])

编译模型

model.compile( loss='meansquarederror', optimizer=tf.keras.optimizers.Adam(0.1) )

训练模型

history = model.fit(celsiusq, fahrenheita, epochs=500, verbose=False)

输出损失函数变化

import matplotlib.pyplot as plt

plt.xlabel('轮数') plt.ylabel('损失值') plt.plot(history.history['loss']) plt.show() ```

我们使用TensorFlow内置的Keras方法创建了一个简单的神经网络模型,选择了均方误差损失函数和Adam优化器,训练了500轮。从图中可以看到,随着训练轮数增加,损失函数逐渐降低。

前置学习系列

为了更好地理解机器学习,以下是相关的前置学习系列:

  • 前置机器学习(五):30分钟掌握常用Matplotlib用法
  • 前置机器学习(四):一文掌握Pandas用法
  • 前置机器学习(三):30分钟掌握常用NumPy用法
  • 前置机器学习(二):30分钟掌握常用Jupyter Notebook用法
  • 前置机器学习(一):数学符号及希腊字母

感谢您的关注与支持!

本文来源: 图灵汇 文章作者: IT行业资讯