线性回归(一)
前文讲述了大量关于线性回归的理论知识,现在实际来看下什么是线性回归,先看最简单的一元线性回归。
回归分析是确定预测属性(数值型)与其他变量间相互依赖的密切程度的一个定量分析模型。
模拟一段数据如下:
X = [6,8,10,14,18]
Y = [7,9,13,17.5,18]
直接看上去,不太容易能直观的看出来这段数据是否是线性相关的,所以我们直接将数据画出来,看下数据是否线性相关(实际的机器学习开发的过程中,一般在数据探索阶段,简单判断,如果不太容易看,再利用皮尔斯系数等方法判断线性相关的准确性,这里介绍就采用简单的判断方式了)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def basic():
plt.figure(1)
plt.title("line regresson")
plt.xlabel("x")
plt.ylabel("y")
#lst:设置X,Y轴的范围
plt.axis([0,25,0,20])
#lst: 是否显示grid
plt.grid(True)
return plt
basic()
X = [6,8,10,12,14,18]
Y = [7,9,13,17.5,19,20]
data = {"X": X,"Y":Y}
plt.scatter(X,Y)
plt.show()
运行最终生成的图例如下所示:
从上图可以发现在散列的点基本还是围绕一个直线分布于两边的,应该属于一元线性分布。(后续文章将描述,如何判断X,Y值是否线性相关)。
得知X,Y线性相关以后,下面我们将建立模型,希望拟合出线性模型以便预测、分类。
为了能够比较直观的判断准确性,将训练的数据修改成标准的y=x+2。通过训练希望能够拟合出数值变化规律的拟合方程来。具体代码如下:
#coding:utf-8
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
def basic():
plt.figure(1)
plt.title("line regresson")
plt.xlabel("x")
plt.ylabel("y")
plt.axis([0,25,0,30])
plt.grid(True)
return plt
basic()
# X = np.array([6,8,10,12,14,18])
X = np.array([[6,6],[8,8],[10,10],[12,12],[14,14],[18,18]])
# Y = [7,9,13,17.5,19,20]
#lst :替换成 y=x+2
Y = np.array([8,10,12,14,16,20])
#lst :创建并拟合模型
model = LinearRegression()
#学习
model.fit(X,Y)
print model.coef_
print model.intercept_
#预测可能的值
prdeit_X = np.array([[15,15]])
prdeit_y = model.predict(prdeit_X)
print prdeit_y
print model.score(X,Y)
# plt.scatter(X,Y)
# plt.show()
--运行结果如下--
[ 0.5 0.5]
2.0000
[ 17.]
1.0
--------------
从上面的预测可以发现,通过线性拟合,成功地拟合了一个线性回归方程,从而成功预测了15的因变量是17的结果。
而通过观察model.coef(回归系数矩阵,发现其回归系数是0.5,0.5,,截距是2。也就是拟合出来的线性回归方程式 Y= (0.5 0.5)X+2,其刚好和开始我们规划的y=x+2一致。出现一点不同是因为,我们给的训练数据格式为:
([[6,6],
[7,7])
此处有意写成数学样式表达,主要是因为fit的函数中要求的X第一位表示的样本,第2个是样本的特征
在线性回归中,表示的是通过上述结果的回归系数(也就是y=kx+b+E)中的k值,由于原始数据是完全匹配的,所以返回的score的预测结果评分为1,为最好。
下面将训练的原始数据进行一次调整,然后我们在看运行的结果。
X = np.array([[6,6],[8,8],[10,10],[12,12],[14,14],[18,18]])
# Y = [7,9,13,17.5,19,20]
#y=x+2
Y = np.array([8,10.6,12.5,14.4,16,20.9])
#lst :创建并拟合模型
model = LinearRegression()
#学习
model.fit(X,Y)
print model.coef_
print model.
#预测可能的值
prdeit_X = np.array([[15,15]])
prdeit_y = model.predict(prdeit_X)
print prdeit_y
print model.score(X,Y)
-----返回的结果-----
[ 0.51928571 0.51928571]
[ 17.54142857]
0.99524343053
------------------
可以看到由于原始的数据发生了一些波动,不能完全匹配,的出来的评价结果也就有一定的下降了。
参考链接:
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py