一、概念
线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
下面是《商务与经济统计》对简单线性回归的知识点
简单线性回归知识点
二、建立简单线性模型的要点
自变量为特征,预测值为标签。通过模型,输入特征,得到标签。
1、建模步骤:
三、案例分析
通过一组记录学习时间与取得成绩数据,进行机器学习,得出简单线性回归模型,并对利用测试数据对模型进行评估过。
3.1 提出问题
学习时间与成绩的关系,如何通过学习时间预测成绩
#导入有序字典,pandas模块
导入数据,并建立数据框
#数据集
examDict={
'LearnTime':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,
2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
'Score': [10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
3.2 理解数据
查看数据
examDf.head()
可以看出数据记录的是学习的小时数与所得成绩。
3.3 数据清洗
#查看数据类型与缺失情况
examDf.info()
数据信息
可以看出数据没有缺失值,数据类型可以直接回归,不需要进一步处理
3.4 构建模型
#提取特征和标签
#特征features
exam_X=examDf.loc[:,'LearnTime']
#标签labes
exam_y=examDf.loc[:,'Score']
#绘制散点图
import matplotlib.pyplot as plt
#散点图
plt.scatter(exam_X, exam_y, color="g", label="exam data")
#添加图标标签
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
所有数据情况
'''
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训练数据(train)和测试数据(test)
第一个参数:所要划分的样本特征
第二个参数:所要划分的样本标签
train_size:训练数据占比,如果是整数的话就是样本的数量
'''
from sklearn.cross_validation import train_test_split
#建立训练数据和测试数据
X_train , X_test , y_train , y_test = train_test_split(exam_X ,
exam_y ,
train_size = .8)
#输出数据大小
print('原始数据特征:',exam_X.shape ,
',训练数据特征:', X_train.shape ,
',测试数据特征:',X_test.shape )
print('原始数据标签:',exam_y.shape ,
'训练数据标签:', y_train.shape ,
'测试数据标签:' ,y_test.shape)
数据划分情况
#绘制散点图
import matplotlib.pyplot as plt
#散点图
plt.scatter(X_train, y_train, color="g", label="train data")
plt.scatter(X_test, y_test, color="r", label="test data")
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.show()
训练数据、测试数据散点图
'''
reshape改变数组类型,sklearn要求输入的特征必须是二维数组的类型。
'''
#将训练数据特征转换成二维数组XX行*1列
X_train=X_train.values.reshape(-1,1)
#将测试数据特征转换成二维数组行数*1列
X_test=X_test.values.reshape(-1,1)
#第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
#第3步:训练模型
model.fit(X_train , y_train)
建立模型
'''
最佳拟合线:z= + x
截距intercept:a
回归系数:b
'''
#截距
a=model.intercept_
#回归系数
b=model.coef_
print('最佳拟合线:截距a=',a,',回归系数b=',b)
建立模型
#绘图
import matplotlib.pyplot as plt
#训练数据散点图
plt.scatter(X_train, y_train, color='g', label="train data")
#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
拟合曲线
#相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf=examDf.corr()
print('相关系数矩阵:')
rDf
相关系数矩阵
3.5 评估模型
#线性回归的scroe方法得到的是决定系数R平方
#评估模型:决定系数R平方
model.score(X_test , y_test)
模型的准确达88.81%,这是数据量较小下的拟合。
#绘图
import matplotlib.pyplot as plt
#训练数据散点图
plt.scatter(X_train, y_train, color='blue', label="train data")
#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
#测试数据散点图
plt.scatter(X_test, y_test, color='red', label="test data")
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()