机器学习周报(三)--神奇宝贝预测和分类问题

目录

摘要

本周学习了预测宝可梦cp值和分类问题,预测宝可梦cp值时通过选取适当的函数来预测输出,需要通过定义Loss Function来评估函数的好坏,并通过Gradient Descent来找到最佳的参数。如果函数过于复杂,会出现过拟合的问题,需要加入正则化来平衡模型的复杂度和准确度。分类问题以神奇宝贝分类为例,通过选取适当的函数和损失函数,以及使用算法如朴素贝叶斯,伯努利分布提升分类预测的准确性。代码部分学习了标准方程法及实战。

Abstract

This week, I learned the problem of predicting the Pokemon cp value and classification. When predicting the Pokemon cp value, appropriate functions should be selected to predict the output. Loss Function should be defined to evaluate the quality of the function and the best parameter should be found by Gradient Descent. If the function is too complex, there will be overfitting problems, and regularization will need to be added to balance the complexity and accuracy of the model. Taking Pokemon classification as an example, the classification problem improves the accuracy of classification prediction by selecting appropriate functions and loss functions, and using algorithms such as naive Bayes and Bernoulli distribution. The code part learned the standard equation method and practical practice.

一.预测神奇宝贝

1.机器学习三部走

1.1 定义model

定义一个model y=w*x^cp+b。该model中包含b,w等未知参数。不同的未知参数组成不同的function,这些function组成一个function set。

image-20230625121622568

1.2 建立损失函数

定义一个损失函数(Loss),通过将参数代入函数所得出的值,与真正的值相减求差的平方,输出的是这个函数的好坏(来衡量w、b的好坏)。

image-20230625121904298

图上颜色越偏红,代表数值越大,则这个函数越差;反之颜色越偏蓝,代表数值越小,则这个函数越好。

image-20230625122321676

1.3 得到最优的model

找到最优的w和b代入loss函数使得值最小

image-20230625122456371

Gradient Descent:假设只考虑w

  1. 随机选取一个w0
  2. 计算w=w0时的微分(求偏导得出函数斜率)如果斜率为正,则增加w值,反之斜率为负,减少w值,增加或减少w值取决于斜率的大小。
  3. 反复进行以上两个步骤。

image-20230625123036245

考虑W和b的情况下,方法相同

image-20230625123919413

根据求导法则,L对w求偏导;L对b求偏导,如下图所示。

image-20230625124402604

Gradient Descent也有不足之处,如果Loss Function如图所示,假设在随机取值的值在红色位置,那按照偏微分所求得的方向,会在第一个蓝色位置取得最佳的w、b的组合,显然这并不是最佳位置;假设在第二个红色位置随机取值,那按照偏微分所求得的方向,会取得最佳的w、b的组合。 但是在linear regression里则不用担心这个问题,因为在线性回归中,损失函数L是凸的。无局部最优。

image-20230625124823899

除了梯度下降还有标准方程法,无局部最优问题。具体方法和代码将在最后讲述。

2.How is the results?

该案例的结果如下图所示。最好的b=-188.4,w=2.7。图像中的e代表样本点与线性模型之间的距离。该模型在训练集上的平均错误率为31.9。若想得到更低的错误率,可以考虑更换更为复杂的模型。

image-20230625125718421

重新设计了一个model,变成二次式

image-20230625125838228

误差变小了,我们考虑再加一项

image-20230625125918404

随着模型越来越复杂,该模型在训练集上的正确率也越来越高。这是因为次数高的模型对次数低的模型之间是包含关系。

image-20230625130027279

但是我们发现,虽然训练数据越来越拟合,不过预测数据误差在后面项式过多时却越来越大,这种情况我们称为过拟合

image-20230625130259185

当我们提高训练集的数量,会发现之前的实验因为训练集数量过少而忽略了其他影响宝可梦cp值的因素。此时,我们开始考虑宝可梦的种类对进化后的宝可梦cp值的影响。

image-20230625130808394

改变model,加入宝可梦的种类信息,用δ函数表示种类,δ函数中的种类相同时,该函数的值为1,否则为0。这样就把该复杂的模型转化为一个线性模型。

image-20230625130935035

考虑了宝可梦种类这一因素后,在训练集和测试集上的正确率都提高了很多,如下图所示。image-20230625131043256

我们如果将更多属性加入,训练误差变得更小了,不过预测数据误差变得很大,又出现过拟合了

image-20230625131410069

拟合情况可以分为三种,欠拟合,正确拟合,过拟合

image-20230625130349753

防止过拟合方法有三种

1.减少特征

2.增加数据量

3.正则化

我们主要讲正则化

image-20230625131503999

我们加上额外的w的平方的和,再乘以一个参数。前面的平方和越小代表函数误差越小,这个model就越好,加上后面的代表我们找到的w越接近0就越好,函数就越平滑。

加入 λ \lambda λ后虽然训练误差变大了,但是预测误差明显减少了。

image-20230625131707853

当λ值越大,则代表后面一项的影响越大,函数就越平滑,Training Data上的误差值越来越大,这是因为λ值越大,越倾向考虑w的值,而导致平均误差增大。但是,在Testing Data上,在增大λ值时,平均误差会越来越小;但是当λ值超过一定数值时,反而平均误差会增大。所以函数不是越平滑越好,我们要找一个合适的λ值。(这就需要我们调整λ的值)

3.标准方程法

3.1 原理

img

化简后的标准形式如图:img

此处有另外一种方式求极值点:img

案例

image-20230625175137842

标准方程法有两种布局,我们案例使用分母布局

image-20230625175315048

image-20230625175336015

标准方程法和梯度下降法的比较

image-20230625175424002

3.2 代码实战标准方程法

知道原理后,我们要求w只需要用到x和y即可

首先导入包并且载入数据

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt  
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
plt.scatter(x_data,y_data)
plt.show()

image-20230625175842876

然后需要写计算w的函数

# 标准方程法求解回归参数
def weights(xArr, yArr):
    xMat = np.mat(xArr)
    yMat = np.mat(yArr)
    xTx = xMat.T*xMat # 矩阵乘法
    # 计算矩阵的值,如果值为0,说明该矩阵没有逆矩阵
    if np.linalg.det(xTx) == 0.0:
        print("This matrix cannot do inverse")
        return
    # xTx.I为xTx的逆矩阵
    ws = xTx.I*xMat.T*yMat
    return ws

为什么需要np.mat,因为需要将传入的数据变成矩阵,以便接下来的矩阵运算,如果没转换为矩阵的话,直接进行矩阵运算,结果是按位相乘。

需要给样本添加偏置项

X_data = np.concatenate((np.ones((100,1)),x_data),axis=1)

其中concatenate是合并函数,axis代表合并的方向。

最后输出结果

ws = weights(X_data,y_data)
# 画图
x_test = np.array([[20],[80]])
y_test = ws[0] + x_test*ws[1]
plt.plot(x_data, y_data, 'b.')
plt.plot(x_test, y_test, 'r')
plt.show()

image-20230625180713110

二.宝可梦分类问题

1.案例

神奇宝贝有如图18种属性:水、电、火等等,现在找出一个函数,输入是一只Pokemon,输出的是这只Pokemon属 于哪一种属性。如输入的是皮卡丘,输出的是雷;输入的是杰尼龟,输出的是水;输入的是妙娃草,输出的是草。image-20230625181359649

一只Pokemon的整体强度、生命值、攻击力、防御力、特殊攻击力、特殊防御力、速度可以用数字所表示。image-20230625181432088

假设现在的model是 y = b + w1x1 + w2x2,输入x1、x2,蓝色是class1,红色是class2。如果用Regression的方式,蓝色越接近1越好,红色越接近-1越好。分界线为绿色的直线。但是如果有远大于1的点,对于回归模型,它需要减少该点到模型的距离,就会将绿线顺时针旋转,来减少这些点所带来的error。

image-20230625210720087

所以,Regression定义model好坏的定义方式对classification来说是不适用的,下面介绍适用的方法。

理想的方法:Function:找一个函数,将值代入,如果大于0,输出class 1,否则输出class 2。Loss Function:在Training data 上所得到的错误的次数,错误的次数越小代表model越好。

image-20230625210921218

image-20230625211101165

在这个盒子中,我们使用贝叶斯公式在训练集中分别估算P(c1),P(c2),P(x|c1),P(x|c2)的值。

image-20230625211249326

回到宝可梦问题,计算P(C1)、P(C2):现在只考虑二元分类,把id小于400的水系、一般系的来当做Training data,有79只水系,61只一般系。image-20230625211509679

现在给一只海龟,求这只海龟是从水系中挑出来的概率。这只海龟不属于这79只当中。但是这只海龟是水系的。不能说这个概率就是0,可以假设这79只Pokemon只是水系Pokemon的冰山一角。假设这79个点是从Gaussian distribution中找到的。

image-20230625211705563

2.Gaussian distribution:

高斯分布由期望μ 和协方差矩阵∑决定。μ 决定高斯分布的最高点位置,∑决定高斯分布的范围,利用极大似然函数来计算最优的期望μ 和协方差矩阵∑
image-20230625212112065

通过穷举μ 和∑,也可以通过微分取极值,可以得到最优解

image-20230625212420426

3.对Generative model的优化

3.1未优化时

未优化时,预测概率为47%

image-20230625212856693

我们如果把七个特征都加入,预测概率为54%,还是非常低

image-20230625212959910

3.2优化

我们给两组数据不同∑和μ,这在实际中是不常用的,如果我们给他们相同的 μ,那么L将会变成

image-20230625215703884

预测结果

image-20230625215714526

3.3简化

我们可以可以把P(C1|x)简化:

image-20230625215721157

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值