PS. 逻辑回归算法原理,有很多优秀的帖子详细介绍过,这里不再赘述。
(或者后期有时间了再新写帖子专门记录原理)
目录
一、python逻辑回归简单案例
1. 加载相关库
# 基础函数库
import numpy as np
# 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns
# 导入逻辑回归模型函数
from sklearn.linear_model import LogisticRegression
注:上边seaborn是python的一个强大的数据可视化库。
2. 构造数据和特征,并查看散点图
# 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
print('数据:------')
print(x_fearures)
y_label = np.array([0, 0, 0, 1, 1, 1])
print('标签:------')
print(y_label)
# 查看数据散点图
plt.figure()
plt.scatter(x_fearures[:, 0], x_fearures[:, 1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()
输出结果和散点图如下:(从中可以看出我们构造了6个样本,每个样本2个特征,散点图对两个类数据分布也很明显)
3.训练逻辑回归模型,并查看参数
# 调用逻辑回归模型
lr_clf = LogisticRegression()
# 用逻辑回归模型拟合构造的数据集 (其拟合方程为 y = w0 + w1 * x1 + w2 * x2)
lr_clf = lr_clf.fit(x_fearures, y_label)
## 查看其对应模型的w1,w2
print('the weight of Logistic Regression:', lr_clf.coef_)
## 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:', lr_clf.intercept_)
输出结果如下:
4.构造一条可视化决策边界,来区分两个类别的数据:
# 可视化决策边界
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
nx, ny = 200, 100
# 获取feature中x轴和y轴上最小最大值
x_min, x_max = plt.xlim() # 设定坐标范围
y_min, y_max = plt.ylim()
# np.linspace:创建等差数列,np.meshgrid:网格坐标矩阵
print(np.linspace(x_min, x_max, nx)) # 区间内创建200个等差数列的数
print(' ')
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx), np.linspace(y_min, y_max, ny))
print(x_grid)
print(y_grid)
# np.c_: 添加列
z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])
z_proba = z_proba[:, 1].reshape(x_grid.shape)
print(z_proba)
# plt.contour: 绘制轮廓
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')
plt.show()
注:代码中具体主要是创建了在feature的范围内最大x和最小y值范围内的,xy坐标的等差数列值,然后初始化网格坐标矩阵,构造数据,通过训练好的模型,拟合出决策边界(下图蓝线)
5.尝试在数据中添加两个新样本
# 添加两颗新样本并可视化
plt.figure()
# new point 1
x_fearures_new1 = np.array([[0, -1]])
plt.scatter(x_fearures_new1[:,0],x_fearures_new1[:,1], s=50, cmap='viridis')
# 注:plt.annotate(): 主要是用于在图中添加标注
plt.annotate(s='New point 1',xy=(0,-1),xytext= (-2,0),color='blue',
arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))
# new point 2
x_fearures_new2 = np.array([[1, 2]])
plt.scatter(x_fearures_new2[:,0],x_fearures_new2[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 2',xy=(1,2),xytext=(-1.5,2.5),color='red',
arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))
# 原训练样本
plt.scatter(x_fearures[:,0], x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
# 上面可视化的决策边界
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')
plt.show()
从上述代码可以看到,在坐标(0,-1)和(1,2)处,添加了两个新样本:
6.用模型预测两个新样本
# predict_proba 函数预测其概率
y_label_new1_predict_proba = lr_clf.predict_proba(x_fearures_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_fearures_new2)
print('The New point 1 predict Probability of each class:\n',y_label_new1_predict_proba)
print('The New point 2 predict Probability of each class:\n',y_label_new2_predict_proba)
# 预测类别
y_label_new1_predict = lr_clf.predict(x_fearures_new1)
y_label_new2_predict = lr_clf.predict(x_fearures_new2)
print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)
最后,预测结果为: 第一个点为类别0,第二个点为类别1,代码输出如下:
The New point 1 predict Probability of each class:
[[0.69567724 0.30432276]]
The New point 2 predict Probability of each class:
[[0.11983936 0.88016064]]
The New point 1 predict class:
[0]
The New point 2 predict class:
[1]
二、python实现鸢尾花数据分析
1.数据集介绍
我们使用sklearn库的经典数据集iris鸢尾花数据集 -------> 该数据集一共包含
5
个变量,其中
4
个特征变量,
1
个目标分类
变量。共有
150
个样本,目标变量为 花的类别 其都属于鸢尾属下的三个亚属,分别是山鸢尾
(Iris-setosa)
,变色鸢
尾
(Iris-versicolor)
和维吉尼亚鸢尾
(Iris-virginica)
。包含的三种鸢尾花的四个特征,分别是花萼长度
(cm)
、花萼宽度
(cm)
、花瓣长度
(cm)
、花瓣宽度
(cm)
,这些形态特征在过去被用来识别物种。
2.加载iris数据集,并查看一些基础信息
# 我们利用 sklearn 中自带的 iris 数据作为数据载入,并利用Pandas转化为DataFrame格式
from sklearn.datasets import load_iris
data = load_iris() # 得到数据特征
iris_target = data.target # 得到数据对应的标签
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names) # 利用Pandas转化为 DataFrame格式
# df.info() 查看数据详细信息
print('iris数据集情况.....')
print(iris_features.info())
# 查看前面和尾部一些数据案例
print('前面一些数据例子...')
print(iris_features.head())
print('后面一些数据例子...')
print(iris_features.tail())
注:几个小点:(1)加载的data不仅包含数据特征,还包含目标变量;(2)data.data是特征,data.target是标签;(3)df.info()表示查看某个帧的详情,df.head()查看帧前面多少航,df.tail()查看帧后面多少行,在数据量比较大的时候很实用。代码输出信息如下:
3.特征值和标签统计情况
# 特征值统计情况
print(iris_features.describe())
# 查看类别的情况
print(pd.Series(iris_target).value_counts())
运行如下(注 df.desctibe是描述特征值的详细情况,value_counts 是统计数量):
4.综合特征与标签,进行散点可视化,详细分析特征之间的关系和类别的关系
# 合并标签和特征信息
iris_all = iris_features.copy() # 进行浅拷贝,防止对于原始数据的修改
iris_all['target'] = iris_target
# 数据和标签组合可视化
sns.pairplot(data=iris_all, diag_kind='hist', hue='target')
plt.show()
注:pairplot运行结果图就是 ---> 对角线上是各个属性的直方图,而非对角线上是两个不同属性之间的相关图,从中也可以看出一些关系,比如两个特征之间的相关性等等.....
5.观察特征的箱型图
# 不同特征列对目标数据的箱型图规律
for col in iris_features.columns:
sns.boxplot(x='target', y=col, saturation=0.5,palette='pastel', data=iris_all)
plt.title(col)
plt.show()
注:箱型图就是一种对于一组数据分散情况资料的统计图,他的大致效果如下
上述代码,对四个特征的分布,每一个类的特征分布情况都画了箱型图,运行结果如下:
6.选择某三个特征,进行对三个类的数据的分布,三维可视化实现:
# 选取其前三个特征绘制三维散点图
fig = 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
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()
运行效果如下(因为是3维的可视化,所以只有选择三个特征来尝试,三维以上无法绘制):
三、python逻辑回归实现鸢尾花的分类
1. 训练逻辑回归模型
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 测试集大小为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)
2.对测试集,进行预测类别:
from sklearn import metrics
# 预测类
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
# 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))
## 查看混淆矩阵(分类的效果评估)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
测试效果(训练集 + 测试集):
测试的分类效果,混淆矩阵图:
3.关于逻辑回归多分类
一般地,我们知道逻辑回归是用于二分类。这里简单提一下,将其用于多分类的方法:
(1)one-vs-rest方法:即每一个模型都是二分类,当前选中类为正,其他所有类为负。因此三个类中,要类似构造三个逻辑慧慧二分类模型,最后预测时候投票决定;
(2)softmax分类: softmax可以将每一个样本预测输出,都通过e/sum(e)的方式转化为[0,1]之间的数,而这些数之和加起来为1,最后决定哪个概率大的对应到哪个类上面:如下