当前位置: 首页 > article >正文

机器学习代码中常用方法

目录

1、score()

作用

用法

参数说明:

返回值:

示例

适用场景

注意事项

与 metrics.accuracy_score 的区别

2、metrics.classification_report()

作用

参数说明:

返回值:

示例

报告内容解析

适用场景

注意事项

3、confusion_matrix()

作用

混淆矩阵的结构

用法

参数说明:

返回值:

示例

二分类问题

多分类问题

适用场景

注意事项

4、cross_val_score()

作用

用法

参数说明:

返回值:

示例

基本用法

指定评估指标

适用场景

注意事项

5、SMOTE().fit_resample()

SMOTE 的原理

用法

参数说明:

返回值:

示例

基本用法

结合分类模型

SMOTE 的参数

适用场景

注意事项


1、score()

lr.score() 是 Scikit-learn 中模型对象(如 LogisticRegression)的一个方法,用于计算模型在给定数据集上的 准确率(Accuracy)。它适用于分类和回归模型,但在分类任务中,它默认计算的是分类准确率。


作用

lr.score() 的作用是:

  1. 评估模型性能:计算模型在给定数据集上的准确率。

  2. 快速验证:提供一种简单的方式验证模型在训练集或测试集上的表现。


用法

score = lr.score(X, y)
参数说明
  1. X:特征数据(通常是测试集或训练集的特征部分),形状为 (n_samples, n_features)

  2. y:目标值(通常是测试集或训练集的标签部分),形状为 (n_samples,)

返回值

返回一个浮点数,表示模型在给定数据集上的准确率。对于分类模型,准确率的计算公式为:

示例

假设我们有一个训练好的逻辑回归模型 lr,并且有一个测试集 X_test 和对应的标签 y_test,我们可以使用 lr.score() 计算模型在测试集上的准确率:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载示例数据集
data = load_iris()
X = data.data
y = data.target

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化并训练逻辑回归模型
lr = LogisticRegression(max_iter=200)
lr.fit(X_train, y_train)

# 计算模型在测试集上的准确率
accuracy = lr.score(X_test, y_test)
print(f"模型在测试集上的准确率: {accuracy:.2f}")

 

适用场景

  1. 分类任务:计算分类准确率。

  2. 回归任务:计算 R² 分数(决定系数)。

  3. 快速验证:在训练或测试过程中,快速评估模型性能。


注意事项

  1. 分类任务

    • 对于分类模型,lr.score() 默认计算的是准确率。

    • 如果数据集不平衡,准确率可能不是一个可靠的指标,应结合其他指标(如精确率、召回率、F1 分数)进行评估。

  2. 回归任务

    • 对于回归模型,lr.score() 计算的是 R² 分数,表示模型对目标变量的解释能力。

  3. 输入数据

    • X 和 y 的形状必须匹配,X 是特征数据,y 是对应的标签。


与 metrics.accuracy_score 的区别

lr.score() 和 metrics.accuracy_score 都可以用于计算分类准确率,但它们的用法略有不同:

  • lr.score() 是模型对象的方法,直接使用模型和数据集计算准确率。

  • metrics.accuracy_score 是一个独立的函数,需要传入真实标签和预测标签。

示例对比:

from sklearn.metrics import accuracy_score

# 使用 lr.score()
accuracy1 = lr.score(X_test, y_test)

# 使用 metrics.accuracy_score
y_pred = lr.predict(X_test)
accuracy2 = accuracy_score(y_test, y_pred)

print(f"lr.score() 准确率: {accuracy1:.2f}")
print(f"accuracy_score 准确率: {accuracy2:.2f}")

 

两者结果相同,但 lr.score() 更加简洁,适合快速验证模型性能。 

2、metrics.classification_report()

metrics.classification_report 是 Scikit-learn 中用于生成分类模型性能报告的函数。它提供了分类任务中常用的评估指标,如 精确率(Precision)召回率(Recall)F1 分数(F1-Score) 和 支持数(Support),帮助用户全面了解模型的性能。

单独求召回率、准确率、召回率、F1分数:

metrics.recall_score()

metrics.accuracy_score()

metrics.precision_score()

metrics.f1_score()


作用

classification_report 的主要作用是:

  1. 评估分类模型的性能:通过计算精确率、召回率和 F1 分数,评估模型在每一类上的表现。

  2. 识别模型的优缺点:帮助用户发现模型在哪些类别上表现较好,哪些类别上表现较差。

  3. 支持多分类问题:不仅适用于二分类问题,也适用于多分类问题。

from sklearn.metrics import classification_report

# 生成分类报告
report = classification_report(y_true, y_pred, target_names=None, digits=2)
print(report)
参数说明
  1. y_true:真实的目标值(ground truth),通常是测试集的标签。

  2. y_pred:模型预测的目标值,通常是模型对测试集的预测结果。

  3. target_names(可选):类别名称的列表。如果提供,报告中将使用这些名称代替类别编号。例如,target_names=['Class 0', 'Class 1']

  4. digits(可选):控制输出报告中数值的小数位数,默认为 2。

返回值

返回一个字符串形式的分类报告,包含以下内容:

  • 精确率(Precision):预测为正类的样本中,实际为正类的比例。公式:Precision = TP / (TP + FP)

  • 召回率(Recall):实际为正类的样本中,预测为正类的比例。公式:Recall = TP / (TP + FN)

  • F1 分数(F1-Score):精确率和召回率的调和平均值。公式:F1 = 2 * (Precision * Recall) / (Precision + Recall)

  • 支持数(Support):每个类别的样本数量。

示例

假设我们有一个二分类问题,真实标签和预测标签如下:

y_true = [0, 1, 1, 0, 1, 0, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 1, 0]

使用 classification_report 生成报告:

from sklearn.metrics import classification_report

report = classification_report(y_true, y_pred, target_names=['Class 0', 'Class 1'])
print(report)

输出结果:

              precision    recall  f1-score   support

     Class 0       0.67      0.67      0.67         3
     Class 1       0.75      0.75      0.75         4

    accuracy                           0.71         7
   macro avg       0.71      0.71      0.71         7
weighted avg       0.71      0.71      0.71         7

报告内容解析

  1. 类别指标

    • 每一行对应一个类别的评估结果。

    • precisionrecallf1-score 分别表示该类别的精确率、召回率和 F1 分数。

    • support 表示该类别的样本数量。

  2. 整体指标

    • accuracy:模型的整体准确率,即正确预测的样本占总样本的比例。

    • macro avg:所有类别的指标(精确率、召回率、F1 分数)的算术平均值。

    • weighted avg:所有类别的加权平均值,权重为每个类别的支持数。


适用场景

  • 二分类问题:评估正类和负类的表现。

  • 多分类问题:评估每个类别的表现。

  • 不平衡数据集:通过精确率、召回率和 F1 分数,更好地评估模型在不平衡数据上的性能。


注意事项

  • 对于不平衡数据集,accuracy 可能不是一个可靠的指标,应重点关注 precisionrecall 和 f1-score

  • 如果类别较多,可以指定 target_names 以便更清晰地理解报告。

通过 classification_report,用户可以快速了解模型的性能,并针对性地优化模型。

 

3、confusion_matrix()

confusion_matrix() 是 Scikit-learn 中用于计算分类模型混淆矩阵的函数。混淆矩阵是评估分类模型性能的重要工具,它展示了模型预测结果与真实标签之间的对比情况,特别适用于二分类和多分类问题。


作用

混淆矩阵的主要作用是:

  1. 可视化分类模型的性能:展示模型在每个类别上的预测情况。

  2. 识别分类错误:帮助分析模型在哪些类别上容易出错。

  3. 计算其他指标:基于混淆矩阵,可以计算精确率、召回率、F1 分数等指标。


混淆矩阵的结构

对于一个二分类问题,混淆矩阵的结构如下:

预测为负类 (0)预测为正类 (1)
实际为负类 (0)TN (True Negative)FP (False Positive)
实际为正类 (1)FN (False Negative)TP (True Positive)
  • TN (True Negative):实际为负类,预测为负类。

  • FP (False Positive):实际为负类,预测为正类(误报)。

  • FN (False Negative):实际为正类,预测为负类(漏报)。

  • TP (True Positive):实际为正类,预测为正类。

对于多分类问题,混淆矩阵的行表示实际类别,列表示预测类别。


用法

from sklearn.metrics import confusion_matrix

# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)
参数说明
  1. y_true:真实的目标值(ground truth),通常是测试集的标签。

  2. y_pred:模型预测的目标值,通常是模型对测试集的预测结果。

  3. labels(可选):指定类别的顺序。默认情况下,类别按照 y_true 和 y_pred 中出现的顺序排列。

  4. sample_weight(可选):样本权重。

返回值

返回一个二维数组(矩阵),表示混淆矩阵。矩阵的行表示实际类别,列表示预测类别。


示例

二分类问题
from sklearn.metrics import confusion_matrix

y_true = [0, 1, 1, 0, 1, 0, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 1, 0]

cm = confusion_matrix(y_true, y_pred)
print("混淆矩阵:")
print(cm)
混淆矩阵:
[[2 1]
 [1 4]]

解析:

  • 实际为负类 (0) 的样本中,2 个被正确预测为负类 (TN),1 个被错误预测为正类 (FP)。

  • 实际为正类 (1) 的样本中,1 个被错误预测为负类 (FN),4 个被正确预测为正类 (TP)。


多分类问题
from sklearn.metrics import confusion_matrix

y_true = [0, 1, 2, 0, 1, 2, 0, 1, 2]
y_pred = [0, 1, 1, 0, 2, 2, 0, 1, 2]

cm = confusion_matrix(y_true, y_pred)
print("混淆矩阵:")
print(cm)

输出结果:

混淆矩阵:
[[3 0 0]
 [0 2 1]
 [0 1 2]]

解析:

  • 类别 0:3 个样本全部正确预测。

  • 类别 1:2 个样本正确预测,1 个样本被错误预测为类别 2。

  • 类别 2:2 个样本正确预测,1 个样本被错误预测为类别 1。


适用场景

  1. 二分类问题:分析模型在正类和负类上的表现。

  2. 多分类问题:分析模型在每个类别上的表现。

  3. 不平衡数据集:通过混淆矩阵识别模型在少数类上的表现。


注意事项

  1. 类别顺序:默认情况下,混淆矩阵的类别顺序按照 y_true 和 y_pred 中出现的顺序排列。如果需要指定顺序,可以使用 labels 参数。

  2. 多分类问题:对于多分类问题,混淆矩阵的行表示实际类别,列表示预测类别。

  3. 结合其他指标:混淆矩阵通常与其他指标(如精确率、召回率、F1 分数)结合使用,全面评估模型性能。

通过 confusion_matrix(),用户可以直观地了解模型的分类性能,并针对性地优化模型。

4、cross_val_score()

cross_val_score() 是 Scikit-learn 中用于执行交叉验证的函数。它通过将数据集划分为多个子集,多次训练和验证模型,从而更可靠地评估模型的性能。交叉验证特别适用于数据量较小的情况,因为它可以充分利用数据,减少模型评估的方差。


作用

cross_val_score() 的主要作用是:

  1. 评估模型性能:通过交叉验证计算模型的性能指标(如准确率、F1 分数等)。

  2. 减少过拟合风险:通过多次验证,确保模型的性能评估更加稳健。

  3. 选择最佳模型:比较不同模型或参数的性能,选择最优模型。


用法

from sklearn.model_selection import cross_val_score

# 执行交叉验证
scores = cross_val_score(estimator, X, y, cv=None, scoring=None)
参数说明
  1. estimator:需要评估的模型对象(如 LogisticRegressionRandomForestClassifier 等)。

  2. X:特征数据,形状为 (n_samples, n_features)

  3. y:目标值,形状为 (n_samples,)

  4. cv:交叉验证的折数或交叉验证策略。默认值为 None,表示使用 5 折交叉验证。

    • 如果是整数,表示折数(如 cv=5)。

    • 如果是交叉验证对象(如 KFoldStratifiedKFold),则使用指定的交叉验证策略。

  5. scoring:评估指标。默认值为 None,表示使用模型的默认评估指标(如分类模型使用准确率,回归模型使用 R² 分数)。

    • 可以是字符串(如 'accuracy''f1''roc_auc')。

    • 也可以是自定义的评分函数。

返回值

返回一个数组,包含每一折交叉验证的评分结果。


示例

基本用法
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 加载数据集
data = load_iris()
X = data.data
y = data.target

# 初始化模型
model = LogisticRegression(max_iter=200)

# 执行 5 折交叉验证,使用默认评估指标(准确率)
scores = cross_val_score(model, X, y, cv=5)

print("交叉验证得分:", scores)
print("平均得分:", scores.mean())

输出结果:

交叉验证得分: [1.         0.96666667 0.93333333 0.96666667 1.        ]
平均得分: 0.9733333333333334

解析:

  • 每一折交叉验证的得分分别为 [1.0, 0.9667, 0.9333, 0.9667, 1.0]

  • 平均得分为 0.9733


指定评估指标
# 执行 5 折交叉验证,使用 F1 分数作为评估指标
scores = cross_val_score(model, X, y, cv=5, scoring='f1_macro')

print("交叉验证 F1 得分:", scores)
print("平均 F1 得分:", scores.mean())

输出结果:

交叉验证 F1 得分: [1.         0.96658312 0.93265993 0.96658312 1.        ]
平均 F1 得分: 0.9731652331652332

适用场景

  1. 模型评估:评估模型在数据集上的性能。

  2. 参数调优:结合 GridSearchCV 或 RandomizedSearchCV 进行超参数调优。

  3. 模型选择:比较不同模型或算法的性能。


注意事项

  1. 数据划分

    • 对于分类问题,建议使用分层交叉验证(如 StratifiedKFold),以确保每一折的类别分布与整体数据一致。

    • 对于回归问题,可以使用普通的 K 折交叉验证(如 KFold)。

  2. 评估指标

    • 默认情况下,分类模型使用准确率,回归模型使用 R² 分数。

    • 可以通过 scoring 参数指定其他评估指标(如 'f1''roc_auc''neg_mean_squared_error')。

  3. 计算开销

    • 交叉验证需要多次训练和验证模型,计算开销较大,尤其适用于数据量较小的情况。

5、SMOTE().fit_resample()

SMOTE().fit_resample() 是 Imbalanced-learn 库中用于处理类别不平衡问题的一种方法。SMOTE(Synthetic Minority Oversampling Technique,合成少数类过采样技术)通过生成新的少数类样本来平衡数据集,从而改善模型在少数类上的表现。


SMOTE 的原理

SMOTE 的核心思想是通过插值生成新的少数类样本。具体步骤如下:

  1. 对于每个少数类样本,找到其 k 个最近邻的少数类样本。

  2. 在这些最近邻样本中随机选择一个样本。

  3. 在原始样本和选择的最近邻样本之间生成一个新的样本。

通过这种方式,SMOTE 可以生成多样化的少数类样本,而不仅仅是简单地复制现有样本。


用法

from imblearn.over_sampling import SMOTE

# 初始化 SMOTE 过采样器
smote = SMOTE(random_state=42)

# 对数据集进行过采样
X_resampled, y_resampled = smote.fit_resample(X, y)
参数说明
  1. X:特征数据,形状为 (n_samples, n_features)

  2. y:目标值,形状为 (n_samples,)

返回值

返回过采样后的特征数据和目标值:

  • X_resampled:过采样后的特征数据。

  • y_resampled:过采样后的目标值。


示例

基本用法
from imblearn.over_sampling import SMOTE
from collections import Counter

# 示例数据
X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [0, 0, 0, 1, 1]  # 类别 0 有 3 个样本,类别 1 有 2 个样本

# 初始化 SMOTE 过采样器
smote = SMOTE(random_state=42)

# 对数据集进行过采样
X_resampled, y_resampled = smote.fit_resample(X, y)

print("过采样后的类别分布:", Counter(y_resampled))
print("过采样后的特征数据:")
print(X_resampled)
print("过采样后的目标值:")
print(y_resampled)

输出结果:

过采样后的类别分布: Counter({0: 3, 1: 3})
过采样后的特征数据:
[[1.  2. ]
 [2.  3. ]
 [3.  4. ]
 [4.  5. ]
 [5.  6. ]
 [3.5 4.5]]
过采样后的目标值:
[0 0 0 1 1 1]

解析:

  • 类别 0 有 3 个样本,类别 1 有 2 个样本。

  • SMOTE 生成一个新的少数类样本 [3.5, 4.5],使两个类别的样本数量均为 3。


结合分类模型

以下是一个完整的示例,展示如何使用 SMOTE 处理类别不平衡问题,并训练分类模型:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from imblearn.over_sampling import SMOTE

# 生成不平衡数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10, n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=42)

# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化 SMOTE 过采样器
smote = SMOTE(random_state=42)

# 对训练集进行过采样
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)

# 初始化并训练逻辑回归模型
model = LogisticRegression(max_iter=1000)
model.fit(X_train_resampled, y_train_resampled)

# 预测测试集
y_pred = model.predict(X_test)

# 输出分类报告
print("分类报告:\n", classification_report(y_test, y_pred))

SMOTE 的参数

SMOTE 的常用参数包括:

  1. sampling_strategy:指定过采样的策略。

    • 'auto':默认值,对所有少数类进行过采样。

    • 'minority':仅对少数类进行过采样。

    • float:指定少数类样本的目标比例。

    • dict:指定每个类别的目标样本数量。

  2. k_neighbors:用于生成新样本的最近邻数量,默认为 5。

  3. random_state:随机种子,用于控制随机性。

示例:

smote = SMOTE(sampling_strategy='minority', k_neighbors=3, random_state=42)

适用场景

  1. 类别不平衡问题:当数据集中某些类别的样本数量远少于其他类别时。

  2. 提高少数类识别能力:如欺诈检测、疾病诊断等任务。

  3. 数据增强:通过生成新样本,增加数据集的多样性。


注意事项

  1. 高维数据

    • SMOTE 在高维数据上可能效果不佳,因为高维空间中样本之间的距离变得不显著。

  2. 噪声数据

    • 如果少数类样本中存在噪声,SMOTE 可能会生成不合理的样本。

  3. 计算开销

    • SMOTE 的计算开销较大,尤其适用于大规模数据集。


通过 SMOTE().fit_resample(),用户可以有效地处理类别不平衡问题,并提高模型在少数类上的表现。


http://www.kler.cn/a/464014.html

相关文章:

  • NCCL源码解读3.1:double binary tree双二叉树构建算法,相比ring环算法的优势
  • C语言渗透和好网站
  • CSS系列(45)-- Scope详解
  • B3842 [GESP202306 三级] 春游
  • C++ —— 智能指针
  • SweetAlert2 - 漂亮可定制的 JavaScript 弹窗
  • 租用服务器还是服务器托管:哪种方案更适合您?
  • uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器
  • SD-WAN组网:定义、优势与应用
  • 智能手机多源传感器融合的室内定位方法综述
  • html本地字符串处理工具|去重、分割、求交集、求并集
  • SQL 实战:联合查询与子查询 – 数据比对与关联查询优化
  • PyTorch 中 reciprocal(取倒数)函数的深入解析:分析底层实现CPP代码
  • 人工智能及深度学习的一些题目
  • 机器学习研究方向有哪些创新点
  • vulnhub Empire-Lupin-One靶机
  • 27.循环里赋值了,循环外使用提示变量未赋值 C#例子
  • C++软件设计模式之模板方法模式
  • Lumos学习王佩丰Excel第二十三讲:Excel图表与PPT
  • 数据分析-Excel
  • 大数据面试笔试宝典之Flink面试
  • 内网穿透wordPress的问题
  • 【SpringMVC】拦截器
  • Servlet会话跟踪
  • AI驱动的PDF翻译保留排版格式-PDFMathTranslate
  • Flutter 调试环境下浏览器网络请求跨域问题解决方案