机器学习第四章线性回归算法进阶4.1多变量线性回归算法(《大话Python机器学习》学习笔记)

第四章线性回归算法进阶

  多变量线性回归算法的求解远离取自于单变量线性回归算法,又克服了单变量线性回归算法只有一个特征变量,在实际应用中的局限性,因而用途广泛。
  多变量线性回归常规解法中对变量有特定要求,而实际应用中不可能并不满足这个要求,同时存在过拟合等问题,因而在基础求解上,需要引入正则化、岭回归和Lasso回归等,进一步优化与拓展多变量线性回归算法的求解。

4.1多变量线性回归算法

4.1.1多变量线性回归算法的最小二乘求解

基本模型:
  hθ(x)=θ01x12x23x3+…+θnxn

  • hθ(x)表实以θ为参数,θ0,θ1,θ2,θ3,…θn是待求解的回归参数
      由于特征变量x有n个,所以,x可以表示成矩阵的形式:
    在这里插入图片描述
    其中:
    在这里插入图片描述
    成本函数:
    在这里插入图片描述
  • m:训练集中的训练样本个数
  • (x(i),y(i)):第i个训练样本,上标i是索引,表示第i个训练样本

求解θ:
在这里插入图片描述
得到:
在这里插入图片描述

  • 这里假设矩阵X的秩一般为n+1,即(XTX)-1存在
  • (XTX)-1不可逆的原因:
      自变量之间存在高度多重共线性,如x2=2x1
      特征变量过多,复杂度过高而训练数据相对较少,解决方法:使用正则化以及岭回归

4.1.2多变量线性回归的Python实现:影厅观影人数的拟合(一)

多变量数据的可视化

  1. 直方图(包含导入数据)
# 直方图
"""
    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()

在这里插入图片描述

  1. 密度图
# 密度图
"""
    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()

在这里插入图片描述

  1. 箱线图
# 箱线图
df.plot(kind='box',subplots=True,layout=(2,2),sharex=False,sharey=False,fontsize=8,figsize=(12,7))
plt.show()

在这里插入图片描述

  1. 相关系数热力图
# 相关系数热力图
# 设置变量名
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()

在这里插入图片描述

  1. 散点图矩阵
# 散点图矩阵
# 绘制散点图矩阵
"""
    df:数据来源
    figsize=(8,8):图形尺寸
    c='b':散点图点的颜色
"""
scatter_matrix(df,figsize=(8,8),c='b')
plt.show()

在这里插入图片描述
多变量线性回归算法的数据拟合与预测

  1. 选取特征变量与响应变量,并进行数据划分
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,)

  1. 进行线性回归操作,并输出结果
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

  1. 根据求出参数,对测试集进行预测
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]

  1. 对测试集相应变量实际值与预测集的比较
# 创建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()

在这里插入图片描述

  1. 对预测结果进行评价
# 拟合优度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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>