• Kaggle竞赛入门(二):如何验证机器学习模型


    本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的废话,英文有的时候比较啰嗦

    一.什么是模型验证

    模型验证在机器学习当中非常重要,因为有的时候拟合出来的模型误差非常大而自己却不知道,就会造成很大的失误。在kaggle竞赛入门(二)当中,我们利用决策树算法已经拟合出来了一个模型,那么如何去验证这个模型的准确性呢?那就是使用真实值和预测值的差值的绝对值来进行衡量,衡量一个点的误差的代码如下:

    error=actual−predicted

    但是我们的数据集当中有很多的点(数据),该怎么办呢?那就是对每一个点都做这样的减法,然后把所有error都加起来求出平均值,这个方法的简写叫MAE,因为它的英语是:Mean Absolute Error(平均绝对值误差)。为了能够计算MAE,我们首先需要一个模型,我们生成这个模型的代码如下(运用了决策树算法):

    # Data Loading Code Hidden Here
    import pandas as pd
    
    # Load data
    melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
    melbourne_data = pd.read_csv(melbourne_file_path) 
    # Filter rows with missing price values
    filtered_melbourne_data = melbourne_data.dropna(axis=0)
    # Choose target and features
    y = filtered_melbourne_data.Price
    melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                            'YearBuilt', 'Lattitude', 'Longtitude']
    X = filtered_melbourne_data[melbourne_features]
    
    from sklearn.tree import DecisionTreeRegressor
    # Define model
    melbourne_model = DecisionTreeRegressor()
    # Fit model
    melbourne_model.fit(X, y)

    一旦我们建立了这个模型,我们就可以计算它的MAE了,计算MAE的函数是:mean_absolute_value(原始数据集当中的y , 预测之后的y),因此计算它的代码如下:

    from sklearn.metrics import mean_absolute_error
    
    predicted_home_prices = melbourne_model.predict(X)
    mean_absolute_error(y, predicted_home_prices)

    最后输出的结果是:

    434.71594577146544

    二.样本内得分

    刚刚我们进行计算的是样本内得分,也就是利用原始的数据集和预测的值进行比较,而没有将我们的数据集分为训练集和验证集进行测试。现在我们需要将我们的数据集分成两个集合,一个是训练集用来训练模型,一个是验证集,用于衡量我们模型训练后的准确度如何。用sklearn将数据分类的代码如下:

    from sklearn.model_selection import train_test_split
    
    # split data into training and validation data, for both features and target
    # The split is based on a random number generator. Supplying a numeric value to
    # the random_state argument guarantees we get the same split every time we
    # run this script.
    train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
    # Define model
    melbourne_model = DecisionTreeRegressor()
    # Fit model
    melbourne_model.fit(train_X, train_y)
    
    # get predicted prices on validation data
    val_predictions = melbourne_model.predict(val_X)
    print(mean_absolute_error(val_y, val_predictions))

    其中的train_X,train_y表示的是分类后训练集的样本,val_x和val_y表示的是验证集的样本,为什么变量叫开头是val?因为验证集的英语是validation data。我们将数据进行分类的时候完全是随机分配的,没有任何规律的,其中的random_state随机种子为0,也可以为其他数字。最后这一步之后我们用验证集去输出MFA,结果是:

    259556.7211103938

    这个结果和之前我们之前将所有数据当成训练集训练得到的MAE比起来实在是太大了!!!这是为什么呢?因为这说明我们之前所用的决策树算法不太好,或者是给决策树算法选择的特征进行拟合模型时,预测房价所用到的特征没有选择好,比如

    'Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude'这些特征可能不足以来预测房价。
  • 相关阅读:
    用ADO方式连接Excel
    RTX51 tiny系统容易混淆的问题
    学用NHibernate(一)
    Firefox兼容性
    使用WebClient后的Response编码的问题
    学用ASP.NET2.0
    安装CS2.0 Beta2 到SQL2005+Asp.Net2.0下
    AJAXSLT 的bug修正(2)
    Asp.Net开发小技巧
    URL重写,友好的URL
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12636385.html
Copyright © 2020-2023  润新知