Machine Learining —— Regression:Case Study

问题导入:预测宝可梦的CP值

Estimating teh Combat Power(CP) of a pokemon after evolution
根据已有的宝可梦进化前后的信息,来预测某只宝可梦进化后的CP值大小

一、确定Senario、Task and Model

1、Senario

首先根据已有的data来确定Senario,已有一批宝可梦进化前后CP值的数据,input是进化前宝可梦的各种属性,output是进化后宝可梦的CP值;因此我们的data是labeled,使用的Senario是supervised Learning

2 、Task

根据我们想要的function的输出类型来确定Task,我们预期得到的是宝可梦进化后的CP值,是一个scalar,因此使用的Task是Regression

3、Model

关于Model的选择很多,这里采用的是Non-linear Model

4、设定参数

X X X:    表示一直宝可梦,用下标表示其属性
X c p X_{cp} Xcp:   表示宝可梦进化前的CP值
X s X_s Xs:    表示宝可梦的物种
X h p X_{hp} Xhp:  表示宝可梦的生命值
X w X_w Xw:  表示宝可梦重量
X h X_h Xh:   表示宝可梦高度
f ( ) f() f():     表示function
y y y:   表示function的output
在这里插入图片描述

二、Regression的具体步骤

1、明确Machine Learning的三个步骤:

  • 定义一个model即function set
  • 定义一个损失函数Loss评估goodness of function
  • 找到一个最好的function
Step1:Model(function set)

凭经验选择最初的function

Linear Model 线性模型

y = b + w ⋅ X c p y = b + w \cdot X_{cp} y=b+wXcp
y y y代表进化后的CP值, w w w b b b代表未知参数

根据不同的w和b,可以确定不同的无穷的function, y = b + w ⋅ X c p y = b + w \cdot X_{cp} y=b+wXcp是抽象出来的model,是具体化的function的集合,即function set

可将Linear Model扩展为不仅包括CP值:
y = b + Σ w i x i y = b +\Sigma w_ix_i y=b+Σwixi
x i x_i xi: An attribute of input X, called featrue(特征值)
w i w_i wi:weight of x i x_i xi
b b b: bias
在这里插入图片描述

Step2:Goodness of Function
参数说明

x i x^i xi:表示第i个宝可梦
y ^ i \widehat{y}^i y i:用 y ^ \widehat{y} y 表示实际观察到的object输出,上标为i表示第i个object
:由于Regression的输出值是scalar,因此 y ^ \widehat{y} y 里并没有component;但是之后若考虑structured Learning 时,output的object可能是有structured的,所以还是会需要用上下标表示一完整的output的object和其包含的component
在这里插入图片描述

Loss function 损失函数

为衡量function set中的某个function的好坏,需要一个Loss function,简称L,即function的function
L ( f ) = L ( w , b ) L(f) = L(w, b) L(f)=L(w,b)
input: a function
output: how bad/good it is

由于 f : y = b + w ⋅ X c p f : y = b + w \cdot X_{cp} f:y=b+wXcp , 即f是由w和b决定的,因此Loss function实际上是在衡量一组参数的好坏

Loss function的选择
最常用的方法是采用类似于方差和的形式来评估,即预测值与真实值差的平方和(Estimate error)
L ( f ) = L ( w , b ) = Σ n = 1 10 ( y ^ n − ( b + w ⋅ x c p n ) ) 2 L(f) = L(w, b)=\Sigma_{n=1}^{10}(\widehat{y}^n-(b +w\cdot x_{cp}^n))^2 L(f)=L(w,b)=Σn=110(y n(b+wxcpn))2
若是 L ( f ) L(f) L(f)越大,说明function表现越不好
在这里插入图片描述

Loss function可视化

下图是Loss function的可视化,图中每一点代表一组(w,b)对应一个function,而该点的颜色对应着loss function的结果L(w,b),颜色越偏红色代表function表现越不好,越偏蓝色代表Loss值越小
在这里插入图片描述

Step3:Pick the Best Function

选择最好的function:
f ∗ = a r g m i n f L ( f ) f^*=\mathop{argmin}\limits_f L(f) f=fargminL(f),或者
w ∗ , b ∗ = a r g m i n w , b L ( w , b ) = a r g m i n w , b Σ n = 1 10 ( y ^ n − ( b + w ⋅ x c p n ) ) 2 w^*,b^*=\mathop{argmin}\limits_{w,b} L(w,b)=\mathop{argmin}\limits_{w,b}\Sigma_{n=1}^{10}(\widehat{y}^n-(b +w\cdot x_{cp}^n))^2 w,b=w,bargminL(w,b)=w,bargminΣn=110(y n(b+wxcpn))2
在这里插入图片描述
为找到Best function,利用线性代数的知识,采用Gradient descent(梯度下降法)

Gradient Descent(梯度下降法)

gradient descent的优点在于,只要L(f)可微分,都可以用梯度下降法处理f,找到合适的parameters

单个参数时

以只带单个参数w的L(w)为例,首先要保证L(w)是可微的,实际上就是寻找L(w)斜率为0的global minima(有些函数也存在local minima)

  • 首先随机选取一个初始的点 w 0 w^0 w0
  • 计算 L L L w = w 0 w= w^0 w=w0位置的微分,即 d L d w \frac{\mathrm{d} L }{\mathrm{d} {w}} dwdL ∣ w = w 0 |_{w= w_0} w=w0
  • 如果斜率是negative负的,那么就应该增大w;如果斜率是positive正的,就应该减小w。每一步的步长step size的就是w的改变量
    step size的取值
    ①微分值 d L d w \frac{\mathrm{d} L }{\mathrm{d} {w}} dwdL的大小:微分值越大说明处在一个越陡峭的地方,那么移动的步长应该越大,反之越小
    η \eta η学习率(learning rate):如果 η \eta η越大,每移动一步,参数w的更新幅度就越大,反之越小
  • 每次参数更新的大小为 η d L d w \eta\frac{\mathrm{d}L}{\mathrm{d}w} ηdwdL,为了满足斜率为负时w向增大方向移动,斜率为正时w向减小方向移动,应当是原来的w减去更新的数值,即
    w 1 = w 0 − η d L d w w^1 = w^0-\eta\frac{\mathrm{d}L}{\mathrm{d}w} w1=w0ηdwdL ∣ w = w 0 |_{w= w_0} w=w0
    w 2 = w 1 − η d L d w w^2 = w^1-\eta\frac{\mathrm{d}L}{\mathrm{d}w} w2=w1ηdwdL ∣ w = w 1 |_{w= w_1} w=w1
    w 3 = w 2 − η d L d w w^3 = w^2-\eta\frac{\mathrm{d}L}{\mathrm{d}w} w3=w2ηdwdL ∣ w = w 2 |_{w= w_2} w=w2
    i f   d L d w if  \frac{\mathrm{d}L}{\mathrm{d}w} if dwdL ∣ w = w i = = 0 |_{w= w_i}== 0 w=wi==0
    t h e n then then s t o p stop stop
    此时的 w i w_i wi对应的斜率为0,当微分为0时,参数就不再更新,但是此时通过Gradient descent找出来solution其实并不一定是global minima
    但是在linear regression上,没有local minima
    在这里插入图片描述
多个参数时

关于宝可梦的问题,是包含two parameters的问题,即 ( w ∗ , b ∗ ) = a r g m i n w , b L ( w , b ) (w^*,b^*)=\mathop{argmin}\limits_{w,b}L(w,b) (w,b)=w,bargminL(w,b)

  • 首先随机选取两个初始值 w 0 , b 0 w^0,b^0 w0,b0
  • 然后分别计算( w 0 , b 0 w^0,b^0 w0,b0)点处的偏微分,即
  • ∂ L ∂ w \frac{\partial L}{\partial w} wL ∣ w = w 0 |_{w=w_0} w=w0, ∂ L ∂ b \frac{\partial L}{\partial b} bL ∣ b = b 0 |_{b=b_0} b=b0
  • 更新参数
    w 1 = w 0 − η ∂ L ∂ w w^1 = w^0-\eta\frac{\partial L}{\partial w} w1=w0ηwL ∣ w = w 0 , b = b 0 |_{w= w_0,b=b_0} w=w0,b=b0 b 1 = b 0 − η ∂ L ∂ b b^1 = b^0-\eta\frac{\partial L}{\partial b} b1=b0ηbL ∣ w = w 0 , b = b 0 |_{w= w_0,b=b_0} w=w0,b=b0
    w 2 = w 1 − η ∂ L ∂ w w^2 = w^1-\eta\frac{\partial L}{\partial w} w2=w1ηwL ∣ w = w 1 , b = b 1 |_{w= w_1,b=b_1} w=w1,b=b1 b 2 = b 1 − η ∂ L ∂ b b^2 = b^1-\eta\frac{\partial L}{\partial b} b2=b1ηbL ∣ w = w 1 , b = b 1 |_{w= w_1,b=b_1} w=w1,b=b1
    w 3 = w 2 − η ∂ L ∂ w w^3 = w^2-\eta\frac{\partial L}{\partial w} w3=w2ηwL ∣ w = w 2 , b = b 2 |_{w= w_2,b=b_2} w=w2,b=b2 b 3 = b 2 − η ∂ L ∂ b b^3 = b^2-\eta\frac{\partial L}{\partial b} b3=b2ηbL ∣ w = w 2 , b = b 2 |_{w= w_2,b=b_2} w=w2,b=b2

可视化效果如图
在这里插入图片描述
每次计算得到的梯度gradient,即由 ∂ L ∂ w \frac{\partial L}{\partial w} wL ∂ L ∂ b \frac{\partial L}{\partial b} bL组成的vector向量,就是图上等高线的法线方向;而( − η ∂ L ∂ w -\eta\frac{\partial L}{\partial w} ηwL, − η ∂ L ∂ b -\eta\frac{\partial L}{\partial b} ηbL)的作用就是让原先的( w i , b i w^i,b^i wi,bi)朝着gradient的方向前进,其中 η \eta η的作用是每次更新的跨度
:这里两个方向的 η \eta η必须保持一致,这样每次更新坐标的step size是等比缩放的,保证前进的方向始终和梯度下降的方向一致,否则坐标前进的方向将会发生偏移

在linear regression里,loss function是convex的(凸函数),没有local optimal局部最优解,只有global optimal

三、Pokemon问题

根据gradient descent,计算得到 y = b + w ⋅ x c p y = b+w\cdot x_{cp} y=b+wxcp中最好的参数是b=-188.4,w=2.7
接着将training data中每一只宝可梦i进化后的CP值与预测值之差的绝对值称为 e i e^i ei,而这些误差之和Average Error on Training Data is Σ i = 1 10 e i = 31.9 \Sigma_{i=1}^{10}e^i=31.9 Σi=110ei=31.9
用这个function应用在generalization的case中,于是有抓了10只新的pokemon,算出Average Error on Testing Data is Σ i = 1 10 e i = 35 \Sigma_{i=1}^{10}e^i=35 Σi=110ei=35
在这里插入图片描述

How can we do better

重新设计Model

考虑 ( x c p ) 2 (x_{cp})^2 (xcp)2的model

在这里插入图片描述

考虑 ( x c p ) 3 (x_{cp})^3 (xcp)3的model

在这里插入图片描述

考虑 ( x c p ) 4 (x_{cp})^4 (xcp)4的model

在这里插入图片描述

考虑 ( x c p ) 5 (x_{cp})^5 (xcp)5的model

在这里插入图片描述
这5个model在training data的表现 ( x c p ) i (x_{cp})^i (xcp)i的高次项的增加,对应的average error会不断减小
在这里插入图片描述
在training data上,model越复杂,error就会越低;但是在testing data上,model复杂到一定程度后,error非但不会减小,反而会暴增,通常被称为overfitting(过拟合)
在这里插入图片描述

进一步讨论其他参数

物种 x s x_s xs的影响

除CP值外,还可能受到物种 x s x_s xs的影响
在这里插入图片描述
于是需要重现设计model:
i f x s = p i d g e y : if \quad x_s = pidgey: ifxs=pidgey:      y = b 1 + w 1 ⋅ x c p y = b_1+w_1\cdot x_{cp} y=b1+w1xcp
i f x s = W e e d l e : if \quad x_s = Weedle: ifxs=Weedle:     y = b 2 + w 2 ⋅ x c p y = b_2+w_2\cdot x_{cp} y=b2+w2xcp
i f x s = C a t e r p i e : if \quad x_s = Caterpie: ifxs=Caterpie:     y = b 3 + w 3 ⋅ x c p y = b_3+w_3\cdot x_{cp} y=b3+w3xcp
i f x s = E e v e e : if \quad x_s = Eevee: ifxs=Eevee:      y = b 4 + w 4 ⋅ x c p y = b_4+w_4\cdot x_{cp} y=b4+w4xcp
将上面的if语句合并linear model:
在这里插入图片描述
利用新的model,分别得到在training data和testing data上测试的结果:在这里插入图片描述

HP值 x h p x_{hp} xhp、height值 x h x_h xh、weight值 x w x_w xw的影响

考虑所有的可能影响参数,设计出更为复杂的model:
i f x s = p i d g e y : if \quad x_s = pidgey: ifxs=pidgey:      y = b 1 + w 1 ⋅ x c p + w 5 ⋅ ( x c p ) 2 y = b_1+w_1\cdot x_{cp}+ w_5\cdot(x_{cp})^2 y=b1+w1xcp+w5(xcp)2
i f x s = W e e d l e : if \quad x_s = Weedle: ifxs=Weedle:     y = b 2 + w 2 ⋅ x c p + w 6 ⋅ ( x c p ) 2 y = b_2+w_2\cdot x_{cp}+ w_6\cdot(x_{cp})^2 y=b2+w2xcp+w6(xcp)2
i f x s = C a t e r p i e : if \quad x_s = Caterpie: ifxs=Caterpie:     y = b 3 + w 3 ⋅ x c p + w 7 ⋅ ( x c p ) 2 y = b_3+w_3\cdot x_{cp}+ w_7\cdot(x_{cp})^2 y=b3+w3xcp+w7(xcp)2
i f x s = E e v e e : if \quad x_s = Eevee: ifxs=Eevee:      y = b 4 + w 4 ⋅ x c p + w 8 ⋅ ( x c p ) 2 y = b_4+w_4\cdot x_{cp}+ w_8\cdot(x_{cp})^2 y=b4+w4xcp+w8(xcp)2
y = y ' + w 9 ⋅ x h p + w 10 ⋅ ( x h p ) 2 + w 11 ⋅ x h + w 12 ⋅ ( x h ) 2 + w 13 ⋅ x w + w 14 ⋅ ( x w ) 2 y = y^'+w_9\cdot x_{hp}+w_{10}\cdot (x_{hp})^2+w_{11}\cdot x_{h}+w_{12}\cdot (x_{h})^2+w_{13}\cdot x_{w}+w_{14}\cdot (x_{w})^2 y=y+w9xhp+w10(xhp)2+w11xh+w12(xh)2+w13xw+w14(xw)2
算出的training error = 1.9,但是testing data = 102.3,发生了overfitting

利用regularization解决overfitting(L2正则化解决过拟合问题)

regularization可以使曲线变得更加smooth

原来的loss function 只考虑了prediction error;而regularization则是在原来的loss function的基础上加上一项 λ Σ ( w i ) 2 \lambda\Sigma(w_i)^2 λΣ(wi)2,把这个model里面所有的 w i w_i wi的平方和用 λ \lambda λ 加权,也就是说,我们期待 w i w_i wi越小甚至接近于0的function
因为参数值接近0的function,是比较平滑的,当input有变化时,output对输入的变化比较不敏感
在这里插入图片描述
此处的 λ \lambda λ需要手动进行调整
λ \lambda λ值越大代表考虑smooth的那个regularization那一项影响越大,function越平滑
在这里插入图片描述
:我们期待比较平滑的function,因为它对noise不那么sensitive;但是function太平滑的话就失去了对data的拟合能力;而function的平滑程度,需要通过调整 λ \lambda λ来决定

Conclusion总结

关于pokemon的CP值预测流程:

  • 根据已有的data的特点,确定使用supervised learning(监督学习)
  • 根据output的特点,确定使用regression(回归)
  • 考虑包括进化前CP值、species、hp等各方面变量属性已经高次项的影响,model采用更为复杂的一次项和二次型之和形式
    为了保证function的平滑性,loss function应使用regularization即
    L = Σ i = 1 n ( y ^ i − y i ) 2 + λ Σ j ( w j ) 2 L= \Sigma_{i=1}^n(\widehat{y}^i-y^i)^2+\lambda\mathop{\Sigma}\limits_j(w_j)^2 L=Σi=1n(y iyi)2+λjΣ(wj)2
  • 利用gradient descent对regularization版本的loss function进行梯度下降迭代处理
    假设所有的参数合成一个vector: [ w 0 , w 1 , w 2 , . . . , w j , . . . , b ] T [w_0,w_1,w_2,...,w_j,...,b]^T [w0,w1,w2,...,wj,...,b]T,那么每次梯度下降的表达式为:
    梯 度 : ∇ L = [ ∂ L ∂ w 0 ∂ L ∂ w 1 ∂ L ∂ w 2 ⋮ ∂ L ∂ w j ⋮ ∂ L ∂ b ] g r a d i e n t g r a d i e n t d e s c e n t = [ w 0 ' w 1 ' w 2 ' ⋮ w j ' ⋮ b ' ] L = L ' = [ w 0 w 1 w 2 ⋮ w j ⋮ b ] L = L 0 − η [ ∂ L ∂ w 0 ∂ L ∂ w 1 ∂ L ∂ w 2 ⋮ ∂ L ∂ w j ⋮ ∂ L ∂ b ] L = L 0 梯度:\nabla L= \begin{bmatrix} \frac{\partial L}{\partial w_0} \\ \frac{\partial L}{\partial w_1} \\ \frac{\partial L}{\partial w_2} \\ \vdots \\ \frac{\partial L}{\partial w_j} \\ \vdots \\ \frac{\partial L}{\partial b} \\ \end{bmatrix} _{gradient} \quad gradient descent = \begin{bmatrix} w_0^' \\ w_1^' \\ w_2^' \\ \vdots \\ w_j^' \\ \vdots \\ b^' \\ \end{bmatrix} _{L=L^'} \quad = \begin{bmatrix} w_0 \\ w_1 \\ w_2 \\ \vdots \\ w_j \\ \vdots \\ b \\ \end{bmatrix} _{L=L_0} \quad - \eta \begin{bmatrix} \frac{\partial L}{\partial w_0} \\ \frac{\partial L}{\partial w_1} \\ \frac{\partial L}{\partial w_2} \\ \vdots \\ \frac{\partial L}{\partial w_j} \\ \vdots \\ \frac{\partial L}{\partial b} \\ \end{bmatrix} _{L=L_0} L=w0Lw1Lw2LwjLbLgradientgradientdescent=w0w1w2wjbL=L=w0w1w2wjbL=L0ηw0Lw1Lw2LwjLbLL=L0
  • λ \lambda λ 需要我们不断调整来获取
    先设定 λ \lambda λ -->确定loss function -->找到使loss最小的 [ w 0 , w 1 , w 2 , . . . , w j , . . . , b ] T [w_0,w_1,w_2,...,w_j,...,b]^T [w0,w1,w2,...,wj,...,b]T -->确定function -->计算error -->重新设定 λ \lambda λ重复上述步骤 -->使testing data上的error最小的 λ \lambda λ所对应的 [ w 0 , w 1 , w 2 , . . . , w j , . . . , b ] T [w_0,w_1,w_2,...,w_j,...,b]^T [w0,w1,w2,...,wj,...,b]T对应的function就是最佳function

参考原链接:link
https://github.com/Sakura-gh/ML-notes

代码import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import LinearRegression def pred_house_price(): plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['font.size'] = 12 y = np.asarray([6450, 7450, 8450, 9450, 11450, 15450, 18450]) x = np.asarray([150, 200, 250, 300, 350, 400, 600] ) plt.xlabel('面积(平方英尺)') plt.ylabel('售价(美元)') clf = LinearRegression() x = x.reshape(len(x), 1)#①为什么要调整维度? clf.fit(x, y) pre = clf.predict(x) plt.scatter(x, y, s=50) #②散点图,什么数据? plt.plot(x, pre, 'r-', linewidth=2)#③ 直线,什么数据? plt.show()报错:Traceback (most recent call last): File "C:\Users\Administrator\PycharmProjects\pythonProject1\exp4.1.py", line 21, in <module> boston = datasets.load_boston() ^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Administrator\anaconda3\Lib\site-packages\sklearn\datasets\__init__.py", line 157, in __getattr__ raise ImportError(msg) ImportError: `load_boston` has been removed from scikit-learn since version 1.2. The Boston housing prices dataset has an ethical problem: as investigated in [1], the authors of this dataset engineered a non-invertible variable "B" assuming that racial self-segregation had a positive impact on house prices [2]. Furthermore the goal of the research that led to the creation of this dataset was to study the impact of air quality but it did not give adequate demonstration of the validity of this assumption. The scikit-learn maintainers therefore strongly discourage the use of this dataset unless the purpose of the code is to study and educate about ethical issues in data science and machine learning. In this special case, you can fetch the dataset from the original source:: import pandas as pd import numpy as np data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None) data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target = raw_df.values[1::2, 2] Alternative datasets include the California housing dataset and the Ames housing dataset. You can load the datasets as follows:: from sklearn.datasets import fetch_california_housing housing = fetch_california_housing() for the California housing dataset and:: from sklearn.datasets import fetch_openml housing = fetch_openml(name="house_prices", as_frame=True) for the Ames housing dataset. [1] M Carlisle. "Racist data destruction?" <https://medium.com/@docintangible/racist-data-destruction-113e3eff54a8> [2] Harrison Jr, David, and Daniel L. Rubinfeld. "Hedonic housing prices and the demand for clean air." Journal of environmental economics and management 5.1 (1978): 81-102. <https://www.researchgate.net/publication/4974606_Hedonic_housing_prices_and_the_demand_for_clean_air>
最新发布
03-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值