机器学习之python实现逻辑回归

 

PS. 逻辑回归算法原理,有很多优秀的帖子详细介绍过,这里不再赘述。

(或者后期有时间了再新写帖子专门记录原理)

 

目录

一、python逻辑回归简单案例

二、python实现鸢尾花数据分析

三、python逻辑回归实现鸢尾花的分类


一、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,最后决定哪个概率大的对应到哪个类上面:如下

softmax原理

 

 

 

  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值