用决策树模型解决实际问题

在数据科学的领域中,决策树模型是一种非常强大且易于理解的工具。对于初学者来说,理解和运用决策树模型来解决实际问题是一个有趣且富有收获的过程。

那么,如何用决策树模型来解决实际问题呢?

用机器学习模型解决实际问题通常分为这样几步:

  1. 对问题建模:将实际问题转化为一个机器学习建模的问题,比如变成一个分类问题
  2. 收集数据:收集特征和标签数据
  3. 建模:用收集的数据训练模型,并调优参数,找到最佳的模型
  4. 部署上线:部署到生产环境,或者集成到其他应用里面

下面我们通过3个不同领域的案例来学习如何将实际问题转化为机器学习建模的问题,然后使用决策树模型来做预测。

人脸识别

设想你现在要做一个手机App,用于人脸识别。打开摄像头拍张照片,然后App就可以识别出这个人的名字叫什么。

如果你想做一个App识别全国的人,那么可能比较困难,所以我们暂且把这个App限定为识别家里的人,假设家里有4个人,你,你对象,你爸,你妈。

第一步,我们先对问题建模,把这个问题转化为机器学习问题。建模有2个基本要素:

  • 问题类别:根据上面的描述,我们可以将这个人脸识别问题建模成一个分类问题,类别有4个。
  • 输入输出:我们的输入是一张图片,输出是一个人名。

第二步,收集数据。这一步你就需要去拍很多家人的照片,然后给每张照片打上标,标识是哪个人。比如,你可以将照片存储到一个文件夹下,命名为img_xxx.<label>.jpg。其中<label>代表类别,可以分别用数字0,1,2,3 代表4个类别。

第三步,建模。

从之前的学习中,我们知道,模型输入的每一条样本,是包含多个特征的向量。比如iris数据集,一条样本是一个4维向量,每一维分别代表一个属性。

那么图片怎么转化为向量呢?这里我们学习下图片在计算机中的标识。

一张图片是由多个像素组成,下图是一个眼镜的图片,每个格子是一个像素。在正常的三原色显色系统中,每个像素是由3个数值表示的,分别代表RGB的亮度值。

这样一张图片可以用N个像素表示,每个像素用3个数表示,那么一张图片就可以用3N个数字来表示了。

换句话说,一张图片就可以转化为3N维的向量!

由于机器学习模型输入要求是相同的维度向量,所以我们需要让数据集合中的每张图片像素一样多。这可以通过图像的尺寸调整来实现。

下面是用PIL从文件中读取图片数据,并转化为向量的代码示例:

from PIL import Image
import numpy as np

size = (128, 128)
def load_image( infilename ) :
    img = Image.open( infilename )
    img.load()
    # 将图像转化为 128x128 像素
    im.thumbnail(size, Image.Resampling.LANCZOS)
    # 将图像转化为向量
    data = np.asarray( img, dtype="int32" )
    return data

import glob
data = []
label = []
for name in glob.glob('*.jpg'):
    x = load_image(name)
    y = int(name.split('.')[-2])  # 从文件名中提取标签信息
    data.append(x)
    label.append(y)

# 转化成numpy矩阵,以便在sklearn中使用
X = np.array(data)
y = np.array(y)

接下来,就可以用决策树模型来建模了!非常简单,就像前面的教程那样,调用sklearn的软件包即可!

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(X, y)

你还可以利用前面学到的网格搜索来寻找最优参数,找到效果最佳的模型。

第四步:部署上线。

我们有了模型后,需要将模型集成到App里,这样App调用摄像头拍完照片后,就可以立即预测出照片对应的人是谁。

通常的部署有两种方法,一种是将决策树模型预测的方法从app开发的语言重写一遍。另一种是部署成一个服务,app中用接口调用。

限于篇幅,这里我们不再展开,读者可以自行查阅相关资料,完成自己的开发工作。

天气预报

假设你想做一个天气预报的APP,你发现今天的天气跟过去一周的天气有某种关联关系。比如,如果过去一周都是晴天,那么今天大概率是晴天。

那么,你也可以用机器学习模型来实现这个APP的天气预测功能。

第一步:问题建模。将天气预报建模成一个分类问题,用过去一年的天气数据,预测明天是 下雨,晴天,还是阴天。这是一个3分类问题。

输入是一个城市过去一年的天气历史,输出是明天的天气是下雨,晴天还是阴天。

第二步:收集数据。你需要收集全国每个城市过去一年的天气历史。

第三步:建模。

每条样本的特征是过去365天的天气情况,是一个365维的向量。向量的每一维取值是{0, 1, 2} 中的一个,分别代表当天天气是下雨,晴天,或阴天。

标签也是{0, 1, 2} 中的一个,代表明天是什么天气类型。由于明天的天气拿不到,所以可以用数据中最后一天天气做标签,而从倒数第二天到之前的364天当特征。

然后调用决策树模型吧!

第四步:部署上线。跟人脸识别类似。

推荐系统

在当今信息爆炸的时代,新闻推荐系统成为了帮助我们从海量资讯中快速获取感兴趣内容的重要工具。以新闻推荐系统为例,其构建通常可以分为以下四个关键步骤。

第一步:问题建模

推荐系统常常被建模成点击率预估问题,这本质上是一个二分类问题。我们用 0 来代表用户不点某篇文章,用 1 代表点击某篇文章。通过这样的方式,将用户的点击行为转化为可量化和可预测的数值,为后续的分析和建模奠定基础。

第二步:收集数据

为了使推荐系统能够准确了解用户的兴趣和偏好,需要收集丰富的信息。在 APP 上,对于每次新闻的曝光,要收集用户的性别、年龄等基本信息,同时也要记录用户过去一段时间内所看过的新闻类别。此外,当前曝光的文章 ID 也是至关重要的。这些数据如同拼图的碎片,拼凑出了用户的兴趣图谱。

第三步:建模

接下来,将一次曝光的用户信息和文章信息转化为一个向量。例如,性别可以用 0 和 1 进行编码,年龄直接用数字表示;过去看过的新闻可以用新闻的类别 ID 来体现,我们可以用向量的其中5维存放用户过去一段时间看过最多的5个文章类别ID;当前文章则直接用文章的 ID 表示,也可以加上文章的类别ID当做向量其中的一维。然后,将这些处理好的向量输入到决策树分类模型中。决策树模型会根据这些特征进行学习和判断,预测用户是否会惦记当前文章。

与其他模型不一样的是,推荐系统通常不会使用模型预测出来的类别,而是预测出来的概率。

怎么理解模型预测的概率呢?我们知道,决策树叶子节点可以知道每个类别的样本数,假设某个叶子节点的标签为0和1的样本分别是A和B,那么我们知道1的占比就是 B/(A+B)。因为1代表用户会看这篇文章,所以,我们将标签1的比例当做用户会看这篇文章的概率,通常也叫点击率

在最终给用户推荐文章时,我们用模型对所有文章计算这个点击率,并根据点击率从高到低排序,选出TOP N篇文章推荐给用户即可!

这就是一个完整的推荐系统了!

第四步:部署上线

最后一步是将训练好的模型部署成一个服务,以供后端调用。当用户打开 APP 时,系统会迅速获取用户的相关信息,通过调用已部署的模型进行计算和预测,实时为用户推荐可能感兴趣的新闻。

通过这四个步骤,新闻推荐系统能够在用户与海量新闻之间架起一座精准匹配的桥梁,为用户带来个性化、高效的新闻阅读体验。

动手试试

选择一个自己工作中或者能方便收集到数据的任务,用决策树模型构建一个机器学习应用吧!

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x