线性回归:
在统计学中,回归分析指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型,可以
分位线性回归分析和非线性回归分析。
线性回归 y = ax + b 一元一次方程,直线关系。
线性回归通常是人们在学习预测模型时首选的技术之一。在这种技术中,因变量是连续的,自变量可以是连续的也可以是离散的,回归线的性质是线性的。
线性回归使用最佳的拟合直线(也就是回归线)在因变量(Y)和一个或多个自变量(x)之间建立一种关系。简单线性回归(一元一次线性回归)可以表示为:
Y = a * x + b
多元线性回归可以表示为 Y = a + b1 * x + b2 * x2 , 多元线性回归可以根据给定的预测变量(S)来预测目标变量的值。
因变量一般是最后要推导的结果,自变量就是影响因变量变化的因素。
核心是服从均值为0,方差为σ^2的正态分布。
需要用到的模块是SKlearn中的LinearRegression函数
LinearRegression参数详细介绍:
# 导入库
from sklearn.linear_model import LinearRegression
# 参数
LinearRegression(fit_intercept, normalize, copy_x, n_jobs)
fit_intercept :布尔类型,初始为True。决定在这个模型中是否有intercept,即偏移量(截距),即类似于线性函数y = w1x1 + w0 中的w0。 如果False则无。
normalize:布尔类型,初始为False。如果为True,训练样本会在回归之前被归一化;如果fit_intercept设置为False,那这个参数就会被忽略。
反之,设为True,则模型在回归之前,会对特征集X减去平均数并除以L2范式(没懂),理解为一种标准化的规则。
如果设为了False,而你又想标准化特征集合,则需要使用 sklearn.preprocessing.StandardScaler类来进行预处理。
copy_X:布尔类型,初始化为True。True则,特征集合不变,反之会被复写。
n_jobs:初始为None,表示用1个处理器计算;-1代表所有处理器,只用于多个目标集问题的提速和大型问题
举例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入线性回归模块
from sklearn.linear_model import LinearRegression
# np.random.RandomState :设定随机数种子,对于一个随机数发生器,只要该种子(seed)相同,产生的随机数序列就是相同的。
rng = np.random.RandomState(1)
# 生成随机数X 和 Y
# 随机数的样本关系为 y = 8 + 4*x
xtrain = 10 * rng.rand(20)
ytrain = 8 + 4 * xtrain + rng.rand(20)*30 # rng.rand(30)为添加的噪音数值,干扰用的误差项。
fig = plt.figure(figsize=(12,3))
ax1 = fig.add_subplot(1,2,1)
plt.scatter(xtrain, ytrain, marker='.', color='k')
plt.grid()
plt.title('yangben shuju')
model = LinearRegression() #创建线性回归模型。
model.fit(xtrain[:,np.newaxis], ytrain) # 参数的录入 第一个参数是x自变量,第二个参数是因变量。
# 做线性回归时,x自变量要是矩阵的格式,如果不是矩阵格式,要用xtrain[:,np.newaxis]添加一个维,变成矩阵。
print(model.coef_) # 查看斜率
print(model.intercept_) # 查看截距
# 数据模型的应用:
xtest = np.linspace(0,10,100)
ytest = model.predict(xtest[:,np.newaxis]) # predict : 预测
ax2 = fig.add_subplot(1,2,2)
plt.scatter(xtrain, ytrain, marker='.', color='k') # 样本数据的散点图
plt.plot(xtest,ytest,color='r', linestyle='--') #拟合的直线
plt.grid()
# 误差
fig = plt.figure(figsize=(12,6))
plt.scatter(xtrain, ytrain, marker='.',color='k') # 样本数据的散点图
plt.plot(xtest,ytest,color='r', linestyle='--') #拟合的直线
ytest2 = model.predict(xtrain[:,np.newaxis]) # 原样本数据X在拟合直线上的Y值
plt.scatter(xtrain,ytest2, marker='x', color='g') # ytest2 的散点图
plt.plot([xtrain,xtrain], [ytrain,ytest2], color='gray') # 误差线
plt.grid()
plt.title('wu cha')
# 多元线性回归
rng = np.random.RandomState(5)
xtrain = 10 * rng.rand(150,4)
ytrain = 20 + np.dot(xtrain, [1.5,2,-4,3])
df = pd.DataFrame(xtrain, columns=['b1', 'b2', 'b3', 'b4'])
df['y'] = ytrain
pd.plotting.scatter_matrix(df[['b1', 'b2', 'b3', 'b4']], figsize=(10,6), diagonal='kde', alpha=0.5, range_padding=0.1) # 散点矩阵查看各数据有没有相关性
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']], df['y'])
print('斜率为:', model.coef_)
print('截距为:' , model.intercept_)
线性回归模型的评估
通过几个参数验证回归模型
1.SSE(和方差,误差平方和)
2.MSE(均方差,方差)
3.RMSE(均方根,标准差)
4.R-square(确定系数)
SSE和方差:该统计参数计算的是拟合数据和原始数据对应点的误差的平方和。
SSE越接近于0,说明模型的选择和拟合更好,数据预测也越成功。
MSE均方差:该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别。
RMSE均方根:该统计参数,也叫回归系统的拟合标准差,是MSE的平方根。 RMSE = np.sqrt(MSE)
R-square(确定系数):
1,SSR:即预测数据与原始数据均值之差的平方和。 SSR = ((ytest - ytrain.mean())**2).sum()
2,SST:即原始数据和原始数据均值之差的平方和。 sst = ((ytrain - ytrain.mean())**2).sum() 注:SST = SSE + SSR
所以,R-square(确定系数)是定义为SSR和SST的比值。 r2 = ssr / sst
其实确定系数是通过数据的变化来表征一个拟合的好坏。由上面的表达式可以知道‘确定系数’的正常取值范围为【0,1】,
越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好。
R-square(确定系数)大于0.8就很好了。
注意:如果同时做了两个回归模型,一般的R-square(确定系数)比较就可以了,越接近1越好。如果比较MSE,哪一个值越小哪一个就更好。
#模型评估
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入线性回归模块
from sklearn.linear_model import LinearRegression
# 导入评估模块
from sklearn import metrics
rng = np.random.RandomState(1)
xtrain = 10 * rng.rand(30)
ytrain = 8 + 4 * xtrain + rng.rand(30) * 3
# 创建数据
model = LinearRegression()
model.fit(xtrain[:,np.newaxis], ytrain) #根据原始数据x,y建立线性数学模型model
ytest = model.predict(xtrain[:,np.newaxis])
#ytest是预测值,预测的结果。根据原数据x预测的结果,因为是建立的数学模型,预测值ytest和原数据ytrain肯定不一样,但是非常近似。
mse = metrics.mean_absolute_error(ytrain, ytest) #第一个值是原数据,第二个值是预测的值
# 因为RMSE是MSE的平方根,所以:
rmse = np.sqrt(mse)
print(mse)
print(rmse)
ssr = ((ytest - ytrain.mean())**2).sum()
sst = ((ytrain - ytrain.mean())**2).sum()
r2 = ssr / sst # r2值是R-square(确定系数)的结果值,我们要求得的。
r22 = model.score(xtrain[:,np.newaxis], ytrain) #直接求得R-square(确定系数)的值。
print(r2)
print(r22)
0.7797031388892226
0.8830080061297421
0.9946452159695
0.9946452159694995
SKlearn自带的波士顿房价例子:
import numpy as np
# 导入sklearn自带的样本数据,波士顿房价数据
from sklearn.datasets import load_boston
# 导入sklearn的线性回归模型
from sklearn.linear_model import LinearRegression
# 加载数据,boston就是样本数据,可以直接查看
boston = load_boston()
# 获得自变量数据
X = boston.data
# 获得因变量数据
y = boston.target
# 实例化模型
model = LinearRegression()
# 拟合
model.fit(X, y)
# 预测
y_pred = model.predict(X)
y_pred
# y_pred 就是求得的预测值,y 是真实值。
array([30.00384338, 25.02556238, 30.56759672, 28.60703649, 27.94352423,
25.25628446, 23.00180827, 19.53598843, 11.52363685, 18.92026211,
18.99949651, 21.58679568, 20.90652153, 19.55290281, 19.28348205,
19.29748321, 20.52750979, 16.91140135, 16.17801106, 18.40613603,
12.52385753, 17.67103669, 15.83288129, 13.80628535, 15.67833832,
13.38668561, 15.46397655, 14.70847428, 19.54737285, 20.8764282 ,
11.45511759, 18.05923295, 8.81105736, 14.28275814, 13.70675891,
23.81463526, 22.34193708, 23.10891142, 22.91502612, 31.35762569,
34.21510225, 28.02056414, 25.20386628, 24.60979273, 22.94149176..............
y_pred 预测值,y 真实值。有了预测值和真实值,就可以求预测误差了
from sklearn.metrics import mean_squared_error
# 计算误差
mse = mean_squared_error(y, y_pred)
mse
21.894831181729206
输出线性模型的斜率和输出线性模型的截距
model.coef_
model.intercept_