时间:2021-05-02
本文讨论了评估模型性能时的数据泄漏问题以及避免数据泄漏的方法。
在模型评估过程中,当训练集的数据进入验证/测试集时,就会发生数据泄漏。这将导致模型对验证/测试集的性能评估存在偏差。让我们用一个使用Scikit-Learn的“波士顿房价”数据集的例子来理解它。数据集没有缺失值,因此随机引入100个缺失值,以便更好地演示数据泄漏。
importnumpyasnp
importpandasaspd
fromsklearn.datasetsimportload_boston
fromsklearn.preprocessingimportStandardScaler
fromsklearn.pipelineimportPipeline
fromsklearn.imputeimportSimpleImputer
fromsklearn.neighborsimportKNeighborsRegressor
fromsklearn.model_selectionimportcross_validate,train_test_split
fromsklearn.metricsimportmean_squared_error
#Importingthedataset
data=pd.DataFrame(load_boston()['data'],columns=load_boston()['feature_names'])
data['target']=load_boston()['target']
#Splittheinputandtargetfeatures
X=data.iloc[:,:-1].copy()
y=data.iloc[:,-1].copy()
#Adding100randommissingvalues
np.random.seed(11)
rand_cols=np.random.randint(0,X.shape[1],100)
rand_rows=np.random.randint(0,X.shape[0],100)
fori,jinzip(rand_rows,rand_cols):
X.iloc[i,j]=np.nan
#Splittingthedataintotrainingandtestsets
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=11)
#InitislizingKNNRegressor
knn=KNeighborsRegressor()
#Initializingmodeimputer
imp=SimpleImputer(strategy='most_frequent')
#InitializingStandardScaler
standard_scaler=StandardScaler()
#ImputingandscalingX_train
X_train_impute=imp.fit_transform(X_train).copy()
X_train_scaled=standard_scaler.fit_transform(X_train_impute).copy()
#Running5-foldcross-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)
#Calculatingmeanofthetrainingscoresofcross-validation
print(f'TrainingRMSE(withdataleakage):{-1*np.mean(cv["train_score"])}')
#Calculatingmeanofthevalidationscoresofcross-validation
print(f'validationRMSE(withdataleakage):{-1*np.mean(cv["test_score"])}')
#fittingthemodeltothetrainingdata
lr.fit(X_train_scaled,y_train)
#preprocessingthetestdata
X_test_impute=imp.transform(X_test).copy()
X_test_scaled=standard_scaler.transform(X_test_impute).copy()
#Predictionsandmodelevaluationonunseendata
pred=lr.predict(X_test_scaled)
print(f'RMSEonunseendata:{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交叉验证的训练和验证部分。这种信息泄漏可能导致模型在验证部分上的性能估计有偏差。下面的代码展示了一种通过使用管道来避免它的方法。
#Preprocessingandregressorpipeline
pipeline=Pipeline(steps=[['imputer',imp],['scaler',standard_scaler],['regressor',knn]])
#Running5-foldcross-validationusingpipelineasestimator
cv=cross_validate(estimator=pipeline,X=X_train,y=y_train,cv=5,scoring="neg_root_mean_squared_error",return_train_score=True)
#Calculatingmeanofthetrainingscoresofcross-validation
print(f'TrainingRMSE(withoutdataleakage):{-1*np.mean(cv["train_score"])}')
#Calculatingmeanofthevalidationscoresofcross-validation
print(f'validationRMSE(withoutdataleakage):{-1*np.mean(cv["test_score"])}')
#fittingthepipelinetothetrainingdata
pipeline.fit(X_train,y_train)
#Predictionsandmodelevaluationonunseendata
pred=pipeline.predict(X_test)
print(f'RMSEonunseendata:{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/
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言简单来说机器学习的核心步骤在于“获取学习数据;选择机器算法;定型模型;评估模型,预测模型结果”,下面本人就以判断日报内容是否合格为例为大家简单的阐述一下C#
传统的机器学习任务从开始到建模的一般流程是:获取数据->数据预处理->训练建模->模型评估->预测,分类。本文我们将依据传统机器学习的流程,看看在每一步流程中都
我们需要评估模型预测值来评估训练的好坏。模型评估是非常重要的,随后的每个模型都有模型评估方式。使用TensorFlow时,需要把模型评估加入到计算图中,然后在模
在文章中,我们将对输入到机器学习模型中的数据集进行预处理。这里我们将对一个硬币数据集进行预处理,以便以后在监督学习模型中进行训练。在机器学习中预处理数据集通常涉
这个问题源于在训练机器学习的一个模型时,使用训练数据时提示prepare的数据中存在np.nan报错信息如下:ValueError:np.nanisaninva