机器学习实验一单变量线性回归

实验目的:

1. 根据数据创建单变量线性回归模型

2. 使用线性回归模型进行预测

3. 对预测结果进行评价

实验内容:

假设某披萨店的披萨价格和披萨直径之间有下列数据关系:      

训练样本

直径(英寸)

价格(美元)

1

6

7

2

8

9

3

10

13

4

14

17.5

5

18

18

根据上面的训练数据,预测12英寸的披萨的可能售价。

  1. 直径为自变量X,价格为因变量y,画出二者的散点图,并给出结论。
  2. 根据现有的训练数据求线性回归模型,并画出拟合直线。(可以使用sklearn库中的sklearn.linear_model.LinearRegression对象来进行线性拟合),给出拟合直线方程。
  3. 预测12英寸披萨的价格。(使用predict函数)
  4. 评价模型的准确率,分析模型预测结果。

提示:训练线性模型的步骤:

1、准备训练数据

2、创建模型

3、对象拟合求线性方程的截距和斜率

4、画拟合直线

测试数据

直径(英寸)

价格(美元)

1

8

8.5

2

9

11

3

11

12

4

12

15

5

16

18

A.  手动计算方法:

 假设hpyTrain代表针对训练数据的预测y值,hpyTest代表针对测试数据的预测y值  

   训练数据残差平方和:ssResTrain = sum((hpyTrain -yTrain) ** 2)  

   测试数据残差平方和:ssResTest = sum((hpyTest -yTest) ** 2

   测试数据偏差平方和:ssTotTest = sum((yTest -np.mean(yTest)) ** 2)

   R方:Rsquare = 1 -ssResTest / ssTotTest

B.  Python的LinearRegression对象提供的方法:

       训练数据残差平方和:model._residues

     R方:model.score(xTest,yTest)

#单变量线性回归
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False


x_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
x_test = [[8], [9], [11], [12], [16]]
y_test = [[8.5], [11], [12], [15], [18]]


plt.xlabel('Diameter')
plt.ylabel('Price')
plt.title('200512334韦秋萍')
plt.scatter(x_train, y_train, marker='o',color='blue')#生成散点图
plt.xlim(0,25)#x轴作图范围
plt.ylim(0,25)#y轴作图范围
plt.show()

# 1.构建模型
model =LinearRegression() #构建线性模型
# 2.训练模型
model.fit(x_train, y_train)#训练模型
data_x2 = [[0], [10], [15], [25]]
data_y2 = model.predict(data_x2)
#plt.subplot(1, 3, 2)

k=str(model.coef_[0][0])[:4]
b=str(model.intercept_[0])[:4]
print('斜率:',k) # 线性模型系数
print('截距:',b) #截距
print("拟合直线方程为:" + "y=" + k + "x+" + b)

plt.scatter(x_train, y_train, color='red')
plt.plot(data_x2, data_y2, '-',color='green') #画出回归直线
plt.xlabel('Diameter')
plt.ylabel('Price')
plt.title('200512334韦秋萍')
plt.xlim(0,25)#x轴作图范围
plt.ylim(0,25)#y轴作图范围
plt.show()



plt.scatter(x_train, y_train, color='blue')
plt.scatter(x_test, y_test, color='red')
plt.plot(data_x2, data_y2, '-',color='green') #画出回归直线
plt.xlabel('Diameter')
plt.ylabel('Price')
plt.title('单变量线性回归')
plt.xlim(0,25)#x轴作图范围
plt.ylim(0,25)#y轴作图范围
plt.show()

hpyTrain=model.predict(x_train)
hpyTest =model.predict(x_test)
ssResTrain = sum((hpyTrain -y_train) ** 2)
ssResTest = sum((hpyTest  -y_test) ** 2)
ssTotTest = sum((y_test -np.mean(y_test)) ** 2)
Rsquare = 1 -ssResTest / ssTotTest
PredictPrice = str(model.predict([[12]])[0][0])[:5]
print('预测12英寸披萨价格为:',PredictPrice)
print("训练数据残差平方和:", ssResTrain[0])
print("测试数据残差平方和:", ssResTest[0])
print("测试数据偏差平方和:", ssTotTest[0])
print('模型准确率R方:', model.score(x_test,y_test))



'''
创建一个二位列表(data_x2)方便将方程直线绘制范围为增加到[0,25],
再使用predict函数进行预测出所对应的y值.
'model.intercept_'输出的数据是一个列表,'model.coef_'更是一个二位列表,
将他们转化成字符串,最后保留小数点后两位数字。
'''

结果分析:

得到斜率: 0.97,截距: 1.96,拟合直线方程为:y=0.97x+1.96;预测12英寸披萨价格为: 13.68;训练数据残差平方和: 8.747844827586203;测试数据残差平方和: 4.096806257431636

测试数据偏差平方和: 54.2;模型准确率R方: 0.9244131686820731。

说明该回归模型拟合效果很好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值