140、机器学习(入门):简单线性回归

一、什么是机器学习?
机器学习是人工智能的一种技术。
机器学习的本质其实就是通过训练集建立一个模型,而后可以通过这个模型实现对于特征的识别,得出结果标签,而这个模型可以是多种多样的,简单线性回归模型只是其中的最基础最简单的一种模型。
二、机器学习的步骤
1、提出问题
一切机器学习的目标都是为了解决我们生活或工作中遇到的实际问题。
2、理解数据
理解数据包括三方面内容:
一是采集数据,根据研究问题采集相关的数据。
二是导入数据,将存放各个地方的数据导入到PYTHON数据结构中,比如读取数据到PYTHON的数据框中。
三是查看数据集信息,包括描述统计信息,从整体上理解这个数据。
3、数据清洗
数据清洗也叫数据预处理,就是对数据进行整容整成我们希望的样子,这个过程实质是从数据集中提取我们想要的特征信息。
4、构建模型
使用训练数据构建模型,就是使用上面第3部分的特征放入机器学习的算法中获得数据标签。机器学习里面最核心的就是机器学习的算法,而机器学习会有不同的算法。
5、评估
有了模型以后,要对这个模型进行评估。通过测试数据来评估模型的预测效果如何。
三、线性回归
1、相关性分析
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度。

以双变量为例,变量X和变量Y之间存在三种关系:正线性相关、负线性相关、不是线性相关(有可能是曲线相关,只不过不是线性的):
1相关性3种关系.jpg

2、衡量相关性程度

(1)判断两个变量的相关性方向是正线性相关或负线性相关:
2相关性方向.jpg

如果两个变量是同方向变化:
3同方向变化.jpg

如果两个变量是反方向变化:
4反方向变化.jpg

(2)为表示两个变量相关性程度,需要引入两个统计量,协方差和相关系数
a、协方差
协方差计算公式为:cov(X,Y) = E[(X-E[X])(Y-E[Y])]

两个数据点的协方差计算公式:
5协方差公式.jpg

b、相关系数
相关系数是标准化后的协方差,消除了变量变化幅度的影响,表示变量每单位变化的相似程度。

相关系数计算公式:
6相关系数公式.jpg

衡量相关性程度最重要的一点是看相关系数:
I、如果相关系数小于0,则为负线性相关,大于0 ,则为正线性相关。

II、相关系数的取值范围为-1之1间,越靠近-1或者1则相关性越强。相关系数在0至0.3或-0.3至0表示相关性较弱,0.3至0.6或-0.6至-0.3表示中等程度相关,0.6至1或-1至-0.6表示变量强相关。如下图所示:
7相关系数分类.jpg

3、最佳拟合线

在散点图上绘制一条直线,使得这条直线尽可能多通过数据点,要求出最佳拟合线需要求出回归方程y=a+bx,其中a为截距,b为回归系数,在方程中使得y的实际观察值与每个x相对应的y的估计值的差距为最小,即通过最小二乘法拟合:
8最佳拟合线.jpg
9最佳拟合线2.jpg

4、评估模型精确度
可以使用决定系数R平方来评估模型精确度

如下图1和图2所示,图2比图1数据集多,点误差平方和比图1大,但这并不能说明图2精确度比图1小:
10如何评估模型.jpg

此时需要引入决定系数R平方:

决定系数R平方.jpg

决定系数R平方的两个作用是:
(1)描述有多少百分比的y波动可以由回归线来描述(即x的波动变化);
(2)决定系数R平方的值越高,回归模型越精确。
四、简单线性回归案例
本次案例的目的是:为了了解学习时间与考试成绩的关系,并通过建立模型,预测考试成绩。

(1)先创建数据集并提取特征和标签:
21.png

(2)通过绘制原始数据的散点图,看看学习时间与考试成绩是否存在线性相关:
22.png

(3)通过散点图发现学习时间与考试成绩符合线性回归的模式,为了构建模型先要建立训练数据和测试数据:
23.png

(4)接着描绘训练数据和测试数据图像:
24.png

(5)构建线性回归模型:
25.png

(6)在构建模型时代码发生报错,此时需要分析报错的原因,通过报错信息知道,报错的原因是输入的特征只有一个,需要改变数组类型,具体实现如下:
26.png

(7)找出最佳拟合线:
27.png

(8)绘制最佳拟合线的图像:
28.png

(9)构建相关系数矩阵:
29.png

(10)求出决定系数R平方:
30.png

(11)通过测试数据进行评估模型:
31.png

结论:通过上面的求出决定系数R平方为0.929,决定系数R平方非常接近1,决定系数R平方越大说明学习时间与考试成绩成正线性相关,即学习时间越长,考试成绩越好。

源码:

# coding: utf-8

# ### 创建数据集并提取特征和标签

# In[1]:


#  导入相关模块
from collections import OrderedDict
import pandas as pd


# In[2]:


# 数据集
examDict={
    '学习时间':[0.5,0.75,1,1.25,1.5,1.75,1.75,2,2.25,2.5,
                2.75,3,3.25,3.5,4,4.25,4.5,4.75,5,5.5],
    '分数':[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)


# In[3]:


examDf.head()


# In[4]:


# 提取特征和标签 
# 特征features
exam_X=examDf.loc[:,'学习时间']
# 标签labes
exam_y=examDf.loc[:,'分数']


# ### 描绘原始数据图像

# In[5]:


# 绘制散点图
import matplotlib.pyplot as plt
# 画图时用于显示中文字符
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑体的意思

# 散点图
plt.scatter(exam_X,exam_y,color='b',label='考试数据')

# 添加图标标签
plt.xlabel('时间')
plt.ylabel('分数')
# 显示图像
plt.show()


# ### 建立训练数据和测试数据

# In[6]:


'''
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=0.8)

# 输出数据大小
print('原始数据特征:',exam_X.shape,
      ',训练数据特征:',X_train.shape,
      ',测试数据特征:',X_test.shape)

print('原始数据标签:',exam_y.shape,
      ',训练数据标签:',y_train.shape,
      ',测试数据标签:',y_test.shape)


# ### 描绘训练数据和测试数据图像

# In[7]:


# 绘制散点图
plt.scatter(X_train,y_train,color='blue',label='训练数据')
plt.scatter(X_test,y_test,color='red',label='测试数据')

# 添加图标标签
plt.legend(loc=2)
plt.xlabel('学习时间')
plt.ylabel('分数')
# 显示图像
plt.show()


# ### 构建训练模型

# In[8]:


# 第1步:导入线性回归
from sklearn.linear_model import LinearRegression
# 第2步:创建模型:线性回归
model = LinearRegression()
# 第3步:训练模型
model.fit(X_train,y_train)


# In[9]:


'''
上面的代码出现报错,报错的原因是输入的特征只有一个,
sklearn要求输入的特征必须是二维数组的类型,但是因为我们目前只有1个特征,
所以需要用array.reshape(-1, 1)转行成二维数组的类型。
reshape行的参数是-1,就会根据所给的列数,自动按照原始数组的大小形成一个新的数组
'''
# 将训练数据特征转化成二维数组XX行*1列形式
X_train = X_train.values.reshape(-1,1)
# 将测试数据特征转化为二维数组XX行*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)


# ### 最佳拟合线

# In[10]:


'''
拟合最佳的直线:z=a+bx
截距intercept:a
回归系数:b
'''

# 截距
a = model.intercept_
# 回归系数
b = model.coef_

print('最佳拟合线:截距a=',a,',回归系数b=',b)


# In[11]:


# 绘图
# 训练数据散点图
plt.scatter(X_train,y_train,color='blue',label='训练数据')

# 训练数据的预测值
y_train_pred = model.predict(X_train)
# 绘制最佳拟合线
plt.plot(X_train,y_train_pred,color='black',linewidth=3,label='最佳拟合线')

# 添加图标标签
plt.legend(loc=2) 
plt.xlabel='时间'
plt.ylabel='得分'
# 显示图像
plt.show()


# In[12]:


# 相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf = examDf.corr()
print('相关系数矩阵:')
rDf


# ### 评估模型

# In[13]:


# 线性回归的score方法得到的是决定系数R平方
# 评估模型:决定系数R平方
model.score(X_test,y_test)


# In[14]:


# 绘图
# 训练数据散点图
plt.scatter(X_train,y_train,color='blue',label='训练数据')

# 训练数据的预测值
y_train_pred = model.predict(X_train)
# 绘制最佳拟合线
plt.plot(X_train,y_train_pred,color='black',linewidth=3,label='最佳拟合线')

# 测试数据散点图
plt.scatter(X_test,y_test,color='red',label='测试数据')

# 添加图标标签
plt.legend(loc=2) 
plt.xlabel='时间'
plt.ylabel='得分'
# 显示图像
plt.show()

推荐阅读更多精彩内容