2019-11-01 编写第一个AI程序-预测用户体重(线性回归
在本文中用到了一个库-sklearn中的LinearRegression线性回归模型进行训练和预测。
sklearn是机器学习的库。
题目:编写第一个AI程序,用来预测用户的体重。预测的过程将会使用线性回归模型。
1.机器学习建模中涉及到的几个经典的环节:
(1)数据 足够多的数据(数据很重要。没有数据,做不了AI)
收集数据-通过一些策略
(2)数据预处理(数据清洗)
预处理:数据中会存在一些噪音,那么就需要给数据降噪或者剔除这些噪音数据
这是个很脏的活,很多人AI工程师都不想去碰的。但是很重要,需要大量时间去处理这个数据预处理,否则后面的工作无法进行,都会受到影响。
(3)特征工程(Feature Engineering)
从一个数据或者样本里提取出有价值的信号,这就叫做特征,整个过程叫特征工程。
花费50%-60%的时间在特征工程。
(4)建模
每个数据可以用向量或矩阵或张量这样的数值型来表示,这些数可以直接作为模型的输入。
运用各种各样的模型去尝试,尝试哪个模型的效果是好的。
(1)调参
不断调整模型,使得这个模型达到一个最优的效果。
(2)改造
当这个模型不满足于我们的实际需求,那就会去先改造这个模型再调参。
(5)验证
验证这个模型的效果-评估指标
评估指标:
准确率-最常用的问题
AUC
FS
KS值
如果模型不行,则需要重复以上的操作。
在特征工程里的工作量很大,但多数还是要做特征工程的工作。
希望能减轻特征工程的工作,但是很局限于图像方面。
端到端的方法:数据预处理到建模(跳过特征工程)-适应于深度学习的场景。
但是在云识别、图像识别里可以使用端到端的方法。
实例:
问题描述:
分析:
这是一个线性问题-线性回归的问题-预测数值。
把身高看作是x,体重看作是y,通过一种方式学出x-y建立一个映射关系(f)。
这种方法就是线性回归,即找到一个线性回归函数确立这个映射关系。
如何表示?
这个比较简单,因为这里面只有一个特征和标签。
我们可以在二维空间里画出来,就会知道两者的关系。
通过线性模型对目前的数据进行拟合,得出一种关系,然后就可以对未来的数据进行预测。
通过模型训练,然后把模型应用到不同于训练集的数据进行预测,测试模型的效果。
在表格里我们给出了正常男生20岁时标准体重。第一列表示的是身高,第二列代表的是体重。我们希望通过这个数据来搭建回归模型使得之后给定一个身高即可以预测出标准体重。
开始操作:
(1)数据清洗
因为在这里数据已经很规范了,所以不需要进行数据清洗了。(2)特征工程
这里需要注意的一点是,看似不需要做特征工程,但实际上也可以做一些特征方面的处理的,比如连续性变量转换成离散型变量等。当然,这里唯一的连续性变量是身高。
(3)建模
1.建模第一步-理解数据的本身,不急于套模型
数据可视化,表示数据在二维或三维中-降维(如果特征很多的话)
一般是对数据本身的理解。切忌不要急于直接套模型,因为不理解数据的情况下做出来的模型是有着很大的不确定性。比如出现了异常情况,可能都不知道问题的根源是什么。
对于数据理解来说,最重要的一项技术叫做数据的可视化(data visualization)。千万不要小看这部分的工作。不理解数据的前提下做模型是很不明智的事情。
对在数据探索(data exploration)阶段我们会试图从直观的角度来查看数据的特性,比如数据的分布是否满足线性的? 数据中是否包含异常值?特征是否符合高斯分布等等。这些都会影响到我们后续的决策。
以上方法都正确,最常用的方法就是降维,使用PCA算法。
可视化表示身高和体重的关系-代码:
#引入库
import numpy as np
import matplotlib.pyplot as plt
#创建数据集 当多个数组时,记得所有数组的总外层加[ ]
data=np.array([[152,51],[156,53],[160,54],[164,55],[168,57],[172,60],[176,62],[180,65],[184,69],[188,72]])
#打印出数组的大小 #shape 返回数组的维度值 -矩阵的维度(n,m)-(行,列) 10x2 10行2列print(data.shape)
#提取数据给变量x,y(x 是输入数据 y是输出数据) 可视化数据关系
#从data中提取出身高和体重,放到x,y的变量中
#这句话可以拆开看-等同于 x=data[:,0].reshape(-1,1) y=data[:,1] ,刚开始没明白
#为什么x是reshape ?因为大部分训练的输入数据一般是二维数据,不然一维数据会报错,输出的预测值是一维数据。而reshape后就是二维数据。
x,y=data[:,0].reshape(-1,1),data[:,1]
#画散点图-在二维空间里表示出x,y的关系
plt.scatter(x,y,color="black") #画散点图
plt.xlabel("height(cm)")
plt.ylabel("weight(kg)")
plt.show()
输出结果:
数组的维数:
散点图:
拓展:
1.如果换成plt.plot(x,y,color="black"),即折线图,也是可以表现出关系。
2.为什么会用到散点图呢。
我猜想应该是想测试模型时,做好拟合度。
看看是怎样的训练后的模型可以更好的拟合这些数据。
在这里我们使用一个线性回归模型来拟合身高-体重的数据,也就是希望通过身高来预测标准体重。在已创建的数据集里已经给出了部分样本,所以一旦我们训练出一个模型,则可以对任意的身高数据都可以给出一个体重的预测值。这里需要分成3个部分。
第一部分是数据的创建;
第二部分是利用线性回归来拟合数据;
第三部分是利用已经训练好的模型去预测任意的体重并画出对任意体重的预测值,这里需要使用plot, 并且指定颜色为蓝色(color="blue")
把线性回归当成了黑箱子来对待。
提示:
'''
提示一
1.实例化的过程跟创建object的过程是类似的,这里需要调用sklearn的线性模型模块即可,暂时不需要指定任何的输入参数。并把实例化后的线性回归模型命名为regr
2.对于模型的训练,可以直接使用模型自带的fit函数
3.针对于所有给定的x,计算出在这个模型下的预测值,并把x和预测值通过matplotlib库来去可视化。
提示二
1.在sklearn里线性回归模型在linear_model模块里。可以参考
sklearn.linear_model.LinearRegression — scikit-learn 0.21.3 documentation
2.对于训练数据(x,y),通常通过sklearn中的fit(x,y)来实现模型的训练。这里x可以看做是特征部分,y可以看做是真实的值或者标签。
3.调用plt.plot()函数即可以画出一条线。
'''
代码展示:
#训练并且预测体重
#!/user/bin/python
#引入库
from sklearn import datasets, linear_model# 引用 sklearn库,主要为了使用其中的线性回归模块
import numpy as np# 引用numpy库,主要用来做科学计算
import matplotlib.pyplot as plt# 引用matplotlib库,主要用来画图
# 创建数据集,把数据写入到numpy数组
data = np.array([[152,51],[156,53],[160,54],[164,55],
[168,57],[172,60],[176,62],[180,65],
[184,69],[188,72]])
# 打印出数组的大小
print(data.shape)#输出结果:(10,2) 10行2列
#从data中提取出身高和体重,放到x,y的变量中
x,y=data[:,0].reshape(-1,1),data[:,1]
#1.训练模型
#利用线性回归模型去拟合数据
# TODO 1. 实例化一个线性回归的模型
regr =linear_model.LinearRegression()
# TODO 2. 在x,y上训练一个线性回归模型(目标函数)。如果训练顺利,则regr 会存储训练完成后的模型
regr.fit(x,y)#训练的方法
# TODO 3.画出身高与体重的关系-真实的点
plt.scatter(x,y,color="red")
#plt.show()
#2.验证-预测函数
# #regr.predict(x)
#画出已经训练好的线条
plt.plot(x,regr.predict(x),color="blue")
#plt.show()
#3.画图(散点图/折线图)-可视化
# 画x,y轴的标题
plt.xlabel('height (cm)')
plt.ylabel('weight (kg)')
plt.show()# 展示
#利用已经训练好的模型去预测任意的体重并画出对任意体重的预测值,
#这里需要使用plot, 并且指定颜色为蓝色(color="blue")
#利用已经训练好的模型去预测身高为163的人的体重
print ("Standard weight for person with 163 is %.2f"%regr.predict([[163]]))
总结:
训练与测试
1.创建数据集(加载数据集)
可能是数/图片/数据集...
不同的数据形式有不同的创建方式
2.训练模型
引入一个库的模型
此处是线性回归模型LinearRegression()-实例化后记为regr-线性回归模型
训练方法:regr.fit(x,y)-fit函数
3.画图
可视化数据
画数据的表示和线性回归的模型
4.验证
预测函数-regr.predict(x)x是特征