24.11.4

实验二:逻辑回归算法实现与测试
一、实验目的
深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练对数几率回归(逻辑回归)分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的 部分。
三、算法步骤、代码、及结果

  1. 算法伪代码
    加载数据集 (iris)
    将数据集划分为训练集和测试集 (train_test_split)
    初始化 LogisticRegression 分类器
    训练模型 (fit)
    使用五折交叉验证评估模型性能 (cross_validate)
    输出交叉验证结果的平均值 (accuracy, precision, recall, f1)
    使用测试集预测结果 (predict)
    计算并输出测试集上的准确度、精度、召回率和 F1 值
    输出分类报告 (classification_report)
  2. 算法主要代码
    完整源代码\调用库方法(函数参数说明)
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import cross_val_score, cross_validate
    from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
    import numpy as np

从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集

加载iris数据集

iris = load_iris()
X, y = iris.data, iris.target

使用留出法划分训练集和测试集,测试集占1/3

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, stratify=y, random_state=42)

train_test_split主要参数:

sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

arrays:待划分的特征矩阵 X 和标签向量 y

test_size:测试集比例,默认为 None

取值范围:(0, 1) 表示比例;整数表示测试集样本数;若为 None,则自动计算

train_size:训练集比例,默认为 None。若 test_size 和 train_size 均为 None,则默认 test_size=0.25

random_state:随机种子,整型值使得结果可复现

shuffle:布尔值,是否在划分前打乱数据,默认为 True

stratify:按特定分布划分数据。通常为标签 y,保证训练集和测试集中类别分布一致

检查分布是否一致

print(f"训练集样本数: {len(y_train)},训练集类别分布: {dict(zip(np.unique(y_train, return_counts=True)))}")
print(f"测试集样本数: {len(y_test)},测试集类别分布: {dict(zip(
np.unique(y_test, return_counts=True)))}")

使用训练集训练对数几率回归(逻辑回归)分类算法

训练对数几率回归模型

log_reg = LogisticRegression(max_iter=200, random_state=42)
log_reg.fit(X_train, y_train)

LogisticRegression主要参数:

sklearn.linear_model.LogisticRegression(penalty='l2', *, dual=False, tol=1e-4, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)

penalty:正则化方式,默认为 'l2'

可选值:'l1'、'l2'、'elasticnet'、'none'

C:正则化强度的倒数,默认值为 1.0

取值越小,正则化越强

solver:优化算法,默认值 'lbfgs'

可选值:'lbfgs'、'liblinear'、'sag'、'saga' 等

对于多分类问题,推荐使用 'lbfgs'

max_iter:最大迭代次数,默认值 100

multi_class:多分类设置,默认为 'auto'

可选值:'ovr'(一对多)、'multinomial'(多项式)

使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择

使用五折交叉验证评估模型性能

scoring_metrics = ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']
cv_results = cross_validate(log_reg, X_train, y_train, cv=5, scoring=scoring_metrics)

cross_validate主要参数:

sklearn.model_selection.cross_validate(estimator, X, y=None, *, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, return_train_score=False, return_estimator=False, error_score=nan)

estimator:用于训练的模型,如 LogisticRegression()

X:特征矩阵

y:标签向量

scoring:评估指标,默认为 None,即使用模型默认评分标准

可选单个指标(如 'accuracy')或列表(如 ['accuracy', 'precision_macro'])

cv:交叉验证折数,默认值 5

n_jobs:并行计算的线程数,默认为 None

-1 表示使用所有可用CPU

return_train_score:是否返回训练集分数,默认为 False

打印交叉验证结果

for metric in scoring_metrics:
print(f"{metric} (平均值): {cv_results['test_' + metric].mean():.4f}")

使用测试集,测试模型的性能,对测试结果进行分析

使用测试集评估模型性能

y_pred = log_reg.predict(X_test)

计算准确度、精度、召回率和F1值

accuracy = accuracy_score(y_test, y_pred)

accuracy_score主要参数:

sklearn.metrics.accuracy_score(y_true, y_pred, *, normalize=True, sample_weight=None)

y_true:真实标签

y_pred:预测标签

normalize:是否返回比例值,默认为 True

若设为 False,则返回正确分类样本的数量

precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')

precision_score, recall_score, f1_score

分别计算精度、召回率和 F1 值

主要参数:

average:指定多分类问题的计算方式

'macro':各类指标的平均值

'micro':全局指标

'weighted':根据类的样本数量加权平均

zero_division:在分母为零的情况下返回值,默认为 'warn'

print("\n测试集性能指标:")
print(f"准确度: {accuracy:.4f}")
print(f"精度: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1值: {f1:.4f}")

打印分类报告

print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

classification_report主要参数:

sklearn.metrics.classification_report(y_true, y_pred, *, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn')

y_true:真实标签

y_pred:预测标签

target_names:类别标签的名称

digits:结果小数位数,默认为 2

output_dict:是否以字典形式返回,默认为 False

  1. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

四、心得体会
通过本次实验,我深入理解了对数几率回归(逻辑回归)的算法原理,掌握了其核心思想及应用场景。同时,我成功使用Python实现了逻辑回归模型的训练与测试,并结合五折交叉验证算法对模型进行了训练与性能评估。这让我认识到交叉验证在提升模型泛化能力中的重要性,同时进一步增强了我将理论知识转化为实践能力的信心。

posted @ 2024-11-04 19:20  起名字真难_qmz  阅读(16)  评论(0)    收藏  举报