一.实训目的

    借助Scikit-learn机器学习库完成逻辑回归鸢尾花分类,掌握鸢尾花数据集、提取特征与标签、数组切片、数据集划分、逻辑回归参数等知识。

二.鸢尾花数据集

花萼长度(cm)

花萼宽度(cm)

花瓣长度(cm)

花瓣宽度(cm)

类别

2.1

0.9

2.1

0.9

山鸢尾

1.0

0.3

1.0

0.3

山鸢尾

4.7

1.2

4.7

1.2

杂色鸢尾

4.1

1.6

4.1

1.6

杂色鸢尾

5.5

2.1

5.5

2.1

维吉尼亚鸢尾

5.3

2.1

5.3

2.1

维吉尼亚鸢尾

数据集样本示例

三.实训代码和运行结果

1.基础任务

要求:代码运行成功、关键代码加注释

# 1. 导入工具库
import numpy as np
from sklearn.linear_model import LogisticRegression  #从sklearn中导入逻辑回归模型
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris   #从sklearn中导入鸢尾花数据集
from sklearn.model_selection import train_test_split #从sklearn中导入划分数据集的方法

# 2. 加载数据
X=load_iris().data #提取数据集中的特征,如果想提取数据集中的前100条样本和后两个特征,则为load_iris().data[0:100,2:4]
y=load_iris().target #提取数据集中的标签,值有0、1、2,分别代表山鸢尾、杂色鸢尾、维吉尼亚鸢尾

#划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X,          # 特征
    y,          # 标签
    test_size=0.3, # 测试集占 30%
    random_state=42, # 固定随机种子
    stratify=y     # 按类别比例分层,防止类别失衡
)

# 3. 创建并训练模型
model = LogisticRegression(
    max_iter=1000,    # 最大迭代次数,也就是梯度下降求解的最大步数
    C=1.0,            # 正则化强度,默认1.0;值越小学习的越少,容易欠拟合;值越大学习的越多,容易过拟合。
    random_state=42   # 固定随机种子
)
model.fit(X_train, y_train)

#4.模型评估
r=model.score(X_test,y_test)      #将测试集放入计算预测准确率的方法中,计算准确率
print(f"预测准确率为:{r:.2f}")         #输出预测准确率

#5.测试数据分类结果可视化
#为了图片的直观性,只展示其中的两个特征
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.subplot (1, 2, 1)
plt.scatter (X_test [:, 0], X_test [:, 1], c=y_test, cmap='plasma')
plt.title ("测试集--真实花朵分类结果")
plt.grid(True, linestyle='--', alpha=0.6)
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')

plt.subplot (1, 2, 2)
y_pre=model.predict(X_test)
plt.scatter (X_test [:, 0], X_test [:, 1], c=y_pre, cmap='plasma')
plt.title ("测试集--预测花朵分类结果")
plt.grid(True, linestyle='--', alpha=0.6)
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')

# 找出预测错误的索引
error_idx = (y_pre != y_test)
X_error = X_test[error_idx]   # 错误点坐标
y_error = y_test[error_idx]   # 错误点真实标签
if len(X_error) > 0:
    plt.scatter(X_error[:, 0], X_error[:, 1], facecolors='none', edgecolors='black', s=100, linewidths=2) 

plt.tight_layout()
plt.show()

运行结果:

2.进阶任务

要求:

(1)只提取数据集中的花瓣长度和花瓣宽度两个特征作为训练模型的数据,提示:修改X=load_iris().data的取值

(2)将训练集和测试集的划分比例设置成0.2

(3)将逻辑回归的正则化参数值设置成0.01

# 加载数据
X=load_iris().data[:,2:4] #提取数据集中的后两个特征

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
    X,          
    y,          
    test_size=0.2, # 测试集占 20%
    random_state=42, 
    stratify=y    
)

# 创建模型
model = LogisticRegression(
    max_iter=1000,   
    C=0.01,            # 正则化强度0.01
    random_state=42   

四.实训总结

1.如何导入数据集并加载特征和标签

导入鸢尾花数据集: from sklearn.datasets import load_iris

加载鸢尾花数据:

X=load_iris().data      #提取数据集中的特征,是个二维数组

y=load_iris().target    ##提取数据集中的标签,是个一维数组

拓展:

1.可通过shape属性查看数组的维度,代码:X.shape

2.可通过print打印数组的具体值,代码:print(X)

2.如何提取数组中的数据

提取一维数组的数据:

y=load_iris().target             #此时y等于[0,0,1,1,2,2],是一个一维数组

1.提取第1个数据:       y=load_iris().target[0]        #此时y等于0

2.提取第2-4个数据:    y=load_iris().target[1:4]      #表示从索引为1的行开始到索引为4的行结束,但不包括索引为4的行,此时y=[0,1,1]

提取二维数组的数据:          

X=load_iris().data               #此时X等于

1.提取第1行第1列数据:        X=load_iris().data[1,1]       #此时X等于2.1

2.提取第2-4行,第1-2列的数据: X=load_iris().data[1:4,0:2]         #此时X等于

3.提取所有行,第1-2列的数据: X=load_iris().data[:,0:2]

3.如何将数据集划分为训练集和测试集

from sklearn.model_selection import train_test_split   #从sklearn中导入划分数据集的类

X_train, X_test, y_train, y_test = train_test_split(
    X,          # 特征
    y,          # 标签
    test_size=0.3, # 测试集占 30%
    random_state=42, # 固定随机种子
    stratify=y     # 按类别比例分层,防止类别失衡
)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐