线性回归的实际用途
线性回归有很多实际的用途,分为以下两类:
1.如果目标是预测或者映射,线性回归可以用来对观测数据集的y和X的值拟合出一个预测模型。当完成这样一个模型以后,对于一个新增的X值,在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个y值。
2.给定一个变量y和一些变量X1, ⋯ , ??,这些变量有可能与y相关,线
性回归分析可以用来量化y与X? 之间相关性的强度,评估出与y不相关的X? ,并识别出哪些X?的子集包含了关于y的冗余信息。
算法实例(基于房屋价格的预测模型)
数据集
1000,168
792,184
1260,197
1262,220
1240,228
1170,248
1230,305
1255,256
1194,240
1450,230
1481,202
1475,220
1482,232
1484,460
1512,320
1680,340
1620,240
1720,368
1800,280
4400,710
4212,552
3920,580
3212,585
3151,590
3100,560
2700,285
2612,292
2705,482
2570,462
2442,352
2387,440
2292,462
2308,325
2252,298
2202,352
2157,403
2140,308
4000,795
4200,765
3900,705
3544,420
2980,402
4355,762
3150,392
上述数据复制到txt文档prices中备用
代码:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
# 读取数据集
datasets_X = []#存放房屋尺寸
datasets_Y = []#与成交价格
fr = open('prices.txt','r')
lines = fr.readlines()
for line in lines:
items = line.strip().split(',')
datasets_X.append(int(items[0]))
datasets_Y.append(int(items[1]))
length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length,1])#若不进行reshape会导致矩阵的维度出现(44,)形式,在线性回归计算时,会出现维度不符的错误
datasets_Y = np.array(datasets_Y)
'''
以数据datasets_X的最大值和最小
值为范围,建立等差数列,方便后
续画图。
'''
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])
linear = linear_model.LinearRegression()
linear.fit(datasets_X, datasets_Y)
#查看回归方程的系数与截距
print('Coefficients:',linear.coef_)
print('intercept:',linear.intercept_)
# 图像中显示
plt.scatter(datasets_X, datasets_Y, color = 'red')
plt.plot(X, linear.predict(X), color = 'blue')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()
实验结果:
Coefficients: [0.14839484]
intercept: 43.92337096187816
多项式 回归
在一元回归分析中,如果依变量 y与自变量 x的关系为非线性,但 是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归 。
多项式回归 的最大优点就是可以通过增加 x的高次项对实测点进行逼 近,直至满意为止 。
事实上 ,多项式回归可以处理相当一类非线性问题,它在分析 中占有重要的地位,因为任一函数都可以分段用多项式来逼近 。
实验数据与上例相同,代码如下
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
# 读取数据集
datasets_X = []
datasets_Y = []
fr = open('prices.txt','r')
lines = fr.readlines()
for line in lines:
items = line.strip().split(',')
datasets_X.append(int(items[0]))
datasets_Y.append(int(items[1]))
length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length,1])
datasets_Y = np.array(datasets_Y)
minX = min(datasets_X)
maxX = max(datasets_X)
X = np.arange(minX,maxX).reshape([-1,1])
##此两句时sklearn库解决多项式回归的核心
poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(datasets_X)
lin_reg_2 = linear_model.LinearRegression()
lin_reg_2.fit(X_poly, datasets_Y)
#查看回归方程的系数与截距
print('Coefficients:',lin_reg_2.coef_)
print('intercept:',lin_reg_2.intercept_)
# 图像中显示
plt.scatter(datasets_X, datasets_Y, color = 'red')
plt.plot(X, lin_reg_2.predict(poly_reg.fit_transform(X)), color = 'blue')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()
实验结果:
Coefficients: [0.00000000e+00 4.93982848e-02 1.89186822e-05]
intercept: 151.8469675050046
岭回归
岭回归 (ridge regression)是一种专用于共线性数据分析的有偏估计回归 方 法,是一种改良的最小二乘估计法 ,对某些数据 的拟合要强于最小二乘法 。
实验数据为某年交通要道车流量信息
留下邮箱即可获取
代码如下
###岭回归
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn import model_selection
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
##数据加载
#data=np.genfromtxt('data.txt')
data=pd.read_csv("岭回归.csv")
row,col=data.shape
print(row,col)
data_res=np.array(data[0:row]\
[[u'HR',u'WEEK_DAY',u'DAY_OF_YEAR',u'WEEK_OF_YEAR',u'TRAFFIC_COUNT']])
print(data_res.shape,type(data_res))
#数据处理
X=data_res[:,:4]
y=data_res[:,4]
poly=PolynomialFeatures(6)#以最高次为6的多项式拟合
X=poly.fit_transform(X)
train_set_X,test_set_X,train_set_y,test_set_y=model_selection.train_test_split(X,y,test_size=0.3,random_state=0)
clf=Ridge(alpha=1.0,fit_intercept=True)
clf.fit(train_set_X,train_set_y)
clf.score(test_set_X,test_set_y)
##利用测试集计算回归曲线的拟合优度, clf.score 返回值为 0.7375
#拟合优度,用于评价好坏最大为 1,无最小值,
#当对所有输 入都输出同一个值时,拟合优度为 0。
plt.figure(1)
#绘制车流量信息
plt.subplot(211)
plt.plot(data_res[:,4])
#绘制拟合曲线
plt.subplot(212)
start=200
end=300
y_pre=clf.predict(X)
time=np.arange(start,end)
plt.plot(time,y[start:end],'b',label="real")
plt.plot(time,y_pre[start:end],'r',label="predict")
plt.legend(loc='upper left')
plt.show()
print("end")
实验效果
--------------------------------------------------------------------------------------------------------------------参考mooc网课,北理工python机器学习应用课程