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

## ▍前言

• 理解逻辑回归模型参数的含义
• 使用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)```

336 篇文章54 人订阅

0 条评论

## 相关文章

39130

### （数据科学学习手札36）tensorflow实现MLP

我们在前面的数据科学学习手札34中也介绍过，作为最典型的神经网络，多层感知机（MLP）结构简单且规则，并且在隐层设计的足够完善时，可以拟合任意连续函数，而除...

48540

368100

21890

33090

23030

28320

81540

### 干货 | 攻击AI模型之DeepFool算法

AI 科技评论按：本文为“兜哥带你学安全”系列之三，首发于AI科技评论，未经许可不得转载。

40330

48260