普通视图

发现新文章,点击刷新页面。
昨天以前Power's Wiki

机器学习入门 - 模型评估指标

2024年4月7日 19:06

机器学习入门 - 模型评估指标

参考与致谢


不同的机器学习任务需要使用不同指标来评估,本篇文章基于 scikit-learn ,从实际代码上介绍机器学习中回归、分类、聚类这三种模型的评估指标。

回归模型的评估指标

对于回归模型而言,目标是使得预测值能够尽量拟合实际值。常用的性能评估指标有绝对误差和均方误差两种。

平均绝对误差(Mean Absolute Error, MAE)

用于衡量回归问题中预测值与真实值之间平均绝对差异。MAE 的值越小,表示预测值与真实值之间的平均差异越小,即预测的准确性越高。

\[ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_{\text{true}, i} - y_{\text{pred}, i}| \]

公式中,\(n\) 是样本数量, \(y_\text{true}\) 是真实值,\(y_\text{pred}\) 是预测值。

>>> from sklearn.metrics import mean_absolute_error

>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_absolute_error(y_true, y_pred)
0.5

>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]
>>> y_pred = [[0, 2], [-1, 2], [8, -5]]
>>> mean_absolute_error(y_true, y_pred)
0.75

均方误差(Mean Squared Error, MSE)

用于衡量预测值与真实值之间的平均差异。数值越小表示预测结果与真实值的拟合程度越好。

\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_{\text{true}, i} - y_{\text{pred}, i})^2 \]

公式中,\(n\) 是样本数量, \(y_\text{true}\) 是真实值,\(y_\text{pred}\) 是预测值。

>>> from sklearn.metrics import mean_squared_error

>>> y_true = [3, -0.5, 2, 7]
>>> y_pred = [2.5, 0.0, 2, 8]
>>> mean_squared_error(y_true, y_pred)
0.375

>>> y_true = [[0.5, 1],[-1, 1],[7, -6]]
>>> y_pred = [[0, 2],[-1, 2],[8, -5]]
>>> mean_squared_error(y_true, y_pred)
0.708...

分类模型的评估指标

分类模型的评估指标比较多,不同的评估指标之间甚至可能有冲突

如何从零写一个实用的 VS Code 拓展(编辑中)

2024年4月18日 15:43

如何从零写一个实用的 VS Code 拓展(编辑中)

VS Code 是一个实用的编辑器,它拥有强大的扩展生态系统,允许用户自由安装或发布拓展来增强软件的功能。

本文源自个人的需求,围绕一个实用看板工具拓展的开发,详细讲解如何从零编写并发布属于你自己你的 VS Code 拓展。

发掘需求

当你有需求的时候,首先应该先在 VS Code 的拓展商店中查找符合你需求的拓展,而不必重复造轮子。当你发现别人开发的应用都无法符合你的需求、或者缺少你想要的功能,这时候才应该考虑自己开发一个拓展。

在本文的实例中,我想要有一个看板工具,可以一键将我的 Markdown 文档渲染为简洁的看板视图,以此一览当下的所有任务。但是现成的看板相关的拓展,要么源文件不是基于 Markdown 格式的,要么无法做到实时更新看板的预览页面,甚至它们都不够简洁。总之,没有一款能满足我的需求。所以,我打算自己造一个。

搭建框架

开发拓展的第一步,首先要确保 VS Code 和 Node.js 已经安装在本地,随后使用 npm 安装 Yeoman 和 VS Code Extension Generator,快速生成扩展开发的骨架:

npm install -g yo generator-code

安装完成后,运行命令创建新的扩展:

yo code

当提示选择扩展类型时,可以选择“New Extension (TypeScript)”或根据个人偏好选择其他类型。

在自动生成的框架中,有两个比较重要的文件,它们的名字及用途是:

  • src/extension.ts:扩展的主要入口点和逻辑实现。
  • package.json:定义扩展的元数据和依赖。

开发拓展

测试拓展

在 VS Code 中按 F5 即可运行和调试扩展。实例中,在 Debug 窗口打开一个 Markdown 文件,即可测试拓展是否可用于渲染出一个看板页面

打包并发布扩展

打包拓展,需要安装 vsce 工具:

npm install -g vsce

然后使用 vsce package 打包扩展。

(编辑中)

机器学习常用的包

2024年4月18日 15:43

机器学习常用的包

在机器学习领域,有许多优秀的库可供研究者和开发者使用。以下推荐一些适合初学者的机器学习的包,它们各具特色,适合不同层次的学习需求和应用场景:

Scikit-learn:初学者的最佳选择

Scikit-learn 是一个开源的机器学习库,适用于 Python。它的特点是简洁的 API、丰富的算法库和易用性,是初学者的理想选择。Scikit-learn 提供了广泛的监督和无监督学习算法,如线性和逻辑回归、决策树、聚类等,同时也支持各种实用的数据变换和模型评估方法。该库的文档详尽,且有大量教程和示例,有助于新手快速上手。

TensorFlow:深度学习的强大工具

TensorFlow 是由 Google 开发的一个开源深度学习框架。不仅适用于研究和开发高级深度学习模型,也适合那些希望将模型部署到生产环境中的用户。TensorFlow 支持多种语言,并提供了丰富的工具和库,比如 TensorBoard,用于模型训练过程中的可视化。虽然 TensorFlow 的学习曲线相对陡峭,但它的灵活性和强大功能使其成为深度学习领域的重要工具之一。

Keras:简化深度学习的高级 API

Keras 是一个开源的神经网络库,旨在简化深度学习模型的构建和实验。它可以作为 TensorFlow、Microsoft Cognitive Toolkit 或 Theano 的高级接口使用,提供了一种更简单、更快速的方式来创建深度学习模型。Keras 的特点是用户友好的 API、模块化和可扩展性。对于希望快速实现和测试新想法的用户来说,Keras 是一个极佳的选择。

PyTorch:研究和快速原型开发的首选

PyTorch 是一个由 Facebook 开发的开源机器学习库,特别适合于研究原型和实验的快速迭代。它提供了强大的 GPU 加速支持和动态神经网络(即计算图可以在运行时动态改变),这使得模型的设计、调试和优化更加直观和灵活。PyTorch 的 API 简洁明了,易于理解和使用。

XGBoost:梯度提升冠军

XGBoost 是一个优化的分布式梯度提升库,专为提升速度和性能而设计。它在许多机器学习和数据科学比赛中表现优异,如 Kaggle 竞赛,被广泛应用于各种回归、分类和排序问题。XGBoost 具有出色的准确性,支持多种语言,易于使用,且能够处理大规模数据。对于追求模型性能和效率的开发者来说,XGBoost 是一个不可或缺的工具。

这五个库各有侧重,从 Scikit-learn 的易用性到 TensorFlow 和 PyTorch 的灵活性,再到 Keras 的快速开发和 XGBoost 的高效性能。选择适合自己的库才是最重要的。

原文地址:https://wiki-power.com/
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。

机器学习入门 - 基础流程

2024年4月18日 15:43

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》

机器学习入门 - 环境搭建

2024年4月18日 15:43

机器学习入门 - 环境搭建

Anaconda 环境

我们选择使用 Anaconda 来配置在机器学习的环境。一方面其添加了许多常用的数据科学的包如 Numpy、TensorFlow 等,也包含了它们所依赖的更多模组;另一方面它能更方便地管理和切换运行环境。用一句话说,Anaconda 就是一个一站式的数据科学编程环境。

Anaconda 的下载:https://www.anaconda.com/download

安装完成后,如何开始呢?你可以看这个官方课程,一步步入手:Get Started with Anaconda,也可也直接参考以下的简明步骤开始。

当安装完成后,可以在 Anaconda Prompt 命令行界面,输入命令 conda list 验证其安装状况以及内置的包列表。

官方推荐创建一个虚拟环境,这样如果玩坏了可以直接换一个,不必重新卸载安装:

conda create --name NEW_ENV_NAME
conda activate NEW_ENV_NAME

conda 默认的 channel 是 defaults,但这个 channel 的代码包不全,所以将其更换为 conda-forge:

conda config --add channels conda-forge

接着,在这个虚拟环境里安装一些常用的包:

conda install jupyterlab rich faker chime schedule pandas scikit-learn

最后,启动 JupyterLab:

jupyter lab

scikit-learn 机器学习工具包

接下来的文章,将使用 scikit-learn 入门机器学习。scikit-learn(sklearn)包含了分类、回归、降维、聚类等基础常用的机器学习算法,也包含了特征提取、数据处理、模型评估等模块,适合入门。

参考与致谢

机器学习入门 - 基础流程

2024年4月18日 15:43

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》

机器学习入门 - 基础流程

2024年4月18日 15:43

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》

机器学习入门 - 基础流程

2024年4月18日 15:43

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》

Homelab - 开源的远程桌面方案 RustDesk

2024年4月18日 15:43

Homelab - 开源的远程桌面方案 RustDesk

RustDesk 是一套开源的远程桌面方案,在内网可直接使用各平台的客户端进行远程,本文章主要讲解公网下如何搭建自己的服务器。

部署(Docker Compose)

首先创建 compose.yaml 文件,并粘贴以下内容:

compose.yaml
version: "3"

networks:
  rustdesk-net:
    external: false

services:
  hbbs:
    container_name: ${STACK_NAME}_hbbs
    ports:
      - 21115:21115
      - 21116:21116
      - 21116:21116/udp
      - 21118:21118
    image: rustdesk/rustdesk-server:${APP_VERSION}
    command: hbbs -r ${STACK_DOMAIN}:21117 -k _
    volumes:
      - ${STACK_DIR}/data:/root
    networks:
      - rustdesk-net
    depends_on:
      - hbbr
    restart: unless-stopped

  hbbr:
    container_name: ${STACK_NAME}_hbbr
    ports:
      - 21117:21117
      - 21119:21119
    image: rustdesk/rustdesk-server:${APP_VERSION}
    command: hbbr -k _
    volumes:
      - ${STACK_DIR}/data:/root
    networks:
      - rustdesk-net
    restart: unless-stopped

在这个 docker compose 中,编排了两个服务:

  • hbbs: RustDesk ID 注册服务器
  • hbbr: RustDesk 中继服务器

(可选)推荐在 compose.yaml 同级目录下创建 .env 文件,并自定义你的环境变量。如果不想使用环境变量的方式,也可以直接在 compose.yaml 内自定义你的参数(比如把 ${STACK_NAME} 替换为 rustdesk-server)。

.env
STACK_NAME=rustdesk-server
STACK_DIR=xxx # 自定义项目储存路径,例如 ./rustdesk-server
STACK_DOMAIN=xxx # 部署 RustDesk 服务器的域名或 IP

# rustdesk-server
APP_VERSION=latest

最后,在 compose.yaml 同级目录下执行 docker compose up -d 命令即可启动编排的容器。

配置说明

如果遇到错误 Registered email required (-m option). Please pay and register on https://rustdesk.com/server...,说明可能下载的不是最新版本的包,解决方法如下:

  1. https://hub.docker.com/r/rustdesk/rustdesk-server/tags 上找到最新版本的 DIGEST 编号(比如 83e259792b50)。
  2. 在本地使用命令 docker image pull rustdesk/rustdesk-server:latest@sha256:83e259792b50 下载最新的包,注意把最后的字符替换为你自己的。

参考与致谢

原文地址:https://wiki-power.com/
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。

Hello blog

2023年10月16日 10:30

终于,我还是给知识库加上了博客的功能。

在听了 捕蛇者说 的播客节目「个人知识管理体系系列」后,我思考了一番,发现之前倾向的单一知识库的做法,存在一些弊端:

  • 日常一些零碎的观点或想法,不适合提出来长篇大论、单独成文。
  • 知识库的文风比较正式,需要引经据典、咬文嚼字,这样一来写作的周期也会被拉长,这也削弱了零碎写作的积极性。

我希望把博客当 gist 用,简单记录一些零碎观点或想法。

如何不长痘

2023年10月16日 10:30

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。

之前小发也跟我讨论过,于是我想了想,大概是这几个原因:

  • 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。
  • 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。

一直到现在我都保持着这些做法,所以到现在也不怎么长痘。

一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

买了一台 NAS

2023年10月16日 10:30

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。

不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。

「让我的数字资产比我活得更久。」这是我的目标。

最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。

后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。

所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。

数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

不要自己感动自己

2023年10月16日 10:30

这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。 —— 于宙《我们这一代人的困惑》

该工作工作,该学习学习,该睡觉睡觉,该玩就放开玩。

关于新能源行业的一些观点

2023年10月16日 10:30

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。

在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。

其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

内卷与未来的职业趋势

2023年10月16日 10:30

经济不景气,更有利于早点去朝阳行业。

早早去站位,早早去占坑。

本科生去了,几年后,就会发现,读研的同学还没有你混的好。

内卷,是无意义的做功。

一群人在无意义的做功,我们只要找到新方向的风口,过去占位。

占位,不卷。等到占稳了位置,就会有人卷过来。

到时候门槛水涨船高,但进入的早,便能卡住位置。

熟悉历史规律,自然能够找到合理的策略。

就像是在历史上,历次大萧条后,都会出现的洗牌。

对普通人来说,这恰恰是珍贵的机会。

—— 「立华说」

RoboMaster 赛后随笔

2023年10月16日 10:30

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。

今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。

最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。

还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。

希望能一年比一年好吧。

8 月深圳小记

2024年4月6日 20:54

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。

月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。

刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。

小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。

国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。

打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。

在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。

在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的:

周末午后书店的柠檬茶和苏打水:

终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错:

有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。

8 月底,开学了,接下来该何去何从呢?
回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

当下与永恒

2023年10月16日 10:30

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。

现在人们知道,没有不散的宴席,一切都有个尽头。

—— 刘慈欣《三体 Ⅲ·死神永生》

置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。

「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。

远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗?

经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。

如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。

不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。

预祝中秋快乐~

一杯敬明天 一杯敬過往
支撐我的身體 厚重了肩膀
雖然從不相信所謂山高水長
人生苦短何必念念不忘

一杯敬自由 一杯敬死亡
寬恕我的平凡 驅散了迷惘
好吧天亮之後總是潦草離場
清醒的人最荒唐
…… —— 毛不易《消愁》

❌
❌