当前位置:   article > 正文

第一个机器学习样例《python与机器学习实战》_python与机器学习实践(何宇健)

python与机器学习实践(何宇健)
  • 问题:现有47个房子的面积和价格,需要建立一个模型对新的房价进行预测。
  • 数据源:http://github.com/carefree0910/MachineLearning/blob/master_Data/price.text

该数据集比较简单,但是数据相当的大。保留他原始形式是有必要的。我们通过数据标准化处理对他做简单的处理以降低问题的复杂度

标准化的数学公式为:X=XX¯std(X)

数据规范化详见这个博主的:https://blog.csdn.net/weixin_38706928/article/details/80329563

我使用的jupyter notebook编译器(数据导入jupyter notebook有两种方法,一种是直接在notebook就新建一个txt文本直接复制粘贴就好,第二种是通过本地文档上传文件详见:http://www.cnblogs.com/annage/p/9430394.html

1、获取与处理数据

代码实现:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x,y=[], []
  4. for sample in open('prices.txt','r'):
  5.     _x,_y=sample.split(',')#由于文件是用逗号个开的,所以调用split方法并将逗号作为参数传入。
  6.     x.append(float(_x))
  7.     y.append(float(_y))
  8. x,y=np.array(x),np.array(y)
  9. x=(x-x.mean())/x.std()
  10. plt.figure()
  11. plt.scatter(x,y,c='g',s=6)
  12. plt.show()

split用法详见:https://blog.csdn.net/meccaendless/article/details/78027012

运行结果为:

这就是第一步:数据预处理

2.选择与训练模型

通过目测,我们选择线性回归方程中的多项式拟合来得到结果,模型数序表达式如下:

f(x|p;n)=p0xn+p1xn1++pn1x+pn

L(p;n)=12i=1n[f(x|p;n)y]2

其中f(x|p;n)是我们多项式模型,p、n都是模型的参数,

L(p;n)是模型损失函数,采用了常见的平方损失函数。常用损失函数的小结:https://blog.csdn.net/zhangjunp3/article/details/80467350

这里我做一个改进将损失函数改为常用均方误差的损失函数

E(f;D)=1mi=1m(f(xi)yi)2

对于大多数的机器学习算法,所谓的训练就是使得某个损失函数最小的过程。

  1. #在(-2,4,)这个区间上取100个点作为画图基础
  2. #deg参数代表着模型参数中的n,即返回模型中的多项式的次数
  3. #返回的模型能够输入根据输入的x0,返回预测相对应的预测的y
  4. x0=np.linspace(-2,4,10)
  5. def get_model(deg):
  6. return lambda input_x=x0:np.polyval(np.polyfit(x,y,deg),input_x)

polyfit(x,y,deg)就是多项式的拟合函数,返回最小参数的p,即多项式的各项系数

polyval(p,x):就是返回多项式y的值

3.评估和可视化

为了简单,采用n=1,4,10进行估计,要想得到一个较好的模型,原理就是使得损失函数最小。

  1. #根据参数n,输入的x、y返回相对应的损失
  2. def get_cost(deg,input_x,input_y):
  3. return 1/input_x.size*((get_model(deg)(input_x)-input_y)**2).sum()
  4. test_set=(1,4,10)
  5. for d in test_set:
  6. #输出相应的损失
  7. print(get_cost(d,x,y))

结果是:

n=1:  4116265480.8660836
n=4:  4004783261.3479757
n=10: 3228716880.003951

可以看出n=10优于其他参数。

  1. #画出相应的图像
  2. plt.scatter(x,y,c='g',s=20)
  3. for d in test_set:
  4. plt.plot(x0,get_model(d)(),label="degree={}".format(d))
  5. #将坐标轴限制在一定的范围内
  6. plt.xlim(-2,4)
  7. plt.ylim(15,8e5)
  8. plt.legend()
  9. plt.show()

但我们可以从图中看出n=4时已经出现过拟合的现象。n=10就非常不合理了

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/290290
推荐阅读
相关标签
  

闽ICP备14008679号