实验1 线性回归 实操项目2——影厅观影人数预测(多变量线性回归)

实验1 线性回归 实操项目2——影厅观影人数预测(多变量线性回归)


实验内容:影厅观影人数预测

实验要求:

1.读取给定文件中数据集文件。(数据集路径:data/data72160/1_film.csv)

2.绘制影厅观影人数(filmnum)与影厅面积(filmsize)的散点图。

3.绘制影厅人数数据集的散点图矩阵。

4.选取特征变量与相应变量,并进行数据划分。

5.进行线性回归模型训练。

6.根据求出的参数对测试集进行预测。

7.绘制测试集相应变量实际值与预测值的比较。

8.对预测结果进行评价。
import numpy as np 
import pandas as pd 
from sklearn import datasets  
import matplotlib.pyplot as plt

import matplotlib.colors as mcolors
from sklearn import metrics
from sklearn.metrics import r2_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
df = pd.read_csv('data/data72160/1_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']
# 调用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()

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)

#获取一个特征  

#回归训练及预测  
clf = LinearRegression()  
clf.fit(X_train, y_train)  #注: 训练数据集  

target = df.filmnum
df.columns  #输出结果:Index(['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6'], dtype='object')

# 2、循环对每个特征值进行建模训练,作图



  #  linearmodel = LinearRegression()  # 构建模型

    
plt.figure(figsize=( 2*6, 5*5)) #图像宽和高
for i, col in enumerate(df.columns):  # enumerate 枚举
    train_X = df.loc[:, col].values.reshape(-1, 1)
    # 每一次循环,都取出datafram中的一列数据,是一维Series数据格式,但是线性回归模型要求传入的是一个二维数据,因此利用reshape修改其形状
    #print("train_X=",train_X)
    train_Y = target
    #linearmodel = linear_model.LinearRegression()  # 构建模型
    linearmodel = LinearRegression()  # 构建模型
    reg = linearmodel.fit(train_X, train_Y)  # 训练模型
    score = reg.score(train_X, train_Y) # 评估模型,Return the coefficient of determination of the prediction.
    #  以训练数据为X轴,标记为Y 轴,画出散点图,直观地看每个特征和标记直接的关系
    # 画出每一个特征训练模型得到的拟合直线 y= kx + b
    k = linearmodel.coef_  # 回归系数
    b = linearmodel.intercept_  # 截距
    x = np.linspace(train_X.min(), train_X.max(), 100)
    y = k * x + b
    # 作图
    plt.plot(x, y, c='red')
    axes.set_title(col + ' Coefficient of determination:' + str(score))
plt.show()



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



# 选取data中的X变量
"""
    :,1:4:代表选取数据集2-4列
"""
X = df.iloc[:,1:4]
# 设定target为y
y = df.filmnum
# 以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)


lr = LinearRegression()
lr.fit(X_train,y_train)
print('a={}\nb={}'.format(lr.coef_,lr.intercept_))


y_hat = lr.predict(X_test)
print(y_hat)


# 创建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))))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(94, 3) (32, 3) (94,) (32,)
a=[ 0.37048549 -0.03831678  0.23046921]
b=4.353106493779009
[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]

在这里插入图片描述

R2_1=0.8279404383777595
R2_2=0.8279404383777595
MAE=4.63125112009528
MSE=46.638222814565964
RMSE=6.829218316510753
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值