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

Python 防止随机森林回归器数据泄漏的建议,python,pandas,dataframe,scikit-learn,random-forest,Python,Pandas,Dataframe,Scikit Learn,Random Forest,我目前得到的精度和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.me

我目前得到的精度和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
数据泄漏的来源:

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

假设这是一个真实的数据集,分类分数为1.0是不现实的。因此,数据泄漏似乎是一个合理的解释

上述来源建议了两种防止数据泄漏的通用技术:

  • 在交叉验证范围内执行数据准备
  • 保留验证数据集,以便对开发的模型进行最终的健全性检查
  • 这些都是很好的建议。我想补充第三点:

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

    • 是否有重复的行?您不需要重复的行。他们完全违背了交叉验证的目的,坚持了一套
    • 是否存在重复列?有些算法不喜欢共线变量,您不希望目标变量潜入特征变量
    • 功能中是否有任何不应该出现的信息?例如,如果今天预测明天下雨,那么今天就不应该有明天不可用的信息
    • 行是否不独立?
    • 数据在组内是否存在相关性?如果是,请确保每组都在测试集中或列车集中,但决不能同时在两个集中。Scikit learn具有这样的功能,例如。组可以以许多奇怪的方式进入数据集;例如重复测量、改变测量设备/方法、在时间或空间上接近的测量等
    一旦确定数据正常,请验证您的处理:

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

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

    您能否给出列
    RainToday
    RainToday
    的示例?是否显示了4种配置
    Yes/Yes
    No/No
    Yes/No
    No/Yes
    ?是否为时间序列数据集?如果是这样,您的问题在于列车测试分割部分