机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测

1.学习目标

  • 了解 逻辑回归 的理论
  • 掌握 逻辑回归 的 sklearn 函数调用使用并将其运用到鸢尾花数据集预测
2.逻辑回归简介 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,并且广泛应用于各个领域之中。虽然现在深度学习相对于这些传统方法更为火热,但实则这些传统方法由于其独特的优势依然广泛应用于各个领域中。
【机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测】而对于逻辑回归而言,最为突出的两点就是其模型简单和模型的可解释性强。
逻辑回归模型的优劣势:
优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;
缺点:容易欠拟合,分类精度可能不高。
3.逻辑回归的原理 逻辑回归,也叫作 logistic 回归。虽然名字中带有“回归”,但它实际上是分类方法,主要解决的是二分类问题,当然它也可以解决多分类问题,只是二分类更常见一些。
在逻辑回归中使用了 Logistic 函数,也称为 Sigmoid 函数。Sigmoid 函数是在深度学习中经常用到的函数之一,函数公式为:
机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

函数的图形如下所示,类似 S 状:
机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

可以看出g(z) 的结果在 0-1 之间,当 z 越大的时候,g(z) 越大,当 z 趋近于无穷大的时候,g(z) 趋近于 1。同样当 z 趋近于无穷小的时候,g(z) 趋近于 0。同时,函数值以 0.5 为中心。
将回归方程写入其中为:机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

所以,机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

对于模型的训练而言:实质上来说就是利用数据求解出对应的模型的特定的ω。从而得到一个针对于当前数据的特征逻辑回归模型。
为什么逻辑回归算法是基于 Sigmoid 函数实现的呢?你可以这样理解:我们要实现一个二分类任务,0 即为不发生,1 即为发生。我们给定一些历史数据 X 和 y。其中 X 代表样本的 n 个特征,y 代表正例和负例,也就是 0 或 1 的取值。通过历史样本的学习,我们可以得到一个模型,当给定新的 X 的时候,可以预测出 y。这里我们得到的 y 是一个预测的概率,通常不是 0% 和 100%,而是中间的取值,那么我们就可以认为概率大于 50% 的时候,即为发生(正例),概率小于 50% 的时候,即为不发生(负例)。这样就完成了二分类的预测。
而对于多分类而言,将多个二分类的逻辑回归组合,即可实现多分类。
4.sklearn 中的逻辑回归工具 在 sklearn 中,我们使用 LogisticRegression() 函数构建逻辑回归分类器,函数里有一些常用的构造参数
penalty:惩罚项,取值为 l1 或 l2,默认为 l2。当模型参数满足高斯分布的时候,使用 l2,当模型参数满足拉普拉斯分布的时候,使用 l1;
solver:代表的是逻辑回归损失函数的优化方法。有 5 个参数可选,分别为 liblinear、lbfgs、newton-cg、sag 和 saga。默认为 liblinear,适用于数据量小的数据集,当数据量大的时候可以选用 sag 或 saga 方法。
max_iter:算法收敛的最大迭代次数,默认为 10。
n_jobs:拟合和预测的时候 CPU 的核数,默认是 1,也可以是整数,如果是 -1 则代表 CPU 的核数。
当我们创建好之后,就可以使用 fit 函数拟合,使用 predict 函数预测。
5.基于鸢尾花的数据分类预测 本次我们选择鸢花数据(iris)进行方法的尝试训练,该数据集一共包含5个变量,其中4个特征变量,1个目标分类变量。共有150个样本,目标变量为 花的类别 其都属于鸢尾属下的三个亚属,分别是山鸢尾 (Iris-setosa),变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。包含的三种鸢尾花的四个特征,分别是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm),这些形态特征在过去被用来识别物种。
#基于鸢尾花的分类预测练习代码

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns

#导入sklearn自带的iris数据 from sklearn.datasets import load_iris #利用pandas转化为DataFrame格式 data = https://www.it610.com/article/load_iris() iris_target = data.target iris_features = pd.DataFrame(data=data.data,columns=data.feature_names)

iris_features.info()

RangeIndex: 150 entries, 0 to 149 Data columns (total 4 columns): sepal length (cm)150 non-null float64 sepal width (cm)150 non-null float64 petal length (cm)150 non-null float64 petal width (cm)150 non-null float64 dtypes: float64(4) memory usage: 4.8 KB

iris_features.head()

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
iris_features.tail()

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
#对应的类别标签 iris_target

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

iris_features.describe()

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
#利用value_counts函数查看每个类别数量 pd.Series(iris_target).value_counts()

250 150 050 dtype: int64

#合并标签和特征信息 iris_all = iris_features.copy() #进行浅拷贝,防止对于原始数据的修改 iris_all['target'] = iris_target

# 特征与标签组合的散点可视化 #在2D情况下不同的特征组合对于不同类别的花的散点分布,以及大概的区间。 sns.pairplot(data=https://www.it610.com/article/iris_all,diag_kind='hist', hue= 'target') plt.show()

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

#利用箱型图得到不同类别在不同特征上的分布差异情况。 for col in iris_features.columns: sns.boxplot(x='target', y=col, saturation=0.5, palette='pastel', data=https://www.it610.com/article/iris_all) plt.title(col) plt.show()

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

# 选取其前三个特征绘制三维散点图 from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure(figsize=(10,8)) ax = fig.add_subplot(111, projection='3d')iris_all_class0 = iris_all[iris_all['target']==0].values iris_all_class1 = iris_all[iris_all['target']==1].values iris_all_class2 = iris_all[iris_all['target']==2].values # 'setosa'(0), 'versicolor'(1), 'virginica'(2) ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa') ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor') ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica') plt.legend()plt.show()

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

from sklearn.model_selection import train_test_split ##选择其类别为0和1的样本(不包括类别为2的样本) iris_features_part=iris_features.iloc[:100] iris_target_part=iris_target[:100] ##测试集大小为20%,80%/20%分 x_train,x_test,y_train,y_test=train_test_split(iris_features_part,iris_target_part,test_size=0.2,random_state=2020)

从sklearn中导入逻辑回归模型 from sklearn.linear_model import LogisticRegression

#定义逻辑回归模型 clf=LogisticRegression(random_state=0,solver='lbfgs')

#在训练集上训练逻辑回归模型 clf.fit(x_train,y_train)

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=0, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False)

#查看其对应的w print('the weight of Logistic Regression:',clf.coef_) #查看其对应的w0 print('the intercept(w0) of Logistic Regression:',clf.intercept_)

the weight of Logistic Regression: [[ 0.45244919 -0.810105832.147003850.90450733]] the intercept(w0) of Logistic Regression: [-6.57504448]

#在训练集和测试集上分布利用训练好的模型进行预测 train_predict=clf.predict(x_train) test_predict=clf.predict(x_test)

from sklearn import metrics #利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果 print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict)) print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict)) #查看混淆矩阵(预测值和真实值的各类情况统计矩阵) confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test) print('The confusion matrix result:\n',confusion_matrix_result) #利用热力图对于结果进行可视化 plt.figure(figsize=(8,6)) sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues') plt.xlabel('Predictedlabels') plt.ylabel('Truelabels') plt.show()

The accuracy of the Logistic Regression is: 1.0 The accuracy of the Logistic Regression is: 1.0 The confusion matrix result: [[ 90] [ 0 11]]

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

#我们可以发现其准确度为1,代表所有的样本都预测正确了。

#利用 逻辑回归模型 在三分类(多分类)上 进行训练和预测 #测试集大小为20%,80%/20%分 x_train,x_test,y_train,y_test=train_test_split(iris_features,iris_target,test_size=0.2,random_state=2020)

#定义逻辑回归模型 clf=LogisticRegression(random_state=0,solver='lbfgs')

#在训练集上训练逻辑回归模型 clf.fit(x_train,y_train)

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=0, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False)

#查看其对应的w print('the weight of Logistic Regression:\n',clf.coef_) #查看其对应的w0 print('the intercept(w0) of Logistic Regression:\n',clf.intercept_) #由于这个是3分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类

the weight of Logistic Regression: [[-0.435388570.87888013 -2.19176678 -0.94642091] [-0.39434234 -2.64609850.76204684 -1.35386989] [-0.008063120.113048462.529743432.3509289 ]] the intercept(w0) of Logistic Regression: [6.306208758.25761672 -16.63629247]

#在训练集和测试集上分布利用训练好的模型进行预测 train_predict=clf.predict(x_train) test_predict=clf.predict(x_test) #由于逻辑回归模型是概率预测模型(前文介绍的p=p(y=1|x,\theta)),所有我们可以利用predict_proba函数预测其概率train_predict_proba=clf.predict_proba(x_train) test_predict_proba=clf.predict_proba(x_test)print('The test predict Probability of each class:\n',test_predict_proba) #其中第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。#利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果 print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict)) print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))

The test predict Probability of each class: [[1.32525870e-04 2.41745142e-01 7.58122332e-01] [7.02970475e-01 2.97026349e-01 3.17667822e-06] [3.37367886e-02 7.25313901e-01 2.40949311e-01] [5.66207138e-03 6.53245545e-01 3.41092383e-01] [1.06817066e-02 6.72928600e-01 3.16389693e-01] [8.98402870e-04 6.64470713e-01 3.34630884e-01] [4.06382037e-04 3.86192249e-01 6.13401369e-01] [1.26979439e-01 8.69440588e-01 3.57997319e-03] [8.75544317e-01 1.24437252e-01 1.84312617e-05] [9.11209514e-01 8.87814689e-02 9.01671605e-06] [3.86067682e-04 3.06912689e-01 6.92701243e-01] [6.23261939e-03 7.19220636e-01 2.74546745e-01] [8.90760124e-01 1.09235653e-01 4.22292409e-06] [2.32339490e-03 4.47236837e-01 5.50439768e-01] [8.59945211e-04 4.22804376e-01 5.76335679e-01] [9.24814068e-01 7.51814638e-02 4.46852786e-06] [2.01307999e-02 9.35166320e-01 4.47028801e-02] [1.71215635e-02 5.07246971e-01 4.75631465e-01] [1.83964097e-04 3.17849048e-01 6.81966988e-01] [5.69461042e-01 4.30536566e-01 2.39269631e-06] [8.26025475e-01 1.73971556e-01 2.96936737e-06] [3.05327704e-04 5.15880492e-01 4.83814180e-01] [4.69978972e-03 2.90561777e-01 7.04738434e-01] [8.61077168e-01 1.38915993e-01 6.83858427e-06] [6.99887637e-04 2.48614010e-01 7.50686102e-01] [5.33421842e-02 8.31557126e-01 1.15100690e-01] [2.34973018e-02 3.54915328e-01 6.21587370e-01] [1.63311193e-03 3.48301765e-01 6.50065123e-01] [7.72156866e-01 2.27838662e-01 4.47157219e-06] [9.30816593e-01 6.91640361e-02 1.93708074e-05]] The accuracy of the Logistic Regression is: 0.9583333333333334 The accuracy of the Logistic Regression is: 0.8

#查看混淆矩阵 confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test) print('The confusion matrix result:\n',confusion_matrix_result) #利用热力图对于结果进行可视化 plt.figure(figsize=(8,6)) sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues') plt.xlabel('Predicted labels') plt.ylabel('True labels') plt.show()

The confusion matrix result: [[1000] [ 073] [ 037]]

机器学习(原理+实现)|(Datawhale)基于逻辑回归的分类预测
文章图片

    推荐阅读