Python机器学习实践(一)多项式拟合(简单房价预测)

Python机器学习 学习笔记与实践
环境:win10 + Anaconda3.8

例子一 源自《Python与机器学习实战》—何宇健

任务:现有47个房子的面积和价格,需要建立一个模型对房价进行预测。

1、获取和处理数据

房子的面积与价格对应的数据点击下面获得:
点击此处获取

导入库,并读取文本文件的数据:

import numpy as np
import matplotlib.pyplot as plt
#读取房子面积和对应的价格数据
x,y=[],[]
for sample in open("此处为数据文本文件路径","r"):
    #文本文件中数据用“,”隔开,故向_x,_y传入数据时引入split函数
    _x,_y=sample.split(",")
    #采用append方法将转换为float类型的_x,_y赋值给x,y
    x.append(float(_x))
    y.append(float(_y))
#将x,y转换为Numpy数组
x,y=np.array(x),np.array(y)
#将x标准化
x=(x-x.mean())/x.std()

(1)由于x,y的数据类型是List,故在保存简单的数值型数据时,处理不够高效,因此将其转换为Numpy数组。

(2)保留x的原始值也是可以的,但标准化后可以降低问题的复杂度。x标准化公式为:(x-x平均值)/ x的标准差

(3)在此也可以选择观察散点图,观察后发现数据很可能有线性关系,因此下面模型采用线性回归的多项式拟合。

2、多项式拟合

#利用linspace函数,产生-2到4之间的等间隔100个数
x0=np.linspace(-2,4,100)
#定义模型函数
def get_model(deg):
    return lambda input_x=x0:np.polyval(np.polyfit(x,y,deg),input_x)
#定义损失函数
def get_cost(deg,calcu_x,data_y):
    return 0.5*((get_model(deg)(calcu_x)-data_y)**2).sum()
#定义测试阶数集并分别计算不同阶模型的损失
test_set=(1,4,10)
for d in test_set:
    print('The loss of degree{} is {}'.format(d,get_cost(d,x,y)))
#画图
plt.figure()
plt.title('Easy example of the price of house')
#将原始数据画为散点图
plt.scatter(x,y,c="g",s=6)
#限定横纵坐标
plt.xlim(-2,4)
plt.ylim(1e5,8e5)
#分别画出不同阶模型的拟合曲线
for d in test_set:
    plt.plot(x0,get_model(d)(),label='degree={}'.format(d))
    
plt.legend()
plt.show()

(1)np.linspace简单用法:
np.linspace(a,b,num),生成a到b的等间隔的num个数

(2)polyfit函数简单讲解:

def polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
Least squares polynomial fit.

Fit a polynomial p(x) = p[0] * x**deg + … + p[deg] of degree deg to points (x, y). Returns a vector of coefficients p that minimises the squared error in the order deg, deg-1, … 0.

(3)polyval函数简单讲解:

def polyval(p, x)
Evaluate a polynomial at specific values.

If p is of length N, this function returns the value:

`p[0]*x**(N-1) + p[1]*x**(N-2) + ... + p[N-2]*x + p[N-1]`  

If x is a sequence, then p(x) is returned for each element of x. If x is another polynomial then the composite polynomial p(x(t)) is returned.

(4)损失函数
损失函数采用常用的平方损失函数,即欧氏距离。

(5)注意:plt.show(),不要忘记括号。

3、运行结果

在这里插入图片描述
在这里插入图片描述

4、小结

从损失结果中看,阶数为1的时候损失最大,阶数为10的时候损失最小。但从图中看到,似乎当阶数等于1或4的时候能更好地描述这个模型,这就是过拟合现象。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值