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的时候能更好地描述这个模型,这就是过拟合现象。