# 【机器学习笔记】：逻辑回归实战练习（二）

## ▍前言

• 理解逻辑回归模型参数的含义
• 使用sklearn构建逻辑回归模型
• 可视化逻辑回归分类效果
• 评估逻辑回归模型

## ▍两个变量的简单数据集

```import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LogisticRegression

# 导入数据集
X = dataset.iloc[:, [2, 3]].values
Y = dataset.iloc[:,4].values

# 将数据集分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)
y_test = pd.Series(y_test)

# 简单的预处理，特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# 构建模型，预测测试集结果
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
```

```from matplotlib.colors import ListedColormap
X_set,y_set=X_train,y_train
X1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
np.arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))

plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('#C65749', '#338DFF')))
plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
for i,j in enumerate(np. unique(y_set)):
plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
c = ListedColormap(('red', 'blue'))(i), label=j)

plt. title(' LOGISTIC(Training set)')
plt. xlabel(' Age')
plt. ylabel(' Estimated Salary')
plt. legend()
plt. show()

X_set,y_set=X_test,y_test
X1,X2=np. meshgrid(np. arange(start=X_set[:,0].min()-1, stop=X_set[:, 0].max()+1, step=0.01),
np. arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step=0.01))

plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
alpha = 0.75, cmap = ListedColormap(('#C65749', '#338DFF')))
plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
for i,j in enumerate(np. unique(y_set)):
plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
c = ListedColormap(('red', 'blue'))(i), label=j)

plt.title(' LOGISTIC(Test set)')
plt.xlabel(' Age')
plt.ylabel(' Estimated Salary')
plt.legend()
plt.show()
```

Python语言方面：使用了meshgrid方法将二维坐标划分成了间隔非常小的矩阵细小点，然后使用了contourf方法与模型预测结果对比判断分类结果。此外，使用了scatter散点图绘制了原数据分布点作为分类前后的比对。

## ▍更多变量的数据集

https://www.kaggle.com/c/titanic/data

```from sklearn.linear_model import LogisticRegression

classifier_default = LogisticRegression()
classifier_default
```

```LogisticRegression(C=1.0,
class_weight=None,
dual=False,
fit_intercept=True,
intercept_scaling=1,
max_iter=100,
multi_class='ovr',
n_jobs=1,
penalty='l2',
random_state=None,
solver='liblinear',
tol=0.0001,
verbose=0,
warm_start=False)```

## ▍Logistic模型参数解释

• C：C参数与惩罚系数成反比，C值越小，则正则化效果越强，即对参数的惩罚程度越大。
• penalty：提供我们正则化的类型，L1范数正则化和L2范数正则化（在线性回归中相当于lasso回归和岭回归），默认情况下使用L2正则化，但此参数也需要与solver类型配合使用，因为一些solver有一些限制。关于L1和L2正则化的区别和理解后续进行介绍。

• max_iter：参数求解的迭代次数，默认100。迭代次数过小会影响准确率，迭代次数过高会影响速度，一般会折中考虑。
• tol：残差收敛条件，即迭代的连续两次之间残差小于tol就停止，默认是0.0001。

OvR相对简单，但分类效果相对略差（这里指大多数样本分布情况，某些样本分布下OvR可能更好）。而MvM分类相对精确，但是分类速度没有OvR快。如果选择了ovr，则4种损失函数的优化方法liblinear，newton-cg, lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。

## ▍Logistic模型参数调试

```# 配置调节参数
C_list = [0.0001, 1, 1000]
max_iter_list = [1, 50, 100]
classifiers = ClassifierGenerator('C', C_list)
Auc_plot(classifiers, X_test, 'C')
```

```# 配置调节参数
C_list = [0.0001, 1, 1000]
max_iter_list = [1, 100]
classifiers = ClassifierGenerator('max_iter', max_iter_list)
Auc_plot(classifiers, X_test, 'max_iter')
```

## ▍自动化查找最优参数

sklearn中提供了一种自动搜索最优参数的方法：GridSearchCV，它是基于提供的参数选项，组合出各种可能，然后结合交叉验证对所有可能组合进行筛选。因此，通过使用该方法，我们就可以简单地找到相对上面单独参数调节更好的参数组合了。

```from sklearn.model_selection import GridSearchCV
import warnings
warnings.filterwarnings("ignore")

# 参数设置
params = {'C':[0.0001, 1, 100, 1000],
'max_iter':[1, 10, 100, 500],
'class_weight':['balanced', None],
'solver':['liblinear','sag','lbfgs','newton-cg']
}
lr = LogisticRegression()
clf = GridSearchCV(lr, param_grid=params, cv=10)
clf.fit(X_train,y_train)```

```>>clf.best_params_

out:
{'C': 1, 'class_weight': None, 'max_iter': 10, 'solver': 'sag'}
```

## ▍构建最优模型

```# 根据以上绘图结果选择一个合理参数值
classifier = LogisticRegression(**clf.best_params_)
# 训练模型
classifier.fit(X_train, y_train)

# 预测测试集结果
y_pred = classifier.predict(X_test)
y_score = classifier.predict_proba(X_test)[:,1]
```

```# roc/auc计算
y_score = classifier.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
roc_auc = metrics.auc(fpr,tpr)

# 绘制roc曲线
f,ax = plt.subplots(figsize=(8,6))
plt.stackplot(fpr, tpr, color='#338DFF', alpha = 0.5, edgecolor = 'black')
plt.plot(fpr, tpr, color='black', lw = 1.5)
plt.plot([0,1],[0,1], color = 'red', linestyle = '--', lw = 2)
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
plt.show()```
```from ks_visual import plot_ks
# 观察ks指标，并绘制ks曲线
plot_ks(y_test = y_test, y_score = y_score, pf = 1)
```

0 条评论

• ### 如何用「Why-What-How」建立数据分析思维模型 ？

「Why-What-How」在讲解概念和执行上是个不错的思维模型，本文依例按此框架来拆分「数据分析」。相信很多朋友已经有了较丰富的分析经验，这里权且从个人的角度...

• ### 时间序列预测模型-ARIMA原理及Python实现！

在介绍本篇的内容之前，我们先来看一下本文用到的数据。本文用到的中国银行股票数据下载：http://pan.baidu.com/s/1gfxRFbH。

• ### 3个最常用的分类模型评估指标！

针对二元分类结果，常用的评估指标有如下三个：查准率（Precision）、查全率（Recall）以及F-score。这篇文章将讨论这些指标的含义、设计初衷以及局...

• ### 【机器学习笔记】：逻辑回归实战练习（二）

前几篇介绍了逻辑回归在机器学习中的重要性：5个原因告诉你：为什么在成为数据科学家之前，“逻辑回归”是第一个需要学习的

• ### 几款整站抓取的工具

Teleport Ultra所能做的，不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能)，它可以从Internet的任何地方抓回你...

• ### 5款整站下载器

有的人利用整站下载工具下载网站到本地进行慢慢的欣赏，有的人利用全站下载工具创建垃圾站。不管你是出于什么样的目的，下面这些工具软件你可以会需要。

• ### 再谈<全栈架构师> 一文

在SDCC2016的架构师进阶之路主题，我分享了《老曹眼中的全栈架构师》话题，会后在csdn博客（http://blog.csdn.net/wi...

• ### 【Web技术】259- Lerna包管理

导读：本章节主要讲解Lerna是什么，Lerna有什么用，如何使用Lerna进行npm包管理，大厂的Lerna版本管理策略是怎么做的，Lerna是如何实现本地包...

• ### 58 页 PPT 揭示图神经网络研究最新进展

该PPT作者为图神经网络领域权威、斯坦福大学副教授Jure Leskovec，其也是图表示学习方法 node2vec 和 GraphSAGE 作者之一。为作者前...

• ### 机器学习| 第二周：监督学习（1）『附学习资源』

刚开始入门机器学习，好的学习路径非常重要，以下是我个人最近学习机器学习的心得，与大家分享。