服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 如何在评估机器学习模型时防止数据泄漏

如何在评估机器学习模型时防止数据泄漏

2021-02-22 22:46今日头条deephub 编程技术

本文讨论了评估模型性能时的数据泄漏问题以及避免数据泄漏的方法。

本文讨论了评估模型性能时的数据泄漏问题以及避免数据泄漏的方法。

如何在评估机器学习模型时防止数据泄漏

在模型评估过程中,当训练集的数据进入验证/测试集时,就会发生数据泄漏。这将导致模型对验证/测试集的性能评估存在偏差。让我们用一个使用Scikit-Learn的“波士顿房价”数据集的例子来理解它。数据集没有缺失值,因此随机引入100个缺失值,以便更好地演示数据泄漏。

import numpy as np  

import pandas as pd  

from sklearn.datasets import load_boston  

from sklearn.preprocessing import StandardScaler  

from sklearn.pipeline import Pipeline  

from sklearn.impute import SimpleImputer  

from sklearn.neighbors import KNeighborsRegressor  

from sklearn.model_selection import cross_validate, train_test_split  

from sklearn.metrics import mean_squared_error  

 

#Importing the dataset  

data = pd.DataFrame(load_boston()['data'],columns=load_boston()['feature_names'])  

data['target'] = load_boston()['target']  

 

 

#Split the input and target features  

X = data.iloc[:,:-1].copy()  

y = data.iloc[:,-1].copy()  

 

 

# Adding 100 random missing values  

np.random.seed(11)  

rand_cols = np.random.randint(0,X.shape[1],100)  

rand_rows = np.random.randint(0,X.shape[0],100)  

for i,j in zip(rand_rows,rand_cols):  

X.iloc[i,j] = np.nan  

 

#Splitting the data into training and test sets  

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=11)  

 

#Initislizing KNN Regressor  

knn = KNeighborsRegressor()  

 

#Initializing mode imputer  

imp = SimpleImputer(strategy='most_frequent')  

 

#Initializing StandardScaler  

standard_scaler = StandardScaler()  

 

#Imputing and scaling X_train  

X_train_impute = imp.fit_transform(X_train).copy()  

X_train_scaled = standard_scaler.fit_transform(X_train_impute).copy()  

 

#Running 5-fold cross-validation  

cv = cross_validate(estimator=knn,X=X_train_scaled,y=y_train,cv=5,scoring="neg_root_mean_squared_error",return_train_score=True)  

 

#Calculating mean of the training scores of cross-validation  

print(f'Training RMSE (with data leakage): {-1 * np.mean(cv["train_score"])}')  

 

#Calculating mean of the validation scores of cross-validation  

print(f'validation RMSE (with data leakage): {-1 * np.mean(cv["test_score"])}')  

 

#fitting the model to the training data  

lr.fit(X_train_scaled,y_train)  

 

#preprocessing the test data  

X_test_impute = imp.transform(X_test).copy()  

X_test_scaled = standard_scaler.transform(X_test_impute).copy()  

 

#Predictions and model evaluation on unseen data  

pred = lr.predict(X_test_scaled)  

print(f'RMSE on unseen data: {np.sqrt(mean_squared_error(y_test,pred))}'

如何在评估机器学习模型时防止数据泄漏

在上面的代码中,‘Xtrain’是训练集(k-fold交叉验证),‘Xtest’用于对看不见的数据进行模型评估。上面的代码是一个带有数据泄漏的模型评估示例,其中,用于估算缺失值的模式(strategy= ' mostfrequent ')在' Xtrain '上计算。类似地,用于缩放数据的均值和标准偏差也使用' Xtrain '计算。' Xtrain的缺失值将被输入,' X_train '在k-fold交叉验证之前进行缩放。

在k-fold交叉验证中,' Xtrain '被分割成' k '折叠。在每次k-fold交叉验证迭代中,其中一个折用于验证(我们称其为验证部分),其余的折用于训练(我们称其为训练部分)。每次迭代中的训练和验证部分都有已经使用' Xtrain '计算的模式输入的缺失值。类似地,它们已经使用在' Xtrain '上计算的平均值和标准偏差进行了缩放。这种估算和缩放操作会导致来自' Xtrain '的信息泄露到k-fold交叉验证的训练和验证部分。这种信息泄漏可能导致模型在验证部分上的性能估计有偏差。下面的代码展示了一种通过使用管道来避免它的方法。

#Preprocessing and regressor pipeline  

pipeline = Pipeline(steps=[['imputer',imp],['scaler',standard_scaler],['regressor',knn]])  

 

#Running 5-fold cross-validation using pipeline as estimator  

cv = cross_validate(estimator=pipeline,X=X_train,y=y_train,cv=5,scoring="neg_root_mean_squared_error",return_train_score=True)  

 

#Calculating mean of the training scores of cross-validation  

print(f'Training RMSE (without data leakage): {-1 * np.mean(cv["train_score"])}')  

 

#Calculating mean of the validation scores of cross-validation  

print(f'validation RMSE (without data leakage): {-1 * np.mean(cv["test_score"])}')  

 

#fitting the pipeline to the training data  

pipeline.fit(X_train,y_train)  

 

#Predictions and model evaluation on unseen data  

pred = pipeline.predict(X_test)  

print(f'RMSE on unseen data: {np.sqrt(mean_squared_error(y_test,pred))}'

在上面的代码中,我们已经在管道中包含了输入器、标量和回归器。在本例中,' X_train '被分割为5个折,在每次迭代中,管道使用训练部分计算用于输入训练和验证部分中缺失值的模式。同样,用于衡量训练和验证部分的平均值和标准偏差也在训练部分上计算。这一过程消除了数据泄漏,因为在每次k-fold交叉验证迭代中,都在训练部分计算归责模式和缩放的均值和标准偏差。在每次k-fold交叉验证迭代中,这些值用于计算和扩展训练和验证部分。

我们可以看到在有数据泄漏和没有数据泄漏的情况下计算的训练和验证rmse的差异。由于数据集很小,我们只能看到它们之间的微小差异。在大数据集的情况下,这个差异可能会很大。对于看不见的数据,验证RMSE(带有数据泄漏)接近RMSE只是偶然的。

因此,使用管道进行k-fold交叉验证可以防止数据泄漏,并更好地评估模型在不可见数据上的性能。

原文地址:https://www.toutiao.com/a6931878726347145736/

延伸 · 阅读

精彩推荐
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5972021-03-08
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5232021-06-21