likes
comments
collection
share

如何在 Scikit-Learn 中创建/自定义评分器功能?

作者站长头像
站长
· 阅读数 12

Python 机器学习工具包 Scikit-learn 提供了多种机器学习工具和方法来帮助程序员创建复杂的机器学习模型。Scikit-learn 还提供了一个强大的框架,用于使用各种指标和评分函数来评估这些模型的有效性。为了评估模型的有效性,用户可能需要在特定情况下设计评分函数,Scikit-learn 都可以实现,在本文中我们将介绍如何设计和调整的自己的评分函数。

称为记分器的scikit -learn 函数接受两个参数:基本事实(实际值)和模型的预测值。该函数返回评估预期值准确性的单个分数。Scikit-learn 中提供了准确度、精确度、召回率、F1-score 和其他预定义的评分函数。为了评估其模型的有效性,用户可能希望开发自己独特的评分系统。

用于多类回归问题的自定义评分器

要在 sci-kit-learn 中创建自定义评分器函数,我们需要执行以下步骤:

第 1 步:创建评估准确性的自定义函数

创建一个接受两个参数的 Python 函数:模型的预测值和基本事实(实际值)。该函数应返回评估预期值准确性的单个分数。

这里我定义决定系数 (R 2 )

决定系数 (R²) 是一种统计度量,表示统计模型预测结果的效果。它测量由回归模型中的独立输入变量解释的预测输出中的方差比例。 

如何在 Scikit-Learn 中创建/自定义评分器功能?

RSS = 误差平方和,也称为残差平方和 (RSS),用于衡量回归模型无法解释的变化。它是预测值与实际目标值之间的平方差之和。

如何在 Scikit-Learn 中创建/自定义评分器功能?

TSS = 总平方和 (TSS) 表示因变量的总变异。它是实际值与因变量平均值之间的平方差之和

如何在 Scikit-Learn 中创建/自定义评分器功能?

R² 的值范围为 0 到 1,值越高表示拟合效果越好。值 0 表示回归线根本不拟合数据,而值 1 表示完美拟合。

import numpy as np

def r_squared(y_true, y_pred):
	# 计算真实值的平均值
	mean_y_true = np.mean(y_true)

	# 计算残差平方和和平方和
	ss_res = np.sum((y_true - y_pred) ** 2)
	ss_tot = np.sum((y_true - mean_y_true) ** 2)

	# 计算R²
	r2 = 1 - (ss_res / ss_tot)

	return r2

第2步:创建一个记分器对象:

构建评分函数后,必须使用 sci-kit-learn make_scorer() 函数创建评分器对象。评分函数作为参数传递给 make_scorer() 函数,该函数返回一个记分器对象。

from sklearn.metrics import make_scorer
# 使用 r_squared 函数创建记分器对象
r2_score = make_scorer(r2_squared)
r2_score

输出

make_scorer(r2_squared)

步骤 3:上述定义的记分器对象的实现

创建记分器对象后,我们可以使用 scikit-learn 或其他模型评估工具提供的不同数据集子集的交叉验证函数,使用它来访问机器学习模型的性能

from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score

# 加载 California 房价数据集
X, y = fetch_california_housing(return_X_y=True)

# 创建随机森林回归模型
model = RandomForestRegressor()


# 使用r2_squared函数的交叉验证来评估模型的性能
scores = cross_val_score(model,
						X, y,
						cv=5,
						scoring=r2_score)

# 打印分数的平均值和标准差
print(f"R2 Squared: {scores.mean():.2f} +/- {scores.std():.2f}")

输出

R2 Squared: 0.65 +/- 0.08

用于多类分类问题的自定义评分器

步骤:

  • 导入必要的库 
  • 加载 iris 数据集
  • 使用 make_scorer 定义多个指标,例如 precision_score、 precision_score、recall_score、f1_score。
  • 创建 XGBClassifier 模型
  • 使用交叉验证和自定义评分器评估模型
  • 打印每个指标的平均分数
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.model_selection import cross_validate
from sklearn.datasets import load_iris
from xgboost import XGBClassifier


# 加载 iris 数据集
iris = load_iris()

# 定义多个指标
scoring = {'accuracy': make_scorer(accuracy_score),
		'precision': make_scorer(precision_score, average='macro'),
		'recall': make_scorer(recall_score, average='macro'),
		'f1-score': make_scorer(f1_score, average='macro')
		}

# 创建XGB分类器
clf = XGBClassifier(n_estimators=2,
					max_depth=3,
					learning_rate=0.1)

# 使用交叉验证和自定义记分器评估模型
scores = cross_validate(clf, iris.data, iris.target, cv=5, scoring=scoring)

# 打印每个指标的平均分数
print("准确度平均分:", scores['test_accuracy'].mean())
print("精度平均分:", scores['test_precision'].mean())
print("召回平均得分:", scores['test_recall'].mean())
print("f1得分:", scores['test_f1-score'].mean())

输出

准确度平均分: 0.9666666666666668
精度平均分: 0.9707070707070707
召回平均得分: 0.9666666666666668
f1得分: 0.9664818612187034