在 anconda提供的编译器Spyder中:
import numpy as np
引用numpy库作为np来使用
先生成一个X数组作为X轴:
x=list(range(10,29))
输出10到28的一个数组,但是这个数组不适用于我们的图像构建,所以要引用numpy库中的array函数
x= np.array(x)
通过这个函数将原数组转换成我们需要用到的数组
因为是要构建一个线性关系,也就是确立y=x+b的关系,我们需要生成随机扰动项,也就是需要通过numpy提供的random方法来确立关系
e = np.random.randn(19)
19表示生成19个随机数
array([-1.09966045, -0.00527499, -0.99471305, -1.39432261, -1.93133477, -0.88176476, -0.30119564, 0.30721595, -0.42166133, 0.48725303, 1.10091878, 0.19685779, 1.09610661, -0.48125626, -0.00474868, -0.73581372, -0.68684776, -1.54691135, 1.77830768])
首先 import pandas as pd
pd.DataFrame({"x":x,"y":y}) Out[12]: x y 0 10 8.900340 1 11 10.994725 2 12 11.005287 3 13 11.605677 4 14 12.068665 5 15 14.118235 6 16 15.698804 7 17 17.307216 8 18 17.578339 9 19 19.487253 10 20 21.100919 11 21 21.196858 12 22 23.096107 13 23 22.518744 14 24 23.995251 15 25 24.264186 16 26 25.313152 17 27 25.453089 18 28 29.778308
使用DataFrame的结果就是将两组数组组成一个表格形式
import matplotlib.pyplot as plt
引用matplotlib库中的图画工具pyplot
fig=plt.figure(figsize=(6,6),dpi=80)
设置图像框,确定大小6X6,设置分辨率80
ax = fig.add_subplot(111)
设置一行一列,并且选择第一个位置画图
ax.scatter(data.x,data.y,color="b",label="$y = x + \epsilon$")
data.x 引用数据或y,color="b"将点用蓝色,label图示,将线性关系的表达式展示出来
plt.legend(shadow=True)
展示所画的图像
plt.show()
展示图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVPBZRDG-1583672890927)(C:\Users\86189\AppData\Roaming\Typora\typora-user-images\image-20200306181516830.png)]
import os
if __name__ == "__main__":
data = generate_data()#生成一个DataFrame
home_path = os.path.dirname(os.path.abspath(__file__))#引用一个os 脚本,获取当前目录
# 存储数据,Windows下的存储路径与Linux并不相同
if ox.name == "nt":
data.to_csv("%s\\simple_example.csv" %home_path,index=False)#如果系统是WINDOWS系统则用以下目录格式保存为csv文件
else:
data.to_csv("%s/simple_example.csv" % home_path, index=False)#以Linux格式存储
visualize_data(data)
可以在spyder[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p5j9ZuV8-1583672890928)(C:\Users\86189\AppData\Roaming\Typora\typora-user-images\image-20200306210724338.png)]中查看当前目录,使用 path="./simple_example.csv"
选择读取的csv文件的路径
data = pd.read_csv(path)
通过这个指令传入csv给dataframe
首先 from sklearn import linear_model
引用sklearn中linear_model模组
然后创建linear_model中的线性回归空模型
model = linear_model.LinearRegression()
然后将数据传入模型中
我们需要传入一个x:特征,y:待预测的标签,在这个例子中,X就是变量X,Y就是变量Y
features = ["x"]
label = ["y"]
x = data[features]
y = data[label]
我们用这种方式来调用数据,而不使用 x = data.x来调用x数据
因为x=data.x的结果是一个数列,而用上面那种方式的结果是一个矩阵
因为模型所需要的是一个矩阵,而不是一个数列
然后我们调用sklearn中的fit语句
model.fit(x,y)
来训练模型
然后我们可以查看随机扰动项,也就是y = ax +b中的 a和 b
model.coef_
查看a model.intercept_
查看b
评估模型主要通过:
均方差和决定系数
均方差:
mse = np.mean((model.predict(x) - y) ** 2)
使用np.mean函数,求取平均值
model.predict(x)预测的Y减去实际的Y值的平方味MSE(均方差)
均方差越小越好
决定系数:
score = model.score(x, y)
与前面将数据可视化的代码差不多
fig = plt.figure(figsize=(6, 6), dpi=80)
# 在图形框里只画一幅图
ax = fig.add_subplot(111)
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
# 画点图,用蓝色圆点表示原始数据
ax.scatter(x, y, color='b')
scaterr函数用于将(X,Y)点描出来
ax.plot(x, model.predict(x), color='r',label=u'$y = %.3fx$ + %.3f' %(model.coef_, model.intercept_))
plt.legend(shadow=True)
plot函数会将点,通过线描绘出来
传入的值:
X,模型的预测X值,颜色红色,
model.coef_和model.intercept_
是将随机扰动项打印出来
线性回归模型有两种,一种是LAD线性回归模型,一种是OLS模型,
我们上面训练的是OLS经典线性回归模型,这种模型的数学基础更加扎实
而另一只 LAD线性回归模型对异常值更加稳定,他们的区别是损失函数不同
LAD的损失函数是 预测值与实际值的差值
OLS的损失函数是预测值与实际值差值的平方