防止随机森林回归器中数据泄漏的建议

Posted

技术标签:

【中文标题】防止随机森林回归器中数据泄漏的建议【英文标题】:Recommendations for preventing data leakage in Random Forest Regressor 【发布时间】:2019-09-14 20:22:18 【问题描述】:

我目前的准确度和 f1 测量值都为 1.00。我怀疑是数据泄露造成的。

我正在寻找任何技巧以尽可能减少数据泄漏。

谢谢。

下面是我的python脚本:

import pandas as pd  
import numpy as np  
# Other imports here
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
dataset = pd.read_csv("weather.csv")  

print(len(dataset))

dataset = pd.get_dummies(dataset, columns=["Date", "Location", "WindGustDir", "WindDir9am", "WindDir3pm",])

dataset["RainToday"] = dataset["RainToday"].map('Yes': 1, 'No': 0)
dataset["RainTomorrow"] = dataset["RainTomorrow"].map('Yes': 1, 'No': 0)

dataset.dropna(inplace=True)

dataset = dataset.rename_axis(None)

X = dataset.drop('RainTomorrow', axis=1)

y = dataset['RainTomorrow']

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.20, random_state=216037514)

classifier = RandomForestRegressor(n_estimators = 200, random_state = 216037514)
classifier.fit(X_train,y_train)

y_pred = classifier.predict(X_test)

print("Report:\n", classification_report(y_test,y_pred))
print("Accuracy:  ", accuracy_score(y_test,y_pred))

当前结果:

142193
Report:
               precision    recall  f1-score   support

           0       1.00      1.00      1.00      9026
           1       1.00      1.00      1.00      2592

   micro avg       1.00      1.00      1.00     11618
   macro avg       1.00      1.00      1.00     11618
weighted avg       1.00      1.00      1.00     11618

Accuracy:   1.0

【问题讨论】:

你能举一个RainTodayRainTomorrow列的例子吗?有Yes/YesNo/NoYes/NoNo/Yes这4种配置出现了吗? 它是时间序列数据集吗?如果是这样,您的问题在于 train_test_split 部分 【参考方案1】:

数据泄露来源:https://machinelearningmastery.com/data-leakage-machine-learning/

如果不是完全无效的预测模型,数据泄漏可能会导致您创建过于乐观的预测模型。

假设这是一个真实的数据集,1.0 的分类分数是相当不切实际的。因此,这里的数据泄露似乎是一个合理的解释。

以上来源提出了两种防止数据泄露的通用技术:

    在交叉验证折叠中执行数据准备。 保留一个验证数据集,以便对您开发的模型进行最终健全性检查。

这些都是很好的建议。我想添加第三个:

    了解您的数据!

看看数据,想想数据,然后再看一遍。然后换个角度看。如果可能,请在文本编辑器中打开它。打印数据框。绘制数据。尽你所能去感受它。问自己以下问题:

是否存在重复行?您不想重复。它们完全违背了交叉验证和保留集的目的。 是否存在重复列?有些算法不喜欢共线性变量,您不希望目标变量潜入特征变量中。 要素中是否有任何不应该存在的信息?例如,如果您今天预测明天下雨,那么明天应该没有今天不可用的信息。 行不是独立的吗?数据在组内是否具有相关性?如果是,请确保每个组都在测试集或训练集中,但从不在两者中。 Scikit-learn 有这方面的功能,例如GroupKFold。组可以以许多奇怪的方式输入数据集;例如重复测量、更改测量设备/方法、在时间或空间上接近的测量……

一旦您确定数据没问题,请验证您的处理:

随机打乱包含目标变量的列。在处理链中尽早执行此操作(即修改 .csv 文件,或在构建列后立即执行此操作)。确保该列被打乱。

我亲切地称之为垃圾测试。它将数据变成垃圾,这几乎是有意义的。如果模型仍然给出“良好”的结果,请寻找代码或概念中的错误。

【讨论】:

以上是关于防止随机森林回归器中数据泄漏的建议的主要内容,如果未能解决你的问题,请参考以下文章

测量随机森林回归器中每个预测器特征重要性对目标值的影响(量化)(目标值的提升或下降)

随机森林为啥不会过度拟合

随机森林回归严重过拟合单变量数据

随机森林变量重要性排序时的影响为负值怎么办

MATLAB-随机森林实现数据回归分析预测

随机森林