python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现

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个特征,散点图对两个类数据分布也很明显)

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第1张图片

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第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_)

输出结果如下:

218f229078b2e391e86fe5b15d53643a.png

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坐标的等差数列值,然后初始化网格坐标矩阵,构造数据,通过训练好的模型,拟合出决策边界(下图蓝线)

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第3张图片

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)处,添加了两个新样本:

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第4张图片

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)

,这些形态特征在过去被用来识别物种。

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第5张图片

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()查看帧后面多少行,在数据量比较大的时候很实用。代码输出信息如下:

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第6张图片

3.特征值和标签统计情况

# 特征值统计情况

print(iris_features.describe())

# 查看类别的情况

print(pd.Series(iris_target).value_counts())

运行如下(注 df.desctibe是描述特征值的详细情况,value_counts 是统计数量):

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第7张图片

4.综合特征与标签,进行散点可视化,详细分析特征之间的关系和类别的关系

# 合并标签和特征信息

iris_all = iris_features.copy() # 进行浅拷贝,防止对于原始数据的修改

iris_all['target'] = iris_target

# 数据和标签组合可视化

sns.pairplot(data=iris_all, diag_kind='hist', hue='target')

plt.show()

注:pairplot运行结果图就是 ---> 对角线上是各个属性的直方图,而非对角线上是两个不同属性之间的相关图,从中也可以看出一些关系,比如两个特征之间的相关性等等.....

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第8张图片

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()

注:箱型图就是一种对于一组数据分散情况资料的统计图,他的大致效果如下

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第9张图片

上述代码,对四个特征的分布,每一个类的特征分布情况都画了箱型图,运行结果如下:

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第10张图片

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第11张图片

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第12张图片

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第13张图片

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实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第14张图片

三、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()

测试效果(训练集 + 测试集):

84a3abce0ba7fe239ffe9025c589f223.png

测试的分类效果,混淆矩阵图:

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第15张图片

3.关于逻辑回归多分类

一般地,我们知道逻辑回归是用于二分类。这里简单提一下,将其用于多分类的方法:

(1)one-vs-rest方法:即每一个模型都是二分类,当前选中类为正,其他所有类为负。因此三个类中,要类似构造三个逻辑慧慧二分类模型,最后预测时候投票决定;

(2)softmax分类: softmax可以将每一个样本预测输出,都通过e/sum(e)的方式转化为[0,1]之间的数,而这些数之和加起来为1,最后决定哪个概率大的对应到哪个类上面:如下

python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现_第16张图片

你可能感兴趣的:(python实现逻辑回归三种方法,Python中机器学习的逻辑回归,之,python,实现)