基于鸢尾花(iris,sklearn中自带的数据)数据集的逻辑回归分类实践

实践要求:

导入基础的函数库包括:numpy(Python进行科学计算的基础软件包),
pandas(pandas是一种快速,强大,灵活且易于使用的开源数据分析和处理工具),
matplotlib和seaborn绘图。

解题步骤:

Step1:库函数导入

##  基础函数库
import numpy as np 
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

Step2:数据读取/载入

## 我们利用 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格式

ps.一开始我也不知道这个load_iris里面有啥,就ctrl进去看看

 return Bunch(
        data=data,#所需数据
        target=target,#标签
        frame=frame,
        target_names=target_names,#标签名
        DESCR=fdescr,
        feature_names=feature_names,#特征名
        filename=data_file_name,
        data_module=DATA_MODULE,
    )

Step3:数据信息简单查看

## 利用.info()查看数据的整体信息
iris_features.info()
## 进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部
print(iris_features.head())  #return  self.iloc[:n] n默认是5
print(iris_features.tail())#默认查看前五/后五个
## 其对应的类别标签为,其中0,1,2分别代表'setosa', 'versicolor', 'virginica'三种不同花的类别。
print(iris_target)    # 一开始我以为是运行iris_target就会输出标签array,但是这只是代表了array,要想在终端看到,还得print。
## 利用value_counts函数查看每个类别数量
pd.Series(iris_target).value_counts()   '''value_counts()函数return(self,sort=sort,ascending=ascending,normalize=normalize,bins=bins,dropna=dropna, )'''
'''return describe_ndframe(
            obj=self,
            include=include,
            exclude=exclude,
            datetime_is_numeric=datetime_is_numeric,
            percentiles=percentiles,
        )'''
>>>Data columns (total 4 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB

None
   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
     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

Step4:可视化描述

sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target') # pairplot用来进行数据分析,画两两特征图。常用参数介绍:data:必不可少的数据 hue: 用一个特征来显示图像上的颜色,类似于打标签 marker: 每个label的显示图像变动,有的是三角,有的是原点 vars:只留几个特征两两比较,diag_kind--矩阵  hist直方图 kde核密度曲线
plt.show()  # plt.show():显示所有的 figure(不管是阻塞模式的还是交互模式的)。若一个 figure 下一个 plt.show(),则只有关闭一个 figure,才会出现下一个 figure。若最后设置 plt.show(),则会显示设置的所有 figure。简单来说,看完一张图才能看下一张

在这里插入图片描述

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

在这里插入图片描述


# 选取其前三个特征绘制三维散点图
fig = plt.figure(figsize=(10,8))# figsize:指定figure的宽和高,单位为英寸;
ax = fig.add_subplot(111, projection='3d')# 1*1的图

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')# [;,0]对一个二维数组,取该二维数组第一维中的所有数据,第二维中取第0个数据。
'''
X = np.array ([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]) 
X[:,0]就是取所有行的第0个数据
print(X[:, 0]) 
输出:[ 0  2  4  6  8 ]
'''
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()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sns.boxplot()函数

x, y, hue:数据或向量数据中的变量名称
用于绘制长格式数据的输入。

data:DataFrame,数组,数组列表
用于绘图的数据集。如果x和y都缺失,那么数据将被视为宽格式。否则数据被视为长格式。

palette:调色板名称,列表或字典
用于hue变量的不同级别的颜色。可以从color_palette()得到一些解释,或者将色调级别映射到matplotlib颜色的字典。

saturation:float
控制用于绘制颜色的原始饱和度的比例。

Step5:利用逻辑回归模型在二分类上进行训练和预测

逻辑回归:就是构造一个函数,使得函数图像分隔开不同的类别,达到分类的目的。

Logistic函数:
在这里插入图片描述

# 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split
# 选择其类别为0和1的样本 (不包括类别为2的样本)
iris_features_part = iris_features.iloc[:100]# 切片出索引为0到99的
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)
#train_test_split(待划分的样本特征集合,待划分的样本标签,测试集样本的数目,随机数种子)
#若干次随机划分,用random_state随机数种子来实现


# 从sklearn中导入逻辑回归模型
from sklearn.linear_model import LogisticRegression
# 定义 逻辑回归模型
clf = LogisticRegression()
# 在训练集上训练逻辑回归模型
clf.fit(x_train, y_train)#传入训练样本和标签
# 查看其对应的w
print('逻辑回归的权重:',clf.coef_)

## 查看其对应的w0
print('逻辑回归的截距(w0):',clf.intercept_)
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)# 对训练数据进行预测,
test_predict = clf.predict(x_test)#对测试数据进行预测
from sklearn import metrics

## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('逻辑回归准确度:',metrics.accuracy_score(y_train,train_predict))
print('逻辑回归准确度:',metrics.accuracy_score(y_test,test_predict))

## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('混淆矩阵结果:\n',confusion_matrix_result)

>>>逻辑回归的权重: [[ 0.45181973 -0.81743611  2.14470304  0.89838607]]
逻辑回归的截距(w0): [-6.53367714]
逻辑回归准确度: 1.0
逻辑回归准确度: 1.0
混淆矩阵结果:
 [[ 9  0]
 [ 0 11]]

Step6:利用逻辑回归模型在三分类(多分类)上进行训练和预测

## 测试集大小为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()
# 在训练集上训练逻辑回归模型
clf.fit(x_train, y_train)
## 查看其对应的w
print('逻辑回归的权重:\n',clf.coef_)

## 查看其对应的w0
print('逻辑回归的截距(w0):\n',clf.intercept_)

## 因为3分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类。
## 在训练集和测试集上分别利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)

## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('逻辑回归准确度:',metrics.accuracy_score(y_train,train_predict))
print('逻辑回归准确度:',metrics.accuracy_score(y_test,test_predict))
## 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('混淆矩阵结果:\n',confusion_matrix_result)

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.01)# -5到5 步长为0.01
y = 1/(1+np.exp(-x))#Logistic函数

plt.plot(x,y)#x轴数据和y轴数据
plt.xlabel('z')
plt.ylabel('y')# x,y轴的标签
plt.grid() # 生成网格,便于观察
plt.savefig("fx.png")# 保存到本地
plt.show()
>>>逻辑回归的权重:
 [[-0.45928925  0.83069891 -2.26606529 -0.99743982]
 [ 0.33117319 -0.72863426 -0.06841147 -0.98711029]
 [ 0.12811606 -0.10206465  2.33447676  1.98455011]]
逻辑回归的截距(w0):
 [  9.43880656   3.93047365 -13.36928021]
逻辑回归准确度: 0.9833333333333333
逻辑回归准确度: 0.8666666666666667
混淆矩阵结果:
 [[10  0  0]
 [ 0  8  2]
 [ 0  2  8]]

在这里插入图片描述

总结

1.整个思路就是,先读取数据,然后用留出法划分出测试集和训练集,再用训练集利用逻辑回归函数对模型进行训练,最后测试模型的准确度并进行可视化表达。

2.过程中比较痛苦的地方,就是对库不熟悉,看了api也不太会用,对逻辑回归函数不熟悉。

代码

import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

## 我们利用 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格式

## 利用.info()查看数据的整体信息
print(iris_features.info())
## 进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部
print(iris_features.head())
print(iris_features.tail())
# 其对应的类别标签为,其中0,1,2分别代表'setosa', 'versicolor', 'virginica'三种不同花的类别。


#  合并标签和特征信息
iris_all = iris_features.copy() # 拷贝一份数据,对拷贝出的数据,进行操作,防止影响原数据
iris_all['target'] = iris_target

## 特征与标签组合的散点可视化
sns.pairplot(data=iris_all, diag_kind='hist', hue='target')
plt.show()
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()


# 选取其前三个特征绘制三维散点图
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
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()

# 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。

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()
# 在训练集上训练逻辑回归模型
clf.fit(x_train, y_train)
# 查看其对应的w
print('逻辑回归的权重:',clf.coef_)

## 查看其对应的w0
print('逻辑回归的截距(w0):',clf.intercept_)
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics

## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('逻辑回归准确度:',metrics.accuracy_score(y_train,train_predict))
print('逻辑回归准确度:',metrics.accuracy_score(y_test,test_predict))

## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('混淆矩阵结果:\n',confusion_matrix_result)

## 由于这个是3分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类。
## 测试集大小为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()
# 在训练集上训练逻辑回归模型
clf.fit(x_train, y_train)
## 查看其对应的w
print('逻辑回归的权重:\n',clf.coef_)

## 查看其对应的w0
print('逻辑回归的截距(w0):\n',clf.intercept_)


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

## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('逻辑回归准确度:',metrics.accuracy_score(y_train,train_predict))
print('逻辑回归准确度:',metrics.accuracy_score(y_test,test_predict))
## 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('混淆矩阵结果:\n',confusion_matrix_result)

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.savefig("fx.png")
plt.show()
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐