序言
选择用于评估机器学习算法的指标非常重要。指标的选择会影响机器学习算法性能的衡量方式并比较。它们会影响我们如何权衡不同特征的重要性结果以及选择哪种算法的最终选择。
算法评估指标
针对分类和回归类型的机器学习问题,我们将演示了各种不同的算法评估指标。
-
对于分类指标,使用皮马印第安人糖尿病发病数据集作为演示。这是一个二元分类问题,其中所有输入变量都是数值的。
-
对于回归指标,使用波士顿房价数据集作为演示。这是一个回归问题,其中所有输入变量也是数值。
所有方法都评估相同的算法,用于分类的逻辑回归和线性回归问题的回归。使用10倍交叉验证(10-fold cross validation)测试线束来演示每个指标,因为这是我们在使用时最有可能使用的场景不同的算法评估指标。
这些方法中需要注意的是cross_validation.cross_val_score函数用于报告每个配方中的性能。它确实允许使用不同的评分指标这将被讨论,但所有分数都会被报告,以便它们可以按升序排序顺序(分数越高越好)。一些评估指标(如均方误差)自然是降序分数(最小分数最好),因此被cross_validation.cross_val_score()函数报告为负数。
分类指标
分类问题可能是最常见的机器学习问题类型,因此,有无数的指标可用于评估这些问题的预测。
我们将回顾如何使用以下指标:
-
分类准确性(Classification Accuracy)
-
对数损失(Logarithmic Loss)
-
ROC曲线下面积(ROC Curve)
-
混淆矩阵(Confusion Matrix)
-
分类报告(Classification Report)
案例源码分享
# coding: utf-8
"""
此脚本演示了如何使用多种分类指标来评估机器学习模型的性能。
针对皮马印第安人糖尿病数据集,使用逻辑回归模型,并通过交叉验证来计算以下指标:
1. 分类精度(Classification Accuracy)
2. 对数损失(Logarithmic Loss)
3. ROC曲线下面积(ROC Curve)
4. 混淆矩阵(Confusion Matrix)
5. 分类报告(Classification Report)
"""
from pathlib import Path #导入了Path类,用于处理文件路径。
import pandas as pd #导入了pandas库,用于数据处理和分析,其中pd是pandas的别名。
import matplotlib.pyplot as plt #导入了matplotlib库的pyplot模块,用于数据可视化,其中plt是pyplot的别名。plt.rcParams['figure.figsize'] = (3, 3) 设置了默认的图形大小为3x3英寸。
from sklearn.model_selection import KFold, cross_val_score, train_test_split #导入了scikit-learn库的模型选择模块,包括KFold交叉验证、交叉验证得分和训练集/测试集划分功能。
from sklearn.linear_model import LogisticRegression #导入了scikit-learn库的线性模型模块中的逻辑回归模型。
from sklearn.metrics import confusion_matrix, classification_report #导入了scikit-learn库的评估模块,包括混淆矩阵和分类报告功能
# 读取并处理数据
filename = Path(__file__).parent / 'data/pima-indians-diabetes.csv'
data = pd.read_csv(filename)
# 修改列名
column_names = {'Pregnancies': 'pregnant_times',
'Glucose': 'glucose',
'BloodPressure': 'blood_pressure',
'SkinThickness': 'skin_thickness',
'Insulin': 'insulin',
'BMI': 'BMI',
'DiabetesPedigreeFunction': 'DPF',
'Age': 'age',
'Outcome': 'outcome'}
data.rename(columns=column_names, inplace=True)
# 转换为数组
array = data.values
# 将数据拆分为输入和输出组件
X = array[:, 0:8]
Y = array[:, 8]
###### 分类精度(Classification Accuracy)######
"""
使用交叉验证来计算模型的分类准确性。
首先,通过KFold函数创建了一个交叉验证器kflod,它将数据集分为10个互不重叠的子集(n_splits=10),每次使用其中的9个子集进行训练,剩下的1个子集进行测试。
并且random_state=7确保了结果的可复现性,shuffle=True表示在划分子集之前会随机打乱数据集。
然后,通过LogisticRegression函数创建了一个逻辑回归模型model,其中random_state=0确保了结果的可复现性,max_iter=1000设置了最大迭代次数为1000。
scoring='accuracy'定义了评估模型性能的指标为准确率。
cross_val_score函数使用kflod交叉验证器和model模型,在数据集(X和Y)上进行交叉验证,并返回每个子集的评估分数。results存储了这些分数。
最后,通过print函数打印出了交叉验证的平均准确率和标准差。results.mean()表示所有子集评估分数的平均值,results.std()表示所有子集评估分数的标准差。打印的结果格式为"Classification Accuracy: xx.xx%",其中xx.xx为平均准确率和标准差的值。
"""
kflod = KFold(n_splits=10, random_state=7, shuffle=True)
model = LogisticRegression(random_state=0, max_iter=1000)
scoring='accuracy'
results = cross_val_score(model, X, Y, cv=kflod, scoring=scoring)
print("Classification Accuracy: %.3f%% (%.3f%%)" % (results.mean() * 100, results.std() * 100))
###### 对数损失(Logarithmic Loss)######
"""
使用交叉验证来计算模型的对数损失。
KFold(n_splits=10, random_state=7, shuffle=True) 定义了一个10折交叉验证器,随机状态设为7,并且在分折之前打乱数据。
LogisticRegression(random_state=0, max_iter=1000) 定义了一个逻辑回归模型,随机状态设为0,最大迭代次数设为1000。
scoring='neg_log_loss' 指定了评估模型的指标为负对数损失(交叉验证将使用该指标来评估每个折叠的模型)。
cross_val_score(model, X, Y, cv=kflod, scoring=scoring) 使用前面定义的交叉验证器、模型、特征集 X 和标签集 Y 来执行交叉验证,并根据负对数损失来评估模型。
最后,代码打印出了交叉验证得到的平均负对数损失和标准差。
简而言之,这段代码用于评估逻辑回归模型在给定数据集上的平均负对数损失,并提供该损失的标准差。
"""
kflod = KFold(n_splits=10, random_state=7, shuffle=True)
model = LogisticRegression(random_state=0, max_iter=1000)
scoring='neg_log_loss'
results = cross_val_score(model, X, Y, cv=kflod, scoring=scoring)
print("Logarithmic Loss: %.3f%% (%.3f%%)" % (results.mean() * 100, results.std() * 100))
###### ROC曲线下面积(ROC Curve)######
"""
使用交叉验证来计算模型的ROC曲线下面积。
首先,通过KFold函数将数据集划分为10个互不重叠的子集(fold),其中random_state=7确保划分结果的可复现性,shuffle=True表示在划分前会先对数据集进行随机打乱。
然后,创建一个逻辑回归模型LogisticRegression,通过random_state=0和max_iter=1000来确保模型训练的可复现性和最大迭代次数。
接着,使用cross_val_score函数来进行交叉验证。该函数会根据cv=kflod参数使用之前定义的10折交叉验证方法,根据scoring=scoring参数使用ROC AUC作为评估指标,对模型在不同子集上的性能进行评估。其中,X和Y分别表示特征矩阵和标签向量。
最后,将评估结果的平均值和标准差打印出来。results.mean() * 100表示平均性能,results.std() * 100表示性能的标准差。输出的格式为"ROC Curve: %.3f%% (%.3f%%)",即"ROC曲线: 平均性能% (标准差%)"。
"""
kflod = KFold(n_splits=10, random_state=7, shuffle=True)
model = LogisticRegression(random_state=0, max_iter=1000)
scoring='roc_auc'
results = cross_val_score(model, X, Y, cv=kflod, scoring=scoring)
print("ROC Curve: %.3f%% (%.3f%%)" % (results.mean() * 100, results.std() * 100))
###### 混淆矩阵(Confusion Matrix)######
"""
计算并打印模型的混淆矩阵。
将数据集(假设为X和Y)划分为训练集和测试集,其中测试集占总数据集的33%(test_size=0.33),划分过程中使用的随机种子为7(seed=7)。
使用逻辑回归模型(LogisticRegression)拟合训练集数据,其中模型的随机种子设置为0,最大迭代次数设置为1000。
对测试集数据进行预测,得到预测结果。
使用预测结果和真实标签(假设为Y_test)构建混淆矩阵(confusion_matrix),并打印输出。
混淆矩阵是一个用于评估模型性能的工具,它能够显示模型在不同类别上的表现,帮助分析模型的正确率、误判率等指标。
"""
test_size, seed = 0.33, 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression(random_state=0, max_iter=1000).fit(X_train, Y_train)
predictions = model.predict(X_test)
matrix = confusion_matrix(Y_test, predictions)
print(matrix)
###### 分类报告(Classification Report)######
"""
计算并打印模型的分类报告,包括精度、召回率、F1分数和支持度。
首先,通过train_test_split函数将数据集X和标签集Y划分为训练集和测试集,其中测试集占总数据集的33%,随机种子为7。
然后,使用LogisticRegression算法创建一个分类器,并使用训练集进行拟合。
接着,使用测试集对模型进行预测,并打印出预测结果及其长度。
最后,使用classification_report函数生成并打印出模型的分类报告,包括精度、召回率、F1分数等指标。
"""
test_size, seed = 0.33, 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression(random_state=0, max_iter=1000).fit(X_train, Y_train)
predictions = model.predict(X_test)
print('predictions\n', predictions, len(predictions))
print('Y_test\n', Y_test, len(Y_test))
report = classification_report(Y_test, predictions)
print(report)
# 输出(略)