前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法】逐步在Python中构建Logistic回归

【算法】逐步在Python中构建Logistic回归

作者头像
陆勤_数据人网
发布2018-07-30 15:49:56
2.9K0
发布2018-07-30 15:49:56
举报
文章被收录于专栏:数据科学与人工智能

笔者邀请您,先思考:

1逻辑回归算法怎么理解?

2 如何用Python平台做逻辑回归?

logistic回归是一种机器学习分类算法,用于预测分类因变量的概率。 在逻辑回归中,因变量是一个二进制变量,包含编码为1(是,成功等)或0(不,失败等)的数据。 换句话说,逻辑回归模型基于X的函数预测P(Y = 1)。

Logistic回归假设

  • 二元逻辑回归要求因变量为二元的。
  • 对于二元回归,因变量的因子级别1应代表所需的结果。
  • 只应包含有意义的变量。
  • 自变量应相互独立。 也就是说,模型应该具有很少或没有多重共线性。
  • 自变量与对数几率线性相关。
  • Logistic回归需要非常大的样本量。

记住上述假设,让我们看一下我们的数据集。

数据探索

该数据集来自UCI机器学习库,它与葡萄牙银行机构的直接营销活动(电话)有关。 分类目标是预测客户是否将订阅(1/0)到定期存款(变量y)。 数据集可以从这里下载。

代码语言:javascript
复制
import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
plt.rc("font", size = 4)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid", color_codes=True)

数据集提供银行客户的信息。 它包括41,188条记录和21个字段。

代码语言:javascript
复制
data = pd.read_csv("raw_data/banking.csv", header=0)
data = data.dropna()
print(data.shape)
print(list(data.columns))
输入变量
  1. age(数字)
  2. job:工作类型(分类:管理员,蓝领,企业家,女佣,管理人员,退休人员,自雇人员,服务人员,学生,技术员,失业,未知)
  3. marital:婚姻状况(分类:离婚,已婚,单身,未知)
  4. education:教育(分类:“basic.4y”, “basic.6y”, “basic.9y”, “high.school”, “illiterate”, “professional.course”, “university.degree”, “unknown”)
  5. default:有信用违约吗?(分类:没有,有,未知)
  6. housing:有房贷吗?(分类:没有,有,未知)
  7. loan:有个人贷款吗?(分类:没有,有,未知)
  8. contact:联系沟通类型(分类:蜂窝,电话)
  9. month:联系的最后一个月份(分类:“jan”,“feb”,“mar”,…,“nov”,“dec”)
  10. day_of_week:一周中最后的联系日(分类:“mon”,“tue”,“wed”,“thu”,“fri”)
  11. duration:上次联系持续时间,以秒为单位(数字)。重要提示:此属性会严重影响输出目标(例如,如果持续时间= 0,则y ='否')。在执行呼叫之前不知道持续时间,也就是说,在呼叫结束之后,y显然是已知的。因此,此输入仅应包括在基准目的中,如果打算采用现实的预测模型,则应将其丢弃
  12. campaign:此广告系列期间和此客户端执行的联系人数量(数字,包括最后一次联系)
  13. pdays:从上一个广告系列上次联系客户端之后经过的天数(数字; 999表示之前未联系客户)
  14. previous:此广告系列之前和此客户端之间执行的联系人数量(数字)
  15. poutcome:上一次营销活动的结果(分类:“失败”,“不存在”,“成功”)
  16. emp.var.rate:就业变化率 - (数字)
  17. cons.price.idx:消费者价格指数 - (数字)
  18. cons.conf.idx:消费者信心指数 - (数字)
  19. euribor3m:euribor 3个月费率 - (数字)
  20. nr.employed:员工人数 - (数字)
预测变量(所需目标)

y - 客户是否订购了定期存款? (二进制:“1”表示“是”,“0”表示“否”)

因变量的条形图
代码语言:javascript
复制
sns.countplot(x = 'y', data=data, palette="hls")
plt.show()

如下图:

检查缺失值
代码语言:javascript
复制
print(data.isnull().sum())
客户工作类型分布
代码语言:javascript
复制
sns.countplot(y = "job", data=data)
plt.show()

如下图:

客户婚姻状态分布
代码语言:javascript
复制
sns.countplot(x = "marital", data=data)
plt.show()

如下图:

信用违约的条形图
代码语言:javascript
复制
sns.countplot(x="default", data=data)
plt.show()

如下图:

房贷条形图
代码语言:javascript
复制
sns.countplot(x="housing", data=data)
plt.show()

如下图:

个人贷条形图
代码语言:javascript
复制
sns.countplot(x="loan", data=data)
plt.show()

如下图:

先前的市场活动结果条形图
代码语言:javascript
复制
sns.countplot(x="poutcome", data=data)
plt.show()

如下图:

我们的预测将基于客户的工作,婚姻状况,他(她)是否有违约信用,他(她)是否有住房贷款,他(她)是否有个人贷款,以及之前营销的结果活动。 因此,我们将删除不需要的变量。

代码语言:javascript
复制
data.drop(data.columns[[0, 3, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19]], axis=1, inplace=True)

数据预处理

创建虚拟变量,即只有两个值的变量,零和一。 在逻辑回归模型中,将所有自变量编码为虚拟变量使得容易地解释和计算odds比,并且增加系数的稳定性和显着性。

代码语言:javascript
复制
data2 = pd.get_dummies(data, columns =['job', 'marital', 'default', 'housing', 'loan', 'poutcome'])
删除Unknown的列
代码语言:javascript
复制
print(data2.columns)
data2.drop(data2.columns[[12, 16, 18, 21, 24]], axis=1, inplace=True)
print(data2.columns)

完美! 正是我们后续步骤的需求。

检查自变量之间的独立性
代码语言:javascript
复制
sns.heatmap(data2.corr())
plt.show()

看起来不错。

将数据拆分为训练和测试集
代码语言:javascript
复制
X = data2.iloc[:,1:]
y = data2.iloc[:,0]
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
检查训练数据集就足够了
代码语言:javascript
复制
print(X_train.shape)

(30891, 23)

很好! 现在我们可以开始构建逻辑回归模型。

Logistic回归模型
训练集上拟合逻辑回归
代码语言:javascript
复制
classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train)
预测测试集结果并创建混淆矩阵

confusion_matrix()函数将计算混淆矩阵并将结果以数组返回。

代码语言:javascript
复制
y_pred = classifier.predict(X_test)
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)

结果告诉我们,我们有9046 + 229个正确的预测和912 + 110个不正确的预测。

准确性
代码语言:javascript
复制
print('Accuracy of logistic regression classifier on test set: {:.2f}'.format(classifier.score(X_test, y_test)))

Accuracy of logistic regression classifier on test set: 0.90

分类器可视化

本节的目的是可视化逻辑回归类规则器的决策边界。 为了更好地对决策边界进行可视化,我们将对数据执行主成分分析(PCA),以将维度降低到2维。

代码语言:javascript
复制
from sklearn.decomposition import PCA
X = data2.iloc[:,1:]
y = data2.iloc[:,0]
pca = PCA(n_components=2).fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(pca, y, random_state=0)

plt.figure(dpi=120)
plt.scatter(pca[y.values==0,0], pca[y.values==0,1], alpha=0.5, label='YES', s=2, color='navy')
plt.scatter(pca[y.values==1,0], pca[y.values==1,1], alpha=0.5, label='NO', s=2, color='darkorange')
plt.legend()
plt.title('Bank Marketing Data Set\nFirst Two Principal Components')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.gca().set_aspect('equal')
plt.show()

如下图:

代码语言:javascript
复制
def plot_bank(X, y, fitted_model):
    plt.figure(figsize=(9.8,5), dpi=100)
    for i, plot_type in enumerate(['Decision Boundary', 'Decision Probabilities']):
        plt.subplot(1,2,i+1)
        mesh_step_size = 0.01  # step size in the mesh
        x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
        y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
        xx, yy = np.meshgrid(np.arange(x_min, x_max, mesh_step_size), np.arange(y_min, y_max, mesh_step_size))
        if i == 0:
            Z = fitted_model.predict(np.c_[xx.ravel(), yy.ravel()])
        else:
            try:
                Z = fitted_model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
            except:
                plt.text(0.4, 0.5, 'Probabilities Unavailable', horizontalalignment='center',
                         verticalalignment='center', transform = plt.gca().transAxes, fontsize=12)
                plt.axis('off')
                break
        Z = Z.reshape(xx.shape)
        plt.scatter(X[y.values==0,0], X[y.values==0,1], alpha=0.8, label='YES', s=5, color='navy')
        plt.scatter(X[y.values==1,0], X[y.values==1,1], alpha=0.8, label='NO', s=5, color='darkorange')
        plt.imshow(Z, interpolation='nearest', cmap='RdYlBu_r', alpha=0.15,
                   extent=(x_min, x_max, y_min, y_max), origin='lower')
        plt.title(plot_type + '\n' +
                  str(fitted_model).split('(')[0]+ ' Test Accuracy: ' + str(np.round(fitted_model.score(X, y), 5)))
    plt.gca().set_aspect('equal');
    plt.tight_layout()
    plt.legend()
    plt.subplots_adjust(top=0.9, bottom=0.08, wspace=0.02)
model = LogisticRegression()
model.fit(X_train,y_train)
plot_bank(X_test, y_test, model)
plt.show()

如下图:

如您所见,PCA降低了Logistic回归模型的准确性。 这是因为我们使用PCA来减少维度,因此我们从数据中删除了信息。 我们将在以后的帖子中介绍PCA。 用于制作此文章的Jupyter笔记本可在此处获得。 我很乐意收到有关上述任何内容的反馈或问题。

作者:Susan Li 原文链接: https://datascienceplus.com/building-a-logistic-regression-in-python-step-by-step/

版权声明:作者保留权利,严禁修改,转载请注明原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学与人工智能 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Logistic回归假设
  • 数据探索
    • 输入变量
      • 预测变量(所需目标)
        • 因变量的条形图
          • 检查缺失值
            • 客户工作类型分布
              • 客户婚姻状态分布
                • 信用违约的条形图
                  • 房贷条形图
                    • 个人贷条形图
                      • 先前的市场活动结果条形图
                      • 数据预处理
                        • 删除Unknown的列
                          • 检查自变量之间的独立性
                            • 将数据拆分为训练和测试集
                              • 检查训练数据集就足够了
                                • Logistic回归模型
                                  • 训练集上拟合逻辑回归
                                    • 预测测试集结果并创建混淆矩阵
                                      • 准确性
                                      • 分类器可视化
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档