1、什么是逻辑回归
逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logistic函数中,从而能够完成对事件发生的概率进行预测。
从大的类别上来说,逻辑回归是一种有监督的统计学习方法,主要用于对样本进行分类。
在线性回归模型中,输出一般是连续的,例如
y=f(x)=ax+b
对于每一个输入的x,都有一个对应的y输出。x和y都是连续型数据。但是对于逻辑回归,输入可以是连续的,但输出一般是离散的,即只有有限多个输出值。
所以逻辑回归不是一个回归类的模型,而是用于处理分类的问题,例如常见的二分类问题,抛硬币只有正面朝上和反面朝上两种结果,听一首歌只有喜欢和不喜欢两种可能,考试只有通过和不通过两种结果。
2、逻辑回归与线性回归的关系
通过函数S的作用,我们可以将输出的值限制在区间[0, 1]上,p(x)则可以用来表示概率p(y=1|x),即当一个x发生时,y被分到1那一组的概率。最终为了得到y只有两种取值结果,可y现在一个区间[0, 1]内,需要将y的值在[0, 1]这个区间上选择一个阈值,通常是0.5,当y>0.5时,就将这个x归到1这一类,如果y<0.5就将x归到0这一类。这里阈值是可以根据实际情况调整的。
3、逻辑回归案例
在本案例中,主要研究学习时间与考试是否通过的预测,输出的结果只有通过和不通过两种,可以使用逻辑回归模型。
根据测试数据对模型进行评估,准确率为%100,,结合图4总数据集的散点图结果来看,这个模型的准确率还是非常高的,但是由于训练数据量偏少,准确率会存在误差,样本数据量越大,模型的准确率会越高。
预测结果为通过考试,当我们输入1个特征(学习时间3小时)时,返回标签0的概率值约等于0.397,返回标签1的概率值约为0.603 大于阀值0.5
由图中我们可以发现,当我们给定输入一个特征(学习时间3小时)的时候,可以返回其概率值,返回的第一个是其为0的概率值约为0.397,第二个是为1的概率值约为0.603。根据我们的决策面的结果,也就是x=3时候我们的logistic的函数值就是其为1的概率值。当这个值大于0.5的时候,我们做出决策,认为它的值为1,当这个概率值小于0.5的时候,我们做出决策,认为它的值为0。
在这里,我们发现,返回1的概率值为0.603大于0.5,所以在此模型下,我们做出决策,认为值为1,即通过考试,通过上文我们定义的字典数据,可以发现,我们的决策是正确的。
源码:
# coding: utf-8
# ### 建立数据集
# In[1]:
from collections import OrderedDict
import numpy as np
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],
'通过考试':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
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]:
'''
因样本数据中只有一个特征,而sklearn要求输入的特征必须是二维数组的类型,
因此需要用reshape转行成二维数组的类型,否则会报错。
'''
# 将训练数据特征转换成二维数组XX行*1列
X_train = X_train.values.reshape(-1,1)
# 将测试数据特征转换成二维数组XX行*1列
X_test = X_test.values.reshape(-1,1)
# 导入逻辑回归包
from sklearn.linear_model import LogisticRegression
# 创建模型:逻辑回归
model = LogisticRegression()
# 训练模型
model.fit(X_train,y_train)
# ### 使用测试数据评估模型
# In[9]:
# 评估模型:准确率
model.score(X_test,y_test)
# ### 理解逻辑函数,并预测数据
# In[10]:
'''
当输入学生特征学习时间为3小时,使用模型predict_proba方法会返回标签概率值
第一个值是标签为0的概率值,第二个值是标签为1的概率值
'''
# 获取概率值
model.predict_proba(3)
# In[11]:
# 预测数据: 使用模型的predict的方法进行预测
# 在这里输入学生的特征学习时间为3小时,模型会返回结果标签
pred = model.predict([[3]])
print(pred)
# In[12]:
'''
理解逻辑回归函数
斜率slope
截距intercept
'''
# 第1步:得到回归方程的z值
# 回归方程:z=a+bx
# 截距
a = model.intercept_
# 回归系数
b = model.coef_
# 学习时间为3小时
x = 3
z = a+b*x
# 第2步:将z值代入逻辑回归的函数中,得到概率值
y_pred = 1/(1+np.exp(-z))
print('预测的概率值:',y_pred)