Kaggle学习笔记--Cross-Validation

简介

如何使用交叉验证来更好地度量模型性能。

机器学习是一个反复的过程。您将面临选择使用哪些预测变量,使用哪种类型的模型,向这些模型提供哪些参数的选择。到目前为止,您已经通过data-driven way数据驱动的方式通过验证模型质量来做出这些选择(或释义)。但是这种方法有一些缺点。通常,模型将保留约20%的数据或1000行作为验证数据集。但这在确定模型分数方面留下了一些随机的机会。使得模型的效果无法预料。通常,验证集validation set越大,我们的模型质量度量中的随机性(即“噪声”)就越少,并且可靠性也就越高。但只能通过从训练数据中删除行来获得较大的验证集,而较小的训练数据集意味着较差的模型!

什么是交叉验证?

在交叉验证中,我们对数据的不同子集运行建模过程,以获取模型质量的多种度量。例如,我们可以将数据分为5个部分,每个部分占整个数据集的20%。在这种情况下,将数据分为5个“folds”:
大概是这样:
[验证集][-----------训练集----------------------]
-----------][验证集][-----------训练集-----------
----------------------][验证集][-----------训练集
--------训练集---------------][验证集][----------
[----------------训练集-----------------][验证集]

什么时候应该使用交叉验证?

1.要做出很多建模决策:交叉验证可以更准确地衡量模型质量。但是,交叉验证会使得运行时间变更长
对于模型运行的时间只需要几分钟的那种较小的数据集,不需要考虑太多的计算负担,则应运行交叉验证。
2.对于较大的数据集,单个验证集就足够了。
3.另外,您可以运行交叉验证,看看每个实验的分数是否接近。如果每个实验产生相同的结果,则单个验证集可能就足够了。

数据准备

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the data
train_data = pd.read_csv('.../train.csv', index_col='Id')
test_data = pd.read_csv('.../test.csv', index_col='Id')

# Remove rows with missing target, separate target from predictors
train_data.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = train_data.SalePrice
train_data.drop(['SalePrice'], axis=1, inplace=True)

# Select numeric columns only
numeric_cols = [cname for cname in train_data.columns if train_data[cname].dtype in ['int64', 'float64']]
X = train_data[numeric_cols].copy()
X_test = test_data[numeric_cols].copy()

步骤1.构造函数

使用scikit-learn构建管道。

创建管道并使用SimpleImputer()替换数据中的缺失值 ;使用RandomForestRegressor()训练随机森林模型进行预测。设置随机森林模型中树木数量的参数 n_estimators为50,并设置random_state确保可重复性。

from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

my_pipeline = Pipeline(steps=[
    ('preprocessor', SimpleImputer()),
    ('model', RandomForestRegressor(n_estimators=50, random_state=0))
])

使用scikit-learn中的cross_val_score()函数获取交叉验证分数。 其中cv参数用来设置folds数量。使用cross_val_score()函数来获取平均绝对误差(MAE),该平均误差在五个不同的folds中平均。使用cv参数设置了folds。

from sklearn.model_selection import cross_val_score
# Multiply by -1 since sklearn calculates *negative* MAE
scores = -1 * cross_val_score(my_pipeline, X, y,
                              cv=5,
                              scoring='neg_mean_absolute_error')
print("Average MAE score:", scores.mean())

Average MAE score: 18276.410356164386

写一个函数——‘使用交叉验证为机器学习模型选择参数’

在本练习中,您将使用交叉验证为机器学习模型选择参数。
首先编写函数get_score(),如下:
-使用X和Y中的数据以创建folts,
-SimpleImputer()(默认保留所有参数)以替换缺少的值,以及
-RandomForestRegressor()(带有random_state = 0)以适应随机森林模型。
设置随机森林模型中树木的数量时,将使用提供给get_score()的n_estimators参数。

def get_score(n_estimators):
    my_pipeline = Pipeline(steps=[
        ('preprocessor', SimpleImputer()),
        ('model', RandomForestRegressor(n_estimators, random_state=0))
    ])
    scores = -1 * cross_val_score(my_pipeline, X, y,
                                  cv=3,
                                  scoring='neg_mean_absolute_error')
    return scores.mean()

步骤2:测试不同参数的值

使用在步骤1中定义的函数来评估模型性能,这些性能与随机森林中树数的八个不同值相对应:50、100、150,…,300、350、400。将结果存储在Python字典“result”中,其中“result[i]”是“ get_scores(i)”返回的平均MAE。’’’

#results ={{i:get_score(i) for i in range(50,50,400)}}# Your code here  TypeError: unhashable type: 'dict'
results={}
for i in range(50,450,50):
    results[i] = get_score(i)

步骤3:获得最小值–最佳模型

'''使用matplotlib来展现训练结果【%matplotlib仅在Ipython中可直接调用,pycharm 中无法实现】
import matplotlib.pyplot as plt
%matplotlib
plt.plot(results.keys(), results.values())
plt.show()'''
#获得最小值--最佳模型
low=results[50]
for i in results.keys():
    print("the  %d : %f \n"%(i,results[i]))
    if(results[i]<low):
        low=results[i]
print("the low is %f :\n"%low)

the 50 : 18353.839351
the 100 : 18395.215168
the 150 : 18288.730021
the 200 : 18248.345890
the 250 : 18255.269222
the 300 : 18275.241923
the 350 : 18270.291833
the 400 : 18270.197974
the low is 18248.345890

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值