文章目录
基于逻辑回归的分类预测
逻辑回归是机器学习中十分经典的一个算法之一。他是一个分类方法,主要运用于二分类。虽然它比不上现在很火的深度学习,但是这些传统的算法仍然有着它独特的优势:模型简单和模型可行性高。在本次的学习中,我学习到了如何调用sklearn库来对鸢尾花iris进行简单的逻辑回归分类,包括二分类和三分类;还有matplolib中一些我还没用过的函数以及新的画图库seaborn。
一、逻辑回归函数介绍
逻辑回归运用Logistic函数(或称为Sigmoid函数),函数如下: l o g i ( z ) = 1 1 + e − x logi(z) = \frac{1}{1+e^{-x}} logi(z)=1+e−x1我们可以使用python的matplotlib库来将这个函数打印出来:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.01)
y = 1/(1+np.exp(-x))
plt.plot(x,y)
plt.xlabel(‘z’)
plt.ylabel(‘y’)
plt.grid()
plt.show()
运行的结果如下:
其中回归基本方程为 z = w 0 + ∑ i N x i w i z = w_0 + \sum_{i}^{N}{x_iw_i} z=w0+i∑Nxiwi逻辑回归常用于二分类问题,而对于二分类问题来说,类型只有两个,所以 p ( y = 1 ∣ x , θ ) = 1 − p ( y = 0 ∣ x , θ ) p(y=1|x,θ)=1-p(y=0|x,θ) p(y=1∣x,θ)=1−p(y=0∣x,θ),而逻辑回归的原理其实就是构建了一个决策边界:对于函数 y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+e−x1,当 y > = 0 y>=0 y>=0时, z > = 0.5 z>=0.5 z>=0.5;当 y < 0 y<0 y<0时, z < 0.5 z<0.5 z<0.5,其中对应的y值就是对于类型1的概率预测值。对于多分类,就是将多个二分类的逻辑回归组合。
二、matplotlib和seaborn库
1.特征与标签组合的散点可视化
首先我们要将特征和标签的信息合并:
iris_all = iris_features.cppy()#进行浅拷贝,防止修改原始数据
iris_all[‘target’] = iris_target
sns.pairplot(data=iris_all,diag_kind=‘hist’,hue=‘target’)
plt.show()
经过查询资料得知,pairplot()里面的参数很多,但是常用的却不多,比如在这个例子里面,diag_kind就是设置对角图样式的一个参数,除了上例的hist,还有一个叫kde的参数。其他还有很多,这里放一个链接可以直接跳转过去查看:pairplot函数详解
在hue这个参数的作用下,就会以类型为分类变量进行画图,之后就会得到四个特征下每个类别的众多散点图。
2.箱形图
箱形图最大的优点就是不受异常值的影响(异常值也称为离群值),可以以一种相对稳定的方式描述数据的离散分布情况。
对于一个箱形图,具有六个数据节点,如下图:
因为数据集当中有四个特征,所以我们需要使用一个简单的for循环来将每一个特征的每一个类别的值画出来。
for col in iris_features.columns():
sns.boxplot(x=‘target’,y=col,data=iris_all,saturation=0.5,palette=‘pastel’)
plt.title(col)
plt.show()
3.三个特征下的三维散点图
选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')
iris_all_class0 = iris_all[iris_all['target']==0].values#选取类别为0的特征
iris_all_class1 = iris_all[iris_all['target']==1].values#选取类别为1的特征
iris_all_class2 = iris_all[iris_all['target']==2].values#选取类别为3的特征
# '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()
三、利用逻辑回归模型在二分类上进行训练和预测
我们将数据集划分为训练集和测试集,在训练集上进行模型训练,在测试集上对模型性能进行验证。
from sklearn.model_selection import train_test_split #这个函数是用来划分训练集和测试集的
#因为是二分类,所以我们只需要导入两个类别0和1
iris_features_part = iris_features.iloc[:100]#一个类别是有50个样本,所以我们可以直接取前100个作为数据集
iris_target_part = iris_target[:100]
#测试集为20%,训练集为80%
x_train,x_text,y_train,y_text = train_test_split(iris_features_part, iris_target_part, test_size = 0.2, random_state = 2020)
#test_size是测试集的大小,如果是小数,则是代表其比例;如果是整数,则是代表取样本数
#random_state确保每一次的训练集都是相同的
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(random_state=0,solver='lbfgs')
clf.fit(x_train,y_train)#进行训练集模型训练
## 查看其对应的w
print('the weight of Logistic Regression:',clf.coef_)
## 查看其对应的w0
print('the intercept(w0) of Logistic Regression:',clf.intercept_)
#在训练集和测试集上分布利用训练好的模型进行预测
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('Predicted labels')
plt.ylabel('True labels')
plt.show()
在iris鸢尾花这个数据集当中,原本就有着三个类别,所以只需要将开头只导入两个类的代码删去就可以完成对三个类的逻辑回归预测。值得一提的是,因为逻辑回归模型是概率预测模型,所以我们可以用clf.predict_proba()来打印测试集的概率。