如何选择机器学习算法性能指标-续

序言

选择用于评估机器学习算法的指标非常重要。指标的选择会影响机器学习算法性能的衡量方式并比较。它们会影响我们如何权衡不同特征的重要性结果以及选择哪种算法的最终选择。

算法评估指标

针对分类和回归类型的机器学习问题,我们将演示了各种不同的算法评估指标。

  • 对于分类指标,使用皮马印第安人糖尿病发病数据集作为演示。这是一个二元分类问题,其中所有输入变量都是数值的。

  • 对于回归指标,使用波士顿房价数据集作为演示。这是一个回归问题,其中所有输入变量也是数值。

所有方法都评估相同的算法,用于分类的逻辑回归和线性回归问题的回归。使用10倍交叉验证(10-fold cross validation)测试线束来演示每个指标,因为这是我们在使用时最有可能使用的场景不同的算法评估指标。

这些方法中需要注意的是cross_validation.cross_val_score函数用于报告每个配方中的性能。它确实允许使用不同的评分指标这将被讨论,但所有分数都会被报告,以便它们可以按升序排序顺序(分数越高越好)。一些评估指标(如均方误差)自然是降序分数(最小分数最好),因此被cross_validation.cross_val_score()函数报告为负数。

回归指标

我们将回顾用于评估回归机器学习问题预测的3个最常见指标:

  • 平均绝对误差(Mean Absolute Error)

  • 均方误差(Mean Squared Error)

  • R2

案例源码分享

# coding: utf-8
"""
我们将回顾用于评估回归机器学习问题预测的3个最常见指标:
1. 平均绝对误差(Mean Absolute Error,简称MAE)
2. 均方误差(Mean Squared Error,简称MSE)
3. R2(R^2)指标

平均绝对误差(Mean Absolute Error,简称MAE)是一种用于衡量预测模型在连续性数据上的预测精度的指标。
它衡量了预测值与真实值之间的平均绝对差异,表示预测值与真实值之间的平均偏差程度,是回归任务中常用的性能评估指标之一。

均方误差(Mean Squared Error,简称MSE)是指参数估计值与参数真值之差平方的期望值,记为MSE。
MSE是衡量“平均误差”的一种较方便的方法,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

R平方(R2)是线性回归模型的拟合度量。该统计量表示自变量共同解释因变量方差的百分比。
R平方可以方便的用0-100%比例来衡量模型与因变量之间的关系强度。
"""
from pathlib import Path # 用于处理文件路径的库
import pandas as pd # 数据处理和分析库
import numpy as np # 科学计算库,提供高效的数组操作
from sklearn.model_selection import KFold, GridSearchCV, cross_val_score # 分组验证、网格搜索和交叉验证得分
from sklearn.linear_model import LinearRegression, Ridge, Lasso # 线性回归、岭回归和Lasso回归模型
from sklearn.preprocessing import StandardScaler # 数据标准化预处理工具
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score # 评估指标:平均绝对误差、均方误差和R^2得分

def load_and_process_data(filename):
    """
    读取数据,并对数据进行标准化处理。
    
    参数:
    - filename: 数据文件的路径。
    
    返回值:
    - X: 标准化后的特征数据。
    - Y: 目标变量数据。
    """
    try:
        # 从指定文件读取数据,设定列名,并打印数据概要
        column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
        data = pd.read_csv(filename, names=column_names, header=1)  
        print(data.shape, data.describe())
        
        # 删除含有缺失值的行
        data.dropna(inplace=True)  
        
        # 对特征数据进行标准化处理
        scaler = StandardScaler()
        X = scaler.fit_transform(data.iloc[:, :-1])  
        
        # 提取目标变量
        Y = data.iloc[:, -1]  
        
    except Exception as e:
        # 加载或处理数据时出现异常的处理
        print(f"Error loading or processing data: {e}")
        return None, None
    
    return X, Y

def evaluate_model(model, X, Y, kfold, scoring):
    """
    使用交叉验证评估模型的性能。
    
    参数:
    - model: 需要评估的模型。
    - X: 特征数据。
    - Y: 目标变量数据。
    - kfold: 交叉验证的折数。
    - scoring: 评估指标。
    
    返回值:
    - result: 指定评估指标的平均值和标准差。
    """
    try:
        # 使用交叉验证来评估模型,并根据指定的scoring指标计算分数
        results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
        # 返回评估结果的平均值和标准差
        return f"{scoring}: {results.mean()} ({results.std()})"
    except Exception as e:
        # 如果在评估过程中出现异常,则打印错误信息并返回空字符串
        print(f"Error evaluating model: {e}")
        return ""

def tune_model(X, Y, model_class, param_grid, kfold):
    """
    使用网格搜索进行模型参数的调优。
    
    参数:
    - X: 特征数据。
    - Y: 目标变量数据。
    - model_class: 模型类。
    - param_grid: 参数网格。
    - kfold: 交叉验证的折数。
    """
    try:
        # 创建一个GridSearchCV实例,用于在指定的参数网格上进行交叉验证来寻找最佳参数
        model = GridSearchCV(model_class, param_grid, cv=kfold, scoring='neg_mean_absolute_error')
        # 训练模型,自动调整参数以最大化或最小化指定的评分指标
        model.fit(X, Y)
        # 打印最佳参数和对应的评分
        print(f"Best parameters: {model.best_params_}")
        print(f"Best {model.scoring}: {model.best_score_}")
    except Exception as e:
        # 如果在调优过程中出现异常,则打印错误信息
        print(f"Error tuning model: {e}")

if __name__ == "__main__":
    # 加载波士顿房价数据
    filename = Path(__file__).parent / 'data/boston_house_prices.csv'
    X, Y = load_and_process_data(filename)
    
    # 检查数据是否成功加载
    if X is not None and Y is not None:
        # 划分数据集为训练集和测试集
        kfold = KFold(n_splits=10, random_state=7, shuffle=True)

        # 评估不同回归模型的性能
        models = [
            ('LR', LinearRegression()),
            ('Ridge', Ridge()),
            ('Lasso', Lasso())
        ]

        for model_name, model in models:
            print(f"Evaluating {model_name}:")
            # 遍历不同的评分指标来评估模型
            for scoring in ['neg_mean_absolute_error', 'neg_mean_squared_error', 'r2']:
                result = evaluate_model(model, X, Y, kfold, scoring)
                print(result)
            print()

        # 对Lasso模型进行参数调优
        param_grid = {'alpha': np.logspace(-4, 4, 50)}
        tune_model(X, Y, Lasso(), param_grid, kfold)
    else:
        # 如果数据加载或处理失败,则打印错误信息
        print("Data loading or processing failed.")

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值