多变量线性回归算法的求解远离取自于单变量线性回归算法,又克服了单变量线性回归算法只有一个特征变量,在实际应用中的局限性,因而用途广泛。
多变量线性回归常规解法中对变量有特定要求,而实际应用中不可能并不满足这个要求,同时存在过拟合等问题,因而在基础求解上,需要引入正则化、岭回归和Lasso回归等,进一步优化与拓展多变量线性回归算法的求解。
基本模型:
hθ(x)=θ0+θ1x1+θ2x2+θ3x3+…+θnxn
多变量数据的可视化
# 直方图
"""
xlabelsize=12:X轴尺寸
ylabelsize=12:Y轴尺寸
figsize=(12,7):整个图形的尺寸
"""
df = pd.read_csv('D:/PythonProject/machine/data/3_film.csv')
df.hist(xlabelsize=12,ylabelsize=12,figsize=(12,7))
plt.show()
# 密度图
"""
kind:图形类型
subplots=True:需要绘制多个子图
layout=(2,2):绘制子图数量2*2
sharex=False:子图不共享X轴
fontsize=8:字体大小
"""
df.plot(kind="density",subplots=True,layout=(2,2),sharex=False,fontsize=8,figsize=(12,7))
plt.show()
# 箱线图
df.plot(kind='box',subplots=True,layout=(2,2),sharex=False,sharey=False,fontsize=8,figsize=(12,7))
plt.show()
# 相关系数热力图
# 设置变量名
names = ['filmnum','filmsize','ratio','quality']
# 计算变量之间的相关系数矩阵
correlations = df.corr()
# 调用figure创建一个绘图对象
fig = plt.figure()
# 调用画板绘制第一个子图
ax = fig.add_subplot(111)
# 绘制热力图,从0.3到1
cax = ax.matshow(correlations,vmin=0.3,vmax=1)
# 将matshow生成热力图设置为颜色渐变条
fig.colorbar(cax)
# 生成0-4,步长为1
ticks = np.arange(0,4,1)
# 生成x/y轴刻度
ax.set_xticks(ticks)
ax.set_yticks(ticks)
# 生成x/y轴标签
ax.set_xticklabels(names)
ax.set_yticklabels(names)
plt.show()
# 散点图矩阵
# 绘制散点图矩阵
"""
df:数据来源
figsize=(8,8):图形尺寸
c='b':散点图点的颜色
"""
scatter_matrix(df,figsize=(8,8),c='b')
plt.show()
df = pd.read_csv('D:/PythonProject/machine/data/3_film.csv')
# 选取data中的X变量
"""
:,1:4:代表选取数据集2-4列
"""
X = df.iloc[:,1:4]
# 设定target为y
y = df.filmnum
# 把X、y转换为数组形式,便于计算
X = np.array(X.values)
y = np.array(y.values)
# 以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=1)
print(X_train.shape,X_test.shape,y_train.shape,y_test.shape)
(94, 3) (32, 3) (94,) (32,)
lr = LinearRegression()
lr.fit(X_train,y_train)
print('a={}\nb={}'.format(lr.coef_,lr.intercept_))
a=[ 0.37048549 -0.03831678 0.23046921]
b=4.353106493779016
y_hat = lr.predict(X_test)
print(y_hat)
[20.20848598 74.31231952 66.97828797 50.61650336 50.53930128 44.72762082
57.00320531 35.55222669 58.49953514 19.43063402 27.90136964 40.25616051
40.81879843 40.01387623 24.56900454 51.36815239 38.97648053 39.25651308
65.4877603 60.82558336 54.29943364 40.45641818 29.69241868 49.29096985
44.60028689 48.05074366 35.23588166 72.29071323 53.79760562 51.94308584
46.42621262 73.37680499]
# 创建t变量
t = np.arange(len(X_test))
# 绘制y_test曲线
plt.plot(t,y_test,'r',linewidth=2,label='y_test')
# 绘制y_hat曲线
plt.plot(t,y_hat,'g',linewidth=2,label='y_hat')
plt.legend()
plt.show()
# 拟合优度R2的输出方法一
print('R2_1={}'.format(lr.score(X_test,y_test)))
# 拟合优度R2的输出方法二
print('R2_2={}'.format(r2_score(y_test,y_hat)))
# 计算MAE
print('MAE={}'.format(metrics.mean_absolute_error(y_test,y_hat)))
# 计算MSE
print('MSE={}'.format(metrics.mean_squared_error(y_test,y_hat)))
# 计算RMSE
print('RMSE={}'.format(np.sqrt(metrics.mean_squared_error(y_test,y_hat))))
R2_1=0.8279404383777595
R2_2=0.8279404383777595
MAE=4.63125112009528
MSE=46.63822281456598
RMSE=6.8292183165107545
数据文件:
链接:https://pan.baidu.com/s/1TVPNcRKgrDttDOFV8Q2iDA
提取码:h4ex