本文讨论了评估模型性能时的数据泄漏问题以及避免数据泄漏的方法。
本文评论了评价模型功能时的数据走漏问题以及避免数据走漏的办法。
在模型评价进程中,当练习集的数据进入验证/测验集时,就会产生数据走漏。这将导致模型对验证/测验集的功能评价存在误差。让咱们用一个运用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穿插验证能够避免数据走漏,并更好地评价模型在不行见数据上的功能。
知优网 » 如安在评价机器学习模型时避免数据走漏