141、机器学习(入门):逻辑回归

1、什么是逻辑回归
逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logistic函数中,从而能够完成对事件发生的概率进行预测。
从大的类别上来说,逻辑回归是一种有监督的统计学习方法,主要用于对样本进行分类。
在线性回归模型中,输出一般是连续的,例如
y=f(x)=ax+b
对于每一个输入的x,都有一个对应的y输出。x和y都是连续型数据。但是对于逻辑回归,输入可以是连续的,但输出一般是离散的,即只有有限多个输出值。
所以逻辑回归不是一个回归类的模型,而是用于处理分类的问题,例如常见的二分类问题,抛硬币只有正面朝上和反面朝上两种结果,听一首歌只有喜欢和不喜欢两种可能,考试只有通过和不通过两种结果。

例如:
逻辑回归.jpg

2、逻辑回归与线性回归的关系

逻辑回归也被称为广义线性回归模型,它与线性回归模型的形式基本上相同,都具有 ax+b,其中a和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将ax+b作为因变量,即y = ax+b,而logistic回归则通过函数S将ax+b对应到一个隐状态p,p = S(ax+b),然后根据p与1-p的大小决定因变量的值。这里的函数S就是Sigmoid函数:
逻辑回归与线性回归关系.jpg

通过函数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、逻辑回归案例
在本案例中,主要研究学习时间与考试是否通过的预测,输出的结果只有通过和不通过两种,可以使用逻辑回归模型。

(1)先建立数据集,数据集中包含“学习时间”和“通过考试”,其中通过考试中使用标签0代表考试不通过,标签1代表考试通过:
1 建立数据集.png

(2)提取特征和标签,把“学习时间”作为特征,“通过考试”作为标签:
2 提取特征和标签.png

(3)绘制散点图,从散点图看出原始数据的分布情况:
3 绘制原始数据散点图.png

(4)建立训练数据集和测试数据集,按照%80训练数据和%20测试数据进行构建,并把数据集构建成散点图,方便后面评估模型:
4 建立训练数据集和测试数据集.png
4 数据集可视化.png

(5)构建模型,使用训练数据构建并训练逻辑回归模型:
5 构建模型.png

(6)评估模型:
6 评估模型.png

根据测试数据对模型进行评估,准确率为%100,,结合图4总数据集的散点图结果来看,这个模型的准确率还是非常高的,但是由于训练数据量偏少,准确率会存在误差,样本数据量越大,模型的准确率会越高。

(7)预测数据,当学习时间为3小时,模型对考试是否通过进行预测:
7 预测数据.png
8 理解逻辑回归函数.png

预测结果为通过考试,当我们输入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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容