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

标签 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.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

最佳答案

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

Data leakage can cause you to create overly optimistic if not completely invalid predictive models.

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

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

  1. Perform data preparation within your cross validation folds.
  2. Hold back a validation dataset for final sanity check of your developed models.

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

  • 了解您的数据!
  • 查看数据,思考数据,然后再查看。然后从不同的角度看。如果可能,请在文本编辑器中打开它。打印数据框。绘制数据。做任何你能想到的事情来感受它。问自己以下问题:

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

    一旦确定数据正常,请验证您的处理:

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

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

    关于python - 防止随机森林回归器中数据泄漏的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55848653/

    相关文章:

    python - (Python/JSON/MySQL) 关于 JSON 格式的财务数据不会传输到数据库的建议

    python - 取消 pandas 数据框中的字典

    python - 错误 : float object has no attribute notnull

    python - Pandas:合并数据帧并仅保留与合并的唯一对关联的最小值

    python - Pandas :转换列的类型

    python - 为什么异常/错误在 python 中评估为 True?

    python - Scrapy-splash response.css() 获取不到元素

    python - Pandas 群体内的变量转移

    python selenium - 找不到元素时会花费很多时间

    python - 使用 read_pickle 将 json_pickle(d) 推文读取到数据帧时发生 KeyError