第一个机器学习样例《python与机器学习实战》

  • 问题:现有47个房子的面积和价格,需要建立一个模型对新的房价进行预测。
  • 数据源:http://github.com/carefree0910/MachineLearning/blob/master_Data/price.text

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

标准化的数学公式为:X=\frac{X-\overline{X}}{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、获取与处理数据

代码实现:

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

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

运行结果为:

第一个机器学习样例《python与机器学习实战》_第1张图片

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

2.选择与训练模型

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

f(x|p;n)=p_{0}x^{n}+p_{1}x^{n-1}+\cdot \cdot \cdot +p_{n-1}x+p_{n}

L(p;n)=\tfrac{1}{2}\sum_{i=1}^n[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)=\frac{1}{m}\sum_{i=1}^{m}(f(x_{i})-y_{i})^2

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

#在(-2,4,)这个区间上取100个点作为画图基础
#deg参数代表着模型参数中的n,即返回模型中的多项式的次数
#返回的模型能够输入根据输入的x0,返回预测相对应的预测的y
x0=np.linspace(-2,4,10)
def get_model(deg):
    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进行估计,要想得到一个较好的模型,原理就是使得损失函数最小。

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

结果是:

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

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

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

第一个机器学习样例《python与机器学习实战》_第2张图片

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

 

 

你可能感兴趣的:(机器学习)