引入:广义线性模型

上节讲到了一个简单的线性回归模型:

在实际的模型中,我们可以假设线性模型的预测值逼近

而非Y,即:

为单调可微函数,则:

上式即被称为广义线性模型

简介

逻辑回归模型可以看做是一种广义线性模型。考虑到二分类任务,其输出标记为0和1两个离散值,而线性回归模型产生的值为连续值,所以在做二分类任务时,我们需要找到一个函数将时值转换为0和1。最理想的函数是“单位阶跃函数”:

但单位阶跃函数不是可微函数,不能用于广义线性回归模型,故需找到一个“替代函数”,令其接近于“单位阶跃函数”,并单调可微。这个函数即是“逻辑函数”:

其函数图像为:

则可设y=1的概率为p,p满足如下广义线性模型:

其中:

当p>0.5时,y=1,否则y=0。

常用的运算类别为1的概率:

类别为0的概率:

类别为1的概率与类别为0的概率的比值:

示例—预测Titanic乘客是否能在事故中生还

读入并查看数据

import numpy as np

import pandas as pd

from sklearn import preprocessing

import matplotlib.pyplot as plt

plt.rc("font", size=14)

import seaborn as sns

sns.set(style="white") #设置seaborn画图的背景为白色

sns.set(style="whitegrid", color_codes=True)

# 将数据读入 DataFrame

df = pd.read_csv("./titanic_data.csv")

# 预览数据

print(df.shape)

df.head()

# 查看数据集中各个特征缺失的情况

df.isnull().sum()

输出结果为:

处理缺失数据

从以上的结果可以看出,年龄(age)和仓位(cabin)缺失较多。其中,年龄缺失 20.15%,仓位缺失77.48%。在这里我们选择对年龄进行填充处理,舍弃仓位数据,是否生还(Survived)为此次预测的目标,故舍弃无Survived数据的值。

处理年龄

先看一下年龄的分布情况。

ax = df["age"].hist(bins=15, color='teal', alpha=0.6)

ax.set(xlabel='age')

plt.xlim(-10,85)

plt.show()

print('The mean of "Age" is %.2f' %(df["age"].mean(skipna=True)))

# 年龄的中间值

print('The median of "Age" is %.2f' %(df["age"].median(skipna=True)))

从图中可以看出,“年龄”的偏度不为0, 故,使用均值替代缺失值不是最佳选择, 这里可以选择使用中间值替代缺失值。

登船地点

看一下登船地点的分布情况:

print('按照登船地点分组 (C = Cherbourg, Q = Queenstown, S = Southampton):')

print(df['embarked'].value_counts())

sns.countplot(x='embarked', data=df, palette='Set2')

plt.show()

由上图可以看出,登船地点为离散值,最多的为S,故将空值填为S。

处理如果一条数据的 "Age" 缺失, 使用年龄的中位数 28 替代.

如果一条数据的 "Embarked" 缺失, 使用登船地点的众数 “S” 替代.

由于太多乘客的 “Cabin” 数据缺失, 从所有数据中丢弃这个特征的值.

如果“Surviced”缺失,则舍弃。

data = df.copy()

data["age"].fillna(df["age"].median(skipna=True), inplace=True)

data["embarked"].fillna(df['embarked'].value_counts().idxmax(), inplace=True)

data.drop('cabin', axis=1, inplace=True)

data=data[data["survived"]>=0]

data.isnull().sum()

可以看出,只有1个fare的缺失,查看fare的情况:

ax = data["fare"].hist(bins=15, color='teal', alpha=0.6)

ax.set(xlabel='fare')

plt.xlim(0,520)

plt.show()

# fare的均值

print('The mean of "fare" is %.2f' %(data["fare"].mean(skipna=True)))

# fare的中间值

print('The median of "fare" is %.2f' %(data["fare"].median(skipna=True)))

故,fare用中间值14.45填充。

data["fare"].fillna(df["fare"].median(skipna=True), inplace=True)

处理过后的数据如下:

查看处理前后的年龄分布情况:

plt.figure(figsize=(15,8))

ax = df["age"].hist(bins=15, normed=True, stacked=True, color='teal', alpha=0.6)

df["age"].plot(kind='density', color='teal')

ax = data["age"].hist(bins=15, normed=True, stacked=True, color='orange', alpha=0.5)

data["age"].plot(kind='density', color='orange')

ax.legend(['Raw Age', 'Adjusted Age'])

ax.set(xlabel='Age')

plt.xlim(-10,85)

plt.show()

处理其他数据

预防多重共线性

数据中的两个特征 “sibsp” (一同登船的兄弟姐妹或者配偶数量)与“parch”(一同登船的父母或子女数量)都是代表是否有同伴同行. 为了预防这两个特征具有多重共线性, 我们可以将这两个变量转为一个变量 “TravelAlone” (是否独自一人成行)。

## 创建一个新的变量'TravelAlone'记录是否独自成行

data['TravelAlone']=np.where((data["sibsp"]+data["parch"])>0, 0, 1)

data.drop('sibsp', axis=1, inplace=True)

data.drop('parch', axis=1, inplace=True)

类别处理

对 “Embarked”,"Sex",可以将类别转换为数字。而“ticket”与“fare”重复,“name”每个人都不同,故 丢弃 'name', 'ticket'。

# 对 Embarked","Sex"进行独热编码, 丢弃 'name', 'ticket'

final =pd.get_dummies(data, columns=["embarked","sex"])

final.drop('name', axis=1, inplace=True)

final.drop('ticket', axis=1, inplace=True)

final.head()

直观分析

年龄分析

plt.figure(figsize=(15,8))

ax = sns.kdeplot(final["age"][final.survived == 1], color="darkturquoise", shade=True)

sns.kdeplot(final["age"][final.survived == 0], color="lightcoral", shade=True)

plt.legend(['Survived', 'Died'])

plt.title('Density Plot of Age for Surviving Population and Deceased Population')

ax.set(xlabel='Age')

plt.xlim(-10,85)

plt.show()

可以看出,生还与遇难群体的分布相似, 唯一大的区别是生还群体中用一部分低年龄的乘客. 说明当时的人预先保留了孩子的生还机会。

票价

plt.figure(figsize=(15,8))

ax = sns.kdeplot(final["fare"][final.survived == 1], color="darkturquoise", shade=True)

sns.kdeplot(final["fare"][final.survived == 0], color="lightcoral", shade=True)

plt.legend(['Survived', 'Died'])

plt.title('Density Plot of Fare for Surviving Population and Deceased Population')

ax.set(xlabel='Fare')

plt.xlim(-20,200)

plt.show()

生还与遇难群体的票价分布差异比较大, 说明这个特征对预测乘客是否生还非常重要. 票价和仓位相关, 也许是仓位影响了逃生的效果, 我们接下来看仓位的分析.

仓位

sns.barplot('pclass', 'survived', data=df, color="darkturquoise")

plt.show()

如我们所料, 一等舱的乘客生还几率最高.

登船地点

sns.barplot('embarked', 'survived', data=df, color="teal")

plt.show()

可以看出,从法国 Cherbourge 登录的乘客生还率最高。

是否独自成行

sns.barplot('TravelAlone', 'survived', data=final, color="mediumturquoise")

plt.show()

可以看出,独自成行的乘客生还率比较低. 当时的年代, 大多数独自成行的乘客为男性居多.

性别

sns.barplot('sex', 'survived', data=df, color="aquamarine")

plt.show()

很明显, 女性的生还率比较高。

使用Logistic Regression做预测

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

# 使用如下特征做预测

cols = ["age","fare","TravelAlone","pclass","embarked_C","embarked_S","sex_male"]

# 创建 X (特征) 和 y (类别标签)

X = final[cols]

y = final['survived']

# 将 X 和 y 分为两个部分

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)

# 检测 logistic regression 模型的性能

# TODO 添加代码:

# 1.训练模型,

# 2.根据模型, 以 X_test 为输入, 生成变量 y_pred

lr_model=LogisticRegression()

lr_model.fit(X_train, y_train)

y_pred=lr_model.predict(X_test)

print('Train/Test split results:')

print("准确率为 %2.3f" % accuracy_score(y_test, y_pred))

结果为:

Train/Test split results:

准确率为 0.836

准确率还可以接受。

orange实现逻辑回归_逻辑回归模型相关推荐

  1. 逻辑斯蒂回归 逻辑回归_逻辑回归简介

    逻辑斯蒂回归 逻辑回归 Logistic regression is a classification algorithm, which is pretty popular in some commu ...

  2. 逻辑斯蒂回归_逻辑回归 - 3 逻辑回归模型

    1 逻辑斯蒂回归模型 二项逻辑斯蒂回归模型是一种分类模型,由条件概率分布 表示,形式为参数化的逻辑斯蒂分布,这里随机变量 取值为实数,随机变量 取值为1或-1. 对于给定的输入实例 ,按照上面式可以求 ...

  3. orange实现逻辑回归_逻辑回归算法的原理及实现(LR)

    Logistic回归虽然名字叫"回归",但却是一种分类学习方法.使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素.逻辑回归(Logistic Regression, LR ...

  4. spark java 逻辑回归_逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件

    原标题:逻辑回归分类技术分享,使用Java和Spark区分垃圾邮件 由于最近的工作原因,小鸟很久没给大家分享技术了.今天小鸟就给大家介绍一种比较火的机器学习算法,逻辑回归分类算法. 回归是一种监督式学 ...

  5. 逻辑斯蒂回归_逻辑斯蒂回归详细解析 | 统计学习方法学习笔记 | 数据分析 | 机器学习...

    本文包括: 重要概念 逻辑斯蒂回归和线性回归 二项逻辑斯谛回归模型 逻辑斯蒂回顾与几率 模型参数估计 多项逻辑斯谛回归 其它有关数据分析,机器学习的文章及社群 1.重要概念: 在正式介绍逻辑斯蒂回归模 ...

  6. python逻辑回归_逻辑回归:使用Python的简化方法

    逻辑回归的目标是什么? 在逻辑回归中,我们希望根据一个或多个自变量(X)对因变量(Y)进行建模.这是一种分类方法.此算法用于分类的因变量.Y使用一个函数建模,该函数为X的所有值提供0到1之间的输出.在 ...

  7. python如何做混合模型面板回归_面板Tobit模型探究(二):模型讲解以及stata实现...

    第一部分   模型发展历史 Tobit模型从最初的结构式模型扩展到时间序列模型.面板数据模型以及非参数模型等形式,无论Tobit模型的结构形式如何变化,现有的估计方法基本上都是在Heckman(197 ...

  8. 优化 回归_使用回归优化产品价格

    优化 回归 应用数据科学 (Applied data science) Price and quantity are two fundamental measures that determine t ...

  9. python支持向量机回归_支持向量机回归的Scikitlearn网格搜索

    我正在学习交叉验证网格搜索,并遇到了这个youtube playlist,教程也作为ipython笔记本上传到了github.我试图在同时搜索多个参数部分重新创建代码,但我使用的不是knn,而是支持向 ...

最新文章

  1. 我们单位里新来的应届毕业生(转贴)
  2. 人生,能有多少个十年?| PMCAFF 十年故事
  3. 计算机二级2021辅导书,2021该如何准备计算机二级考试?
  4. 51nod 2020 排序相减(暴力解法)
  5. java方法和 IDEA Debug调试
  6. 【模板】最大密度子图
  7. Xception总结
  8. 线程安全的三大不安全案例以及解决方法
  9. 【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程
  10. 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...
  11. MYSQL数据库升级
  12. SQL超级简单的基础入门
  13. 一、SIM800C简介
  14. 概率论中经典概率模型
  15. SAVIOR Securing Autonomous Vehicles with Robust Physical Invariants 论文报告
  16. 《生物化学与分子生物学》----蛋白质----听课笔记(四)
  17. 【电驱动】驱动电机系统讲解
  18. Scrapy爬虫流程
  19. 开源的api文档管理系统
  20. pycharm-03-工程结构

热门文章

  1. 腾讯广告算法大赛 | 第三周周冠军心得分享
  2. 基于文本和语音的双模态情感分析
  3. 如何将先验知识注入推荐模型
  4. 超越SimCSE两个多点,Prompt+对比学习的文本表示新SOTA
  5. 跨境电子商务独立站如何找到热门的利基市场
  6. java等待页面加载_java selenium (十三) 智能等待页面加载完成
  7. 深度学习与神经网络——邱锡鹏
  8. 如何设置centos7的ip地址配置信息,让我的主机和它互Ping,以及远程登陆
  9. Leetcode每日一题:452.minimum-number-of-arrows-to-burst-balloons(最少数量的箭引爆气球)
  10. 数字信号处理2:傅里叶变换